aboutsummaryrefslogtreecommitdiff
path: root/core/runtime/internal_linux.odin
diff options
context:
space:
mode:
authorgingerBill <bill@gingerbill.org>2021-04-14 20:45:05 +0100
committergingerBill <bill@gingerbill.org>2021-04-14 20:45:05 +0100
commite19958152a7949860d77ebb53c4dd17c862fa893 (patch)
tree91dbfc6219ffdee4d54236d7280410c8477c9091 /core/runtime/internal_linux.odin
parent05a181d719c57b6be73ab5cd726c2d418a8a9026 (diff)
Fix `floattidf`
Diffstat (limited to 'core/runtime/internal_linux.odin')
-rw-r--r--core/runtime/internal_linux.odin14
1 files changed, 7 insertions, 7 deletions
diff --git a/core/runtime/internal_linux.odin b/core/runtime/internal_linux.odin
index 241ed0fdf..aecd7f601 100644
--- a/core/runtime/internal_linux.odin
+++ b/core/runtime/internal_linux.odin
@@ -103,7 +103,7 @@ floattidf :: proc(a: i128) -> f64 {
s := a >> (N-1);
a = (a ~ s) - s;
sd: = N - _clz_i128(a); // number of significant digits
- e := u32(sd - 1); // exponent
+ e := u32(sd - 1); // exponent
if sd > DBL_MANT_DIG {
switch sd {
case DBL_MANT_DIG + 1:
@@ -115,8 +115,8 @@ floattidf :: proc(a: i128) -> f64 {
i128(u128(a) & (~u128(0) >> u128(N + DBL_MANT_DIG+2 - sd)) != 0);
};
- a |= i128((a & 4) != 0);
- a += 1;
+ a |= i128((a & 4) != 0);
+ a += 1;
a >>= 2;
if a & (1 << DBL_MANT_DIG) != 0 {
@@ -127,9 +127,9 @@ floattidf :: proc(a: i128) -> f64 {
a <<= u128(DBL_MANT_DIG - sd);
}
fb: [2]u32;
- fb[1] = (u32(s) & 0x80000000) | // sign
- ((e + 1023) << 20) | // exponent
- ((u32(a) >> 32) & 0x000FFFFF); // mantissa-high
- fb[1] = u32(a); // mantissa-low
+ 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;
}