This commit is contained in:
gingerBill
2021-12-09 15:36:12 +00:00
5 changed files with 104 additions and 51 deletions
+12 -2
View File
@@ -2,13 +2,15 @@ package runtime
import "core:intrinsics"
@(private="file")
IS_WASM :: ODIN_ARCH == "wasm32" || ODIN_ARCH == "wasm64"
@(private)
RUNTIME_LINKAGE :: "strong" when (
(ODIN_USE_SEPARATE_MODULES ||
ODIN_BUILD_MODE == "dynamic" ||
!ODIN_NO_CRT) &&
!(ODIN_ARCH == "wasm32" ||
ODIN_ARCH == "wasm64")) else "internal"
!IS_WASM) else "internal"
RUNTIME_REQUIRE :: true
@@ -752,6 +754,9 @@ extendhfsf2 :: proc "c" (value: u16) -> f32 {
@(link_name="__floattidf", linkage=RUNTIME_LINKAGE, require=RUNTIME_REQUIRE)
floattidf :: proc "c" (a: i128) -> f64 {
when IS_WASM {
return 0
} else {
DBL_MANT_DIG :: 53
if a == 0 {
return 0.0
@@ -791,10 +796,14 @@ floattidf :: proc "c" (a: i128) -> f64 {
fb[0] = u32(a) // mantissa-low
return transmute(f64)fb
}
}
@(link_name="__floattidf_unsigned", linkage=RUNTIME_LINKAGE, require=RUNTIME_REQUIRE)
floattidf_unsigned :: proc "c" (a: u128) -> f64 {
when IS_WASM {
return 0
} else {
DBL_MANT_DIG :: 53
if a == 0 {
return 0.0
@@ -832,6 +841,7 @@ floattidf_unsigned :: proc "c" (a: u128) -> f64 {
fb[0] = u32(a) // mantissa-low
return transmute(f64)fb
}
}
+29 -12
View File
@@ -1,23 +1,40 @@
//+build wasm32
package runtime
@(private="file")
ti_int :: struct #raw_union {
using s: struct { lo, hi: u64 },
all: i128,
}
@(link_name="__ashlti3", linkage="strong")
__ashlti3 :: proc "c" (a: i64, b_: i32) -> i64 {
/*
__ashlti3 :: proc "c" (a: i128, b_: u32) -> i128 {
bits_in_dword :: size_of(u32)*8
b := u32(b_)
input := transmute([2]i32)a
result: [2]i32
if b & 32 != 0 {
result[0] = 0
result[1] = input[0] << (b - 32)
input, result: ti_int
input.all = a
if b & bits_in_dword != 0 {
result.lo = 0
result.hi = input.lo << (b-bits_in_dword)
} else {
if b == 0 {
return a
}
result[0] = input[0]<<b
result[1] = (input[1]<<b) | (input[0]>>(32-b))
result.lo = input.lo<<b
result.hi = (input.hi<<b) | (input.lo>>(bits_in_dword-b))
}
return transmute(i64)result
*/
return 0
return result.all
}
@(link_name="__multi3", linkage="strong")
__multi3 :: proc "c" (a, b: i128) -> i128 {
x, y, r: ti_int
x.all = a
y.all = b
r.all = i128(x.lo * y.lo) // TODO this is incorrect
r.hi += x.hi*y.lo + x.lo*y.hi
return r.all
}