authorgravatar for ndjenks@noreply.codeberg.orgndjenks <ndjenks@noreply.codeberg.org> 2026-07-07 00:34:25+02:00
committergravatar for alex@alexrp.comAlex Rønne Petersen <alex@alexrp.com> 2026-07-07 00:34:25+02:00
log160e1b229b6859861108270fc8783851a38517c6
treee7411927ab481ba6ab4f2bcdff1c34fec2f7fc19
parentc5af4c75da81616eadce8cf866aac86fb9e4ba9d

add the missing compiler_rt routines for sparc32 (#35835)

Fixes #31067 Co-authored-by: ndjenks <ndjenkoua@gmail.com> Reviewed-on: https://codeberg.org/ziglang/zig/pulls/35835 Reviewed-by: Alex Rønne Petersen <alex@alexrp.com>

21 files changed, 96 insertions(+), 25 deletions(-)

lib/compiler_rt.zig+2-1
......@@ -441,7 +441,8 @@ pub const gnu_f16_abi = switch (builtin.cpu.arch) {
441441 else => !builtin.os.tag.isDarwin(),
442442};
443443
444pub const want_sparc_abi = builtin.cpu.arch.isSPARC();
444pub const want_sparc64_abi = builtin.cpu.arch == .sparc64;
445pub const want_sparc32_abi = builtin.cpu.arch == .sparc;
445446
446447pub fn F16T(comptime OtherType: type) type {
447448 return switch (builtin.cpu.arch) {
lib/compiler_rt/addtf3.zig+3-1
......@@ -5,8 +5,10 @@ const addf3 = @import("./addf3.zig").addf3;
55comptime {
66 if (compiler_rt.want_ppc_abi) {
77 symbol(&__addtf3, "__addkf3");
8 } else if (compiler_rt.want_sparc_abi) {
8 } else if (compiler_rt.want_sparc64_abi) {
99 symbol(&_Qp_add, "_Qp_add");
10 } else if (compiler_rt.want_sparc32_abi) {
11 symbol(&__addtf3, "_Q_add");
1012 }
1113 symbol(&__addtf3, "__addtf3");
1214}
lib/compiler_rt/cmptf2.zig+43-1
......@@ -10,7 +10,7 @@ comptime {
1010 symbol(&__netf2, "__nekf2");
1111 symbol(&__lttf2, "__ltkf2");
1212 symbol(&__letf2, "__lekf2");
13 } else if (compiler_rt.want_sparc_abi) {
13 } else if (compiler_rt.want_sparc64_abi) {
1414 symbol(&_Qp_cmp, "_Qp_cmp");
1515 symbol(&_Qp_feq, "_Qp_feq");
1616 symbol(&_Qp_fne, "_Qp_fne");
......@@ -18,6 +18,14 @@ comptime {
1818 symbol(&_Qp_fle, "_Qp_fle");
1919 symbol(&_Qp_fgt, "_Qp_fgt");
2020 symbol(&_Qp_fge, "_Qp_fge");
21 } else if (compiler_rt.want_sparc32_abi) {
22 symbol(&_Q_cmp, "_Q_cmp");
23 symbol(&_Q_feq, "_Q_feq");
24 symbol(&_Q_fne, "_Q_fne");
25 symbol(&_Q_flt, "_Q_flt");
26 symbol(&_Q_fle, "_Q_fle");
27 symbol(&_Q_fgt, "_Q_fgt");
28 symbol(&_Q_fge, "_Q_fge");
2129 }
2230 symbol(&__eqtf2, "__eqtf2");
2331 symbol(&__netf2, "__netf2");
......@@ -102,3 +110,37 @@ fn _Qp_fle(a: *const f128, b: *const f128) callconv(.c) bool {
102110 .Greater, .Unordered => false,
103111 };
104112}
113
114fn _Q_cmp(a: f128, b: f128) callconv(.c) i32 {
115 return @intFromEnum(comparef.cmpf2(f128, SparcFCMP, a, b));
116}
117
118fn _Q_feq(a: f128, b: f128) callconv(.c) bool {
119 return @as(SparcFCMP, @enumFromInt(_Q_cmp(a, b))) == .Equal;
120}
121
122fn _Q_fne(a: f128, b: f128) callconv(.c) bool {
123 return @as(SparcFCMP, @enumFromInt(_Q_cmp(a, b))) != .Equal;
124}
125
126fn _Q_flt(a: f128, b: f128) callconv(.c) bool {
127 return @as(SparcFCMP, @enumFromInt(_Q_cmp(a, b))) == .Less;
128}
129
130fn _Q_fgt(a: f128, b: f128) callconv(.c) bool {
131 return @as(SparcFCMP, @enumFromInt(_Q_cmp(a, b))) == .Greater;
132}
133
134fn _Q_fge(a: f128, b: f128) callconv(.c) bool {
135 return switch (@as(SparcFCMP, @enumFromInt(_Q_cmp(a, b)))) {
136 .Equal, .Greater => true,
137 .Less, .Unordered => false,
138 };
139}
140
141fn _Q_fle(a: f128, b: f128) callconv(.c) bool {
142 return switch (@as(SparcFCMP, @enumFromInt(_Q_cmp(a, b)))) {
143 .Equal, .Less => true,
144 .Greater, .Unordered => false,
145 };
146}
lib/compiler_rt/comparef.zig-3
......@@ -32,9 +32,6 @@ comptime {
3232
3333 if (compiler_rt.want_ppc_abi) {
3434 symbol(&__unordtf2, "__unordkf2");
35 } else if (compiler_rt.want_sparc_abi) {
36 // These exports are handled in cmptf2.zig because unordered comparisons
37 // are based on calling _Qp_cmp.
3835 }
3936 symbol(&__unordtf2, "__unordtf2");
4037 symbol(&__unordhf2, "__unordhf2");
lib/compiler_rt/divtf3.zig+3-1
......@@ -9,8 +9,10 @@ const wideMultiply = compiler_rt.wideMultiply;
99comptime {
1010 if (compiler_rt.want_ppc_abi) {
1111 symbol(&__divtf3, "__divkf3");
12 } else if (compiler_rt.want_sparc_abi) {
12 } else if (compiler_rt.want_sparc64_abi) {
1313 symbol(&_Qp_div, "_Qp_div");
14 } else if (compiler_rt.want_sparc32_abi) {
15 symbol(&__divtf3, "_Q_div");
1416 }
1517 symbol(&__divtf3, "__divtf3");
1618}
lib/compiler_rt/extenddftf2.zig+3-1
......@@ -5,8 +5,10 @@ const symbol = @import("../compiler_rt.zig").symbol;
55comptime {
66 if (compiler_rt.want_ppc_abi) {
77 symbol(&__extenddftf2, "__extenddfkf2");
8 } else if (compiler_rt.want_sparc_abi) {
8 } else if (compiler_rt.want_sparc64_abi) {
99 symbol(&_Qp_dtoq, "_Qp_dtoq");
10 } else if (compiler_rt.want_sparc32_abi) {
11 symbol(&__extenddftf2, "_Q_dtoq");
1012 }
1113 symbol(&__extenddftf2, "__extenddftf2");
1214}
lib/compiler_rt/extendsftf2.zig+3-1
......@@ -5,8 +5,10 @@ const extendf = @import("./extendf.zig").extendf;
55comptime {
66 if (compiler_rt.want_ppc_abi) {
77 symbol(&__extendsftf2, "__extendsfkf2");
8 } else if (compiler_rt.want_sparc_abi) {
8 } else if (compiler_rt.want_sparc64_abi) {
99 symbol(&_Qp_stoq, "_Qp_stoq");
10 } else if (compiler_rt.want_sparc32_abi) {
11 symbol(&__extendsftf2, "_Q_stoq");
1012 }
1113 symbol(&__extendsftf2, "__extendsftf2");
1214}
lib/compiler_rt/fixtfdi.zig+3-1
......@@ -5,8 +5,10 @@ const symbol = @import("../compiler_rt.zig").symbol;
55comptime {
66 if (compiler_rt.want_ppc_abi) {
77 symbol(&__fixtfdi, "__fixkfdi");
8 } else if (compiler_rt.want_sparc_abi) {
8 } else if (compiler_rt.want_sparc64_abi) {
99 symbol(&_Qp_qtox, "_Qp_qtox");
10 } else if (compiler_rt.want_sparc32_abi) {
11 symbol(&__fixtfdi, "_Q_qtoll");
1012 }
1113 symbol(&__fixtfdi, "__fixtfdi");
1214}
lib/compiler_rt/fixtfsi.zig+3-1
......@@ -5,8 +5,10 @@ const intFromFloat = @import("./int_from_float.zig").intFromFloat;
55comptime {
66 if (compiler_rt.want_ppc_abi) {
77 symbol(&__fixtfsi, "__fixkfsi");
8 } else if (compiler_rt.want_sparc_abi) {
8 } else if (compiler_rt.want_sparc64_abi) {
99 symbol(&_Qp_qtoi, "_Qp_qtoi");
10 } else if (compiler_rt.want_sparc32_abi) {
11 symbol(&__fixtfsi, "_Q_qtoi");
1012 }
1113 symbol(&__fixtfsi, "__fixtfsi");
1214}
lib/compiler_rt/fixunstfdi.zig+3-1
......@@ -5,8 +5,10 @@ const intFromFloat = @import("./int_from_float.zig").intFromFloat;
55comptime {
66 if (compiler_rt.want_ppc_abi) {
77 symbol(&__fixunstfdi, "__fixunskfdi");
8 } else if (compiler_rt.want_sparc_abi) {
8 } else if (compiler_rt.want_sparc64_abi) {
99 symbol(&_Qp_qtoux, "_Qp_qtoux");
10 } else if (compiler_rt.want_sparc32_abi) {
11 symbol(&__fixunstfdi, "_Q_qtoull");
1012 }
1113 symbol(&__fixunstfdi, "__fixunstfdi");
1214}
lib/compiler_rt/fixunstfsi.zig+3-1
......@@ -5,8 +5,10 @@ const intFromFloat = @import("./int_from_float.zig").intFromFloat;
55comptime {
66 if (compiler_rt.want_ppc_abi) {
77 symbol(&__fixunstfsi, "__fixunskfsi");
8 } else if (compiler_rt.want_sparc_abi) {
8 } else if (compiler_rt.want_sparc64_abi) {
99 symbol(&_Qp_qtoui, "_Qp_qtoui");
10 } else if (compiler_rt.want_sparc32_abi) {
11 symbol(&__fixunstfsi, "_Q_qtou");
1012 }
1113 symbol(&__fixunstfsi, "__fixunstfsi");
1214}
lib/compiler_rt/floatditf.zig+3-1
......@@ -5,8 +5,10 @@ const symbol = @import("../compiler_rt.zig").symbol;
55comptime {
66 if (compiler_rt.want_ppc_abi) {
77 symbol(&__floatditf, "__floatdikf");
8 } else if (compiler_rt.want_sparc_abi) {
8 } else if (compiler_rt.want_sparc64_abi) {
99 symbol(&_Qp_xtoq, "_Qp_xtoq");
10 } else if (compiler_rt.want_sparc32_abi) {
11 symbol(&__floatditf, "_Q_lltoq");
1012 }
1113 symbol(&__floatditf, "__floatditf");
1214}
lib/compiler_rt/floatsitf.zig+3-1
......@@ -5,8 +5,10 @@ const floatFromInt = @import("./float_from_int.zig").floatFromInt;
55comptime {
66 if (compiler_rt.want_ppc_abi) {
77 symbol(&__floatsitf, "__floatsikf");
8 } else if (compiler_rt.want_sparc_abi) {
8 } else if (compiler_rt.want_sparc64_abi) {
99 symbol(&_Qp_itoq, "_Qp_itoq");
10 } else if (compiler_rt.want_sparc32_abi) {
11 symbol(&__floatsitf, "_Q_itoq");
1012 }
1113 symbol(&__floatsitf, "__floatsitf");
1214}
lib/compiler_rt/floatunditf.zig+3-1
......@@ -5,8 +5,10 @@ const floatFromInt = @import("./float_from_int.zig").floatFromInt;
55comptime {
66 if (compiler_rt.want_ppc_abi) {
77 symbol(&__floatunditf, "__floatundikf");
8 } else if (compiler_rt.want_sparc_abi) {
8 } else if (compiler_rt.want_sparc64_abi) {
99 symbol(&_Qp_uxtoq, "_Qp_uxtoq");
10 } else if (compiler_rt.want_sparc32_abi) {
11 @export(&__floatunditf, "_Q_ulltoq");
1012 }
1113 symbol(&__floatunditf, "__floatunditf");
1214}
lib/compiler_rt/floatunsitf.zig+3-1
......@@ -5,8 +5,10 @@ const symbol = @import("../compiler_rt.zig").symbol;
55comptime {
66 if (compiler_rt.want_ppc_abi) {
77 symbol(&__floatunsitf, "__floatunsikf");
8 } else if (compiler_rt.want_sparc_abi) {
8 } else if (compiler_rt.want_sparc64_abi) {
99 symbol(&_Qp_uitoq, "_Qp_uitoq");
10 } else if (compiler_rt.want_sparc32_abi) {
11 symbol(&__floatunsitf, "_Q_utoq");
1012 }
1113 symbol(&__floatunsitf, "__floatunsitf");
1214}
lib/compiler_rt/getf2.zig-3
......@@ -8,9 +8,6 @@ comptime {
88 if (compiler_rt.want_ppc_abi) {
99 symbol(&__getf2, "__gekf2");
1010 symbol(&__gttf2, "__gtkf2");
11 } else if (compiler_rt.want_sparc_abi) {
12 // These exports are handled in cmptf2.zig because gt and ge on sparc
13 // are based on calling _Qp_cmp.
1411 }
1512 symbol(&__getf2, "__getf2");
1613 symbol(&__gttf2, "__gttf2");
lib/compiler_rt/multf3.zig+3-1
......@@ -5,8 +5,10 @@ const mulf3 = @import("./mulf3.zig").mulf3;
55comptime {
66 if (compiler_rt.want_ppc_abi) {
77 symbol(&__multf3, "__mulkf3");
8 } else if (compiler_rt.want_sparc_abi) {
8 } else if (compiler_rt.want_sparc64_abi) {
99 symbol(&_Qp_mul, "_Qp_mul");
10 } else if (compiler_rt.want_sparc32_abi) {
11 symbol(&__multf3, "_Q_mul");
1012 }
1113 symbol(&__multf3, "__multf3");
1214}
lib/compiler_rt/sqrt.zig+3-1
......@@ -19,8 +19,10 @@ comptime {
1919 symbol(&__sqrtx, "__sqrtx");
2020 if (compiler_rt.want_ppc_abi) {
2121 symbol(&sqrtq, "sqrtf128");
22 } else if (compiler_rt.want_sparc_abi) {
22 } else if (compiler_rt.want_sparc64_abi) {
2323 symbol(&_Qp_sqrt, "_Qp_sqrt");
24 } else if (compiler_rt.want_sparc32_abi) {
25 symbol(&sqrtq, "_Q_sqrt");
2426 }
2527 symbol(&sqrtq, "sqrtq");
2628 symbol(&sqrtl, "sqrtl");
lib/compiler_rt/subtf3.zig+3-1
......@@ -5,8 +5,10 @@ const addf3 = @import("./addf3.zig").addf3;
55comptime {
66 if (compiler_rt.want_ppc_abi) {
77 symbol(&__subtf3, "__subkf3");
8 } else if (compiler_rt.want_sparc_abi) {
8 } else if (compiler_rt.want_sparc64_abi) {
99 symbol(&_Qp_sub, "_Qp_sub");
10 } else if (compiler_rt.want_sparc32_abi) {
11 symbol(&__subtf3, "_Q_sub");
1012 }
1113 symbol(&__subtf3, "__subtf3");
1214}
lib/compiler_rt/trunctfdf2.zig+3-1
......@@ -5,8 +5,10 @@ const truncf = @import("./truncf.zig").truncf;
55comptime {
66 if (compiler_rt.want_ppc_abi) {
77 symbol(&__trunctfdf2, "__trunckfdf2");
8 } else if (compiler_rt.want_sparc_abi) {
8 } else if (compiler_rt.want_sparc64_abi) {
99 symbol(&_Qp_qtod, "_Qp_qtod");
10 } else if (compiler_rt.want_sparc32_abi) {
11 symbol(&__trunctfdf2, "_Q_qtod");
1012 }
1113 symbol(&__trunctfdf2, "__trunctfdf2");
1214}
lib/compiler_rt/trunctfsf2.zig+3-1
......@@ -5,8 +5,10 @@ const symbol = @import("../compiler_rt.zig").symbol;
55comptime {
66 if (compiler_rt.want_ppc_abi) {
77 symbol(&__trunctfsf2, "__trunckfsf2");
8 } else if (compiler_rt.want_sparc_abi) {
8 } else if (compiler_rt.want_sparc64_abi) {
99 symbol(&_Qp_qtos, "_Qp_qtos");
10 } else if (compiler_rt.want_sparc32_abi) {
11 symbol(&__trunctfsf2, "_Q_qtos");
1012 }
1113 symbol(&__trunctfsf2, "__trunctfsf2");
1214}