authorgravatar for kcbanner@gmail.comCasey Banner <kcbanner@gmail.com> 2022-12-13 23:22:50-05:00
committergravatar for kcbanner@gmail.comCasey Banner <kcbanner@gmail.com> 2023-01-01 16:44:28-05:00
logfbd3459a520f28d32e45a0f8d472a2d0b471e36e
tree4e3c98b55ffe96c56696518ef598b9b0041f85db
parent9a77743cc71008d7186614212e542eb2d930af57

compiler_rt: fixup divti3 and fixunshfti


3 files changed, 17 insertions(+), 32 deletions(-)

lib/compiler_rt/divti3.zig+3-16
...@@ -7,21 +7,8 @@ const common = @import("common.zig");...@@ -7,21 +7,8 @@ const common = @import("common.zig");
7pub const panic = common.panic;7pub const panic = common.panic;
88
9comptime {9comptime {
10 if (builtin.os.tag == .windows) {10 if (common.want_windows_v2u64_abi) {
11 switch (arch) {11 @export(__divti3_windows_x86_64, .{ .name = "__divti3", .linkage = common.linkage, .visibility = common.visibility });
12 .x86 => {
13 @export(__divti3, .{ .name = "__divti3", .linkage = common.linkage, .visibility = common.visibility });
14 },
15 .x86_64 => {
16 // The "ti" functions must use Vector(2, u64) parameter types to adhere to the ABI
17 // that LLVM expects compiler-rt to have.
18 @export(__divti3_windows_x86_64, .{ .name = "__divti3", .linkage = common.linkage, .visibility = common.visibility });
19 },
20 else => {},
21 }
22 if (arch.isAARCH64()) {
23 @export(__divti3, .{ .name = "__divti3", .linkage = common.linkage, .visibility = common.visibility });
24 }
25 } else {12 } else {
26 @export(__divti3, .{ .name = "__divti3", .linkage = common.linkage, .visibility = common.visibility });13 @export(__divti3, .{ .name = "__divti3", .linkage = common.linkage, .visibility = common.visibility });
27 }14 }
...@@ -31,7 +18,7 @@ pub fn __divti3(a: i128, b: i128) callconv(.C) i128 {...@@ -31,7 +18,7 @@ pub fn __divti3(a: i128, b: i128) callconv(.C) i128 {
31 return div(a, b);18 return div(a, b);
32}19}
3320
34const v128 = @import("std").meta.Vector(2, u64);21const v128 = @Vector(2, u64);
3522
36fn __divti3_windows_x86_64(a: v128, b: v128) callconv(.C) v128 {23fn __divti3_windows_x86_64(a: v128, b: v128) callconv(.C) v128 {
37 return @bitCast(v128, div(@bitCast(i128, a), @bitCast(i128, b)));24 return @bitCast(v128, div(@bitCast(i128, a), @bitCast(i128, b)));
lib/compiler_rt/fixunshfti.zig+1-1
...@@ -16,7 +16,7 @@ pub fn __fixunshfti(a: f16) callconv(.C) u128 {...@@ -16,7 +16,7 @@ pub fn __fixunshfti(a: f16) callconv(.C) u128 {
16 return floatToInt(u128, a);16 return floatToInt(u128, a);
17}17}
1818
19const v2u64 = @import("std").meta.Vector(2, u64);19const v2u64 = @Vector(2, u64);
2020
21fn __fixunshfti_windows_x86_64(a: f16) callconv(.C) v2u64 {21fn __fixunshfti_windows_x86_64(a: f16) callconv(.C) v2u64 {
22 return @bitCast(v2u64, floatToInt(u128, a));22 return @bitCast(v2u64, floatToInt(u128, a));
lib/zig.h+13-15
...@@ -1341,30 +1341,26 @@ static inline zig_i128 zig_sub_i128(zig_i128 lhs, zig_i128 rhs) {...@@ -1341,30 +1341,26 @@ static inline zig_i128 zig_sub_i128(zig_i128 lhs, zig_i128 rhs) {
1341 return res;1341 return res;
1342}1342}
13431343
1344// TODO: Implement1344zig_extern zig_u128 __udivti3(zig_u128 lhs, zig_u128 rhs);
1345static zig_i128 zig_div_trunc_i128(zig_i128 lhs, zig_i128 rhs) {
1346
1347}
1348
1349// TODO: Implement
1350zig_extern zig_u128 __udivmodti4(zig_u128 lhs, zig_u128 rhs, zig_u128* rem);
1351static zig_u128 zig_div_trunc_u128(zig_u128 lhs, zig_u128 rhs) {1345static zig_u128 zig_div_trunc_u128(zig_u128 lhs, zig_u128 rhs) {
1352 zig_u128 rem;1346 return __udivti3(lhs, rhs);
1353 return __udivmodti4(lhs, rhs, &rem);
1354};1347};
13551348
1356// TODO: Implement1349zig_extern zig_i128 __divti3(zig_i128 lhs, zig_i128 rhs);
1357zig_extern zig_i128 __modti3(zig_i128 lhs, zig_i128 rhs);1350static zig_i128 zig_div_trunc_i128(zig_i128 lhs, zig_i128 rhs) {
1358static zig_i128 zig_rem_i128(zig_i128 lhs, zig_i128 rhs) {1351 return __divti3(lhs, rhs);
1359 return __modti3(lhs, rhs);1352};
1360}
13611353
1362// TODO: Implement
1363zig_extern zig_u128 __umodti3(zig_u128 lhs, zig_u128 rhs);1354zig_extern zig_u128 __umodti3(zig_u128 lhs, zig_u128 rhs);
1364static zig_u128 zig_rem_u128(zig_u128 lhs, zig_u128 rhs) {1355static zig_u128 zig_rem_u128(zig_u128 lhs, zig_u128 rhs) {
1365 return __umodti3(lhs, rhs);1356 return __umodti3(lhs, rhs);
1366}1357}
13671358
1359zig_extern zig_i128 __modti3(zig_i128 lhs, zig_i128 rhs);
1360static zig_i128 zig_rem_i128(zig_i128 lhs, zig_i128 rhs) {
1361 return __modti3(lhs, rhs);
1362}
1363
1368static inline zig_i128 zig_mod_i128(zig_i128 lhs, zig_i128 rhs) {1364static inline zig_i128 zig_mod_i128(zig_i128 lhs, zig_i128 rhs) {
1369 zig_i128 rem = zig_rem_i128(lhs, rhs);1365 zig_i128 rem = zig_rem_i128(lhs, rhs);
1370 return zig_add_i128(rem, (((lhs.hi ^ rhs.hi) & rem.hi) < zig_as_i64(0) ? rhs : zig_as_i128(0, 0)));1366 return zig_add_i128(rem, (((lhs.hi ^ rhs.hi) & rem.hi) < zig_as_i64(0) ? rhs : zig_as_i128(0, 0)));
...@@ -1669,6 +1665,8 @@ static inline zig_i128 zig_bit_reverse_i128(zig_i128 val, zig_u8 bits) {...@@ -1669,6 +1665,8 @@ static inline zig_i128 zig_bit_reverse_i128(zig_i128 val, zig_u8 bits) {
1669#define __builtin_nanf(str) nanf(str)1665#define __builtin_nanf(str) nanf(str)
1670#define __builtin_nanl(str) nanl(str)1666#define __builtin_nanl(str) nanl(str)
1671#define __builtin_inf() zig_msvc_flt_inf1667#define __builtin_inf() zig_msvc_flt_inf
1668#define __builtin_inff() zig_msvc_flt_inff
1669#define __builtin_infl() zig_msvc_flt_infl
1672#endif1670#endif
16731671
1674#define zig_has_f16 11672#define zig_has_f16 1