diff options
| author | gingerBill <bill@gingerbill.org> | 2021-09-25 15:38:56 +0100 |
|---|---|---|
| committer | gingerBill <bill@gingerbill.org> | 2021-09-25 15:38:56 +0100 |
| commit | fa0d58f96ea0d576cf4adbd77480cfd4ce0510c4 (patch) | |
| tree | 6dcb43d5498b94bbacf647672d42dc24fb27787a | |
| parent | ebc09d5e4ee956e2ffa7e18f9f0c57af6433c64b (diff) | |
Correct f64 -> u128/i128 generation
| -rw-r--r-- | core/runtime/internal.odin | 14 | ||||
| -rw-r--r-- | src/checker.cpp | 2 | ||||
| -rw-r--r-- | src/llvm_backend_expr.cpp | 2 | ||||
| -rw-r--r-- | src/types.cpp | 2 |
4 files changed, 19 insertions, 1 deletions
diff --git a/core/runtime/internal.odin b/core/runtime/internal.odin index 139d8d666..b7b5850cb 100644 --- a/core/runtime/internal.odin +++ b/core/runtime/internal.odin @@ -763,3 +763,17 @@ floattidf_unsigned :: proc(a: u128) -> f64 { fb[1] = u32(a) // mantissa-low return transmute(f64)fb } + + + +@(link_name="__fixunsdfti") +fixunsdfti :: proc(a: f64) -> u128 { + x := u64(a) + return u128(x) +} + +@(link_name="__fixunsdfdi") +fixunsdfdi :: proc(a: f64) -> i128 { + x := i64(a) + return i128(x) +} diff --git a/src/checker.cpp b/src/checker.cpp index 8d85784fa..fd3de3552 100644 --- a/src/checker.cpp +++ b/src/checker.cpp @@ -1980,6 +1980,8 @@ void generate_minimum_dependency_set(Checker *c, Entity *start) { str_lit("modti3"), str_lit("divti3"), str_lit("fixdfti"), + str_lit("fixunsdfti"), + str_lit("fixunsdfdi"), str_lit("floattidf"), str_lit("floattidf_unsigned"), str_lit("truncsfhf2"), diff --git a/src/llvm_backend_expr.cpp b/src/llvm_backend_expr.cpp index b2ef6d0d0..0f05e9b45 100644 --- a/src/llvm_backend_expr.cpp +++ b/src/llvm_backend_expr.cpp @@ -1194,7 +1194,7 @@ lbValue lb_emit_conv(lbProcedure *p, lbValue value, Type *t) { res = lb_emit_conv(p, value, platform_src_type); res = lb_emit_conv(p, res, platform_dst_type); if (is_type_different_to_arch_endianness(dst)) { - res = lb_emit_byte_swap(p, res, t); + res = lb_emit_byte_swap(p, res, platform_dst_type); } return lb_emit_conv(p, res, t); } diff --git a/src/types.cpp b/src/types.cpp index 568516007..97552240f 100644 --- a/src/types.cpp +++ b/src/types.cpp @@ -1518,6 +1518,7 @@ Type *integer_endian_type_to_platform_type(Type *t) { case Basic_u32le: return t_u32; case Basic_i64le: return t_i64; case Basic_u64le: return t_u64; + case Basic_i128le: return t_i128; case Basic_u128le: return t_u128; case Basic_i16be: return t_i16; @@ -1526,6 +1527,7 @@ Type *integer_endian_type_to_platform_type(Type *t) { case Basic_u32be: return t_u32; case Basic_i64be: return t_i64; case Basic_u64be: return t_u64; + case Basic_i128be: return t_i128; case Basic_u128be: return t_u128; case Basic_f16le: return t_f16; |