diff options
| author | gingerBill <bill@gingerbill.org> | 2021-06-06 12:35:38 +0100 |
|---|---|---|
| committer | gingerBill <bill@gingerbill.org> | 2021-06-06 12:35:38 +0100 |
| commit | 785c27daa7a84734c29dbbbb35d084dcdd8752f2 (patch) | |
| tree | f558557d79a59d1ad012d6226df7d62fcf52862b /core/runtime/internal_linux.odin | |
| parent | 795a5910cf237b5ba6c5adcb33109b1e40a17976 (diff) | |
Fix 128-bit integer to float cast by explicitly calling the procedure direct; Fix #781
Diffstat (limited to 'core/runtime/internal_linux.odin')
| -rw-r--r-- | core/runtime/internal_linux.odin | 42 |
1 files changed, 0 insertions, 42 deletions
diff --git a/core/runtime/internal_linux.odin b/core/runtime/internal_linux.odin index 19b52a42a..ad46f55e8 100644 --- a/core/runtime/internal_linux.odin +++ b/core/runtime/internal_linux.odin @@ -87,45 +87,3 @@ fixdfti :: proc(a: u64) -> i128 { } } - -@(link_name="__floattidf") -floattidf :: proc(a: i128) -> f64 { - DBL_MANT_DIG :: 53; - if a == 0 { - return 0.0; - } - a := a; - N :: size_of(i128) * 8; - s := a >> (N-1); - a = (a ~ s) - s; - sd: = N - intrinsics.count_leading_zeros(a); // number of significant digits - e := u32(sd - 1); // exponent - if sd > DBL_MANT_DIG { - switch sd { - case DBL_MANT_DIG + 1: - a <<= 1; - case DBL_MANT_DIG + 2: - // okay - case: - a = i128(u128(a) >> u128(sd - (DBL_MANT_DIG+2))) | - i128(u128(a) & (~u128(0) >> u128(N + DBL_MANT_DIG+2 - sd)) != 0); - }; - - a |= i128((a & 4) != 0); - a += 1; - a >>= 2; - - if a & (1 << DBL_MANT_DIG) != 0 { - a >>= 1; - e += 1; - } - } else { - a <<= u128(DBL_MANT_DIG - sd); - } - fb: [2]u32; - fb[1] = (u32(s) & 0x80000000) | // sign - ((e + 1023) << 20) | // exponent - u32((u64(a) >> 32) & 0x000FFFFF); // mantissa-high - fb[1] = u32(a); // mantissa-low - return transmute(f64)fb; -} |