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) {...@@ -441,7 +441,8 @@ pub const gnu_f16_abi = switch (builtin.cpu.arch) {
441 else => !builtin.os.tag.isDarwin(),441 else => !builtin.os.tag.isDarwin(),
442};442};
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
446pub fn F16T(comptime OtherType: type) type {447pub fn F16T(comptime OtherType: type) type {
447 return switch (builtin.cpu.arch) {448 return switch (builtin.cpu.arch) {
lib/compiler_rt/addtf3.zig+3-1
...@@ -5,8 +5,10 @@ const addf3 = @import("./addf3.zig").addf3;...@@ -5,8 +5,10 @@ const addf3 = @import("./addf3.zig").addf3;
5comptime {5comptime {
6 if (compiler_rt.want_ppc_abi) {6 if (compiler_rt.want_ppc_abi) {
7 symbol(&__addtf3, "__addkf3");7 symbol(&__addtf3, "__addkf3");
8 } else if (compiler_rt.want_sparc_abi) {8 } else if (compiler_rt.want_sparc64_abi) {
9 symbol(&_Qp_add, "_Qp_add");9 symbol(&_Qp_add, "_Qp_add");
10 } else if (compiler_rt.want_sparc32_abi) {
11 symbol(&__addtf3, "_Q_add");
10 }12 }
11 symbol(&__addtf3, "__addtf3");13 symbol(&__addtf3, "__addtf3");
12}14}
lib/compiler_rt/cmptf2.zig+43-1
...@@ -10,7 +10,7 @@ comptime {...@@ -10,7 +10,7 @@ comptime {
10 symbol(&__netf2, "__nekf2");10 symbol(&__netf2, "__nekf2");
11 symbol(&__lttf2, "__ltkf2");11 symbol(&__lttf2, "__ltkf2");
12 symbol(&__letf2, "__lekf2");12 symbol(&__letf2, "__lekf2");
13 } else if (compiler_rt.want_sparc_abi) {13 } else if (compiler_rt.want_sparc64_abi) {
14 symbol(&_Qp_cmp, "_Qp_cmp");14 symbol(&_Qp_cmp, "_Qp_cmp");
15 symbol(&_Qp_feq, "_Qp_feq");15 symbol(&_Qp_feq, "_Qp_feq");
16 symbol(&_Qp_fne, "_Qp_fne");16 symbol(&_Qp_fne, "_Qp_fne");
...@@ -18,6 +18,14 @@ comptime {...@@ -18,6 +18,14 @@ comptime {
18 symbol(&_Qp_fle, "_Qp_fle");18 symbol(&_Qp_fle, "_Qp_fle");
19 symbol(&_Qp_fgt, "_Qp_fgt");19 symbol(&_Qp_fgt, "_Qp_fgt");
20 symbol(&_Qp_fge, "_Qp_fge");20 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");
21 }29 }
22 symbol(&__eqtf2, "__eqtf2");30 symbol(&__eqtf2, "__eqtf2");
23 symbol(&__netf2, "__netf2");31 symbol(&__netf2, "__netf2");
...@@ -102,3 +110,37 @@ fn _Qp_fle(a: *const f128, b: *const f128) callconv(.c) bool {...@@ -102,3 +110,37 @@ fn _Qp_fle(a: *const f128, b: *const f128) callconv(.c) bool {
102 .Greater, .Unordered => false,110 .Greater, .Unordered => false,
103 };111 };
104}112}
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 {...@@ -32,9 +32,6 @@ comptime {
3232
33 if (compiler_rt.want_ppc_abi) {33 if (compiler_rt.want_ppc_abi) {
34 symbol(&__unordtf2, "__unordkf2");34 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.
38 }35 }
39 symbol(&__unordtf2, "__unordtf2");36 symbol(&__unordtf2, "__unordtf2");
40 symbol(&__unordhf2, "__unordhf2");37 symbol(&__unordhf2, "__unordhf2");
lib/compiler_rt/divtf3.zig+3-1
...@@ -9,8 +9,10 @@ const wideMultiply = compiler_rt.wideMultiply;...@@ -9,8 +9,10 @@ const wideMultiply = compiler_rt.wideMultiply;
9comptime {9comptime {
10 if (compiler_rt.want_ppc_abi) {10 if (compiler_rt.want_ppc_abi) {
11 symbol(&__divtf3, "__divkf3");11 symbol(&__divtf3, "__divkf3");
12 } else if (compiler_rt.want_sparc_abi) {12 } else if (compiler_rt.want_sparc64_abi) {
13 symbol(&_Qp_div, "_Qp_div");13 symbol(&_Qp_div, "_Qp_div");
14 } else if (compiler_rt.want_sparc32_abi) {
15 symbol(&__divtf3, "_Q_div");
14 }16 }
15 symbol(&__divtf3, "__divtf3");17 symbol(&__divtf3, "__divtf3");
16}18}
lib/compiler_rt/extenddftf2.zig+3-1
...@@ -5,8 +5,10 @@ const symbol = @import("../compiler_rt.zig").symbol;...@@ -5,8 +5,10 @@ const symbol = @import("../compiler_rt.zig").symbol;
5comptime {5comptime {
6 if (compiler_rt.want_ppc_abi) {6 if (compiler_rt.want_ppc_abi) {
7 symbol(&__extenddftf2, "__extenddfkf2");7 symbol(&__extenddftf2, "__extenddfkf2");
8 } else if (compiler_rt.want_sparc_abi) {8 } else if (compiler_rt.want_sparc64_abi) {
9 symbol(&_Qp_dtoq, "_Qp_dtoq");9 symbol(&_Qp_dtoq, "_Qp_dtoq");
10 } else if (compiler_rt.want_sparc32_abi) {
11 symbol(&__extenddftf2, "_Q_dtoq");
10 }12 }
11 symbol(&__extenddftf2, "__extenddftf2");13 symbol(&__extenddftf2, "__extenddftf2");
12}14}
lib/compiler_rt/extendsftf2.zig+3-1
...@@ -5,8 +5,10 @@ const extendf = @import("./extendf.zig").extendf;...@@ -5,8 +5,10 @@ const extendf = @import("./extendf.zig").extendf;
5comptime {5comptime {
6 if (compiler_rt.want_ppc_abi) {6 if (compiler_rt.want_ppc_abi) {
7 symbol(&__extendsftf2, "__extendsfkf2");7 symbol(&__extendsftf2, "__extendsfkf2");
8 } else if (compiler_rt.want_sparc_abi) {8 } else if (compiler_rt.want_sparc64_abi) {
9 symbol(&_Qp_stoq, "_Qp_stoq");9 symbol(&_Qp_stoq, "_Qp_stoq");
10 } else if (compiler_rt.want_sparc32_abi) {
11 symbol(&__extendsftf2, "_Q_stoq");
10 }12 }
11 symbol(&__extendsftf2, "__extendsftf2");13 symbol(&__extendsftf2, "__extendsftf2");
12}14}
lib/compiler_rt/fixtfdi.zig+3-1
...@@ -5,8 +5,10 @@ const symbol = @import("../compiler_rt.zig").symbol;...@@ -5,8 +5,10 @@ const symbol = @import("../compiler_rt.zig").symbol;
5comptime {5comptime {
6 if (compiler_rt.want_ppc_abi) {6 if (compiler_rt.want_ppc_abi) {
7 symbol(&__fixtfdi, "__fixkfdi");7 symbol(&__fixtfdi, "__fixkfdi");
8 } else if (compiler_rt.want_sparc_abi) {8 } else if (compiler_rt.want_sparc64_abi) {
9 symbol(&_Qp_qtox, "_Qp_qtox");9 symbol(&_Qp_qtox, "_Qp_qtox");
10 } else if (compiler_rt.want_sparc32_abi) {
11 symbol(&__fixtfdi, "_Q_qtoll");
10 }12 }
11 symbol(&__fixtfdi, "__fixtfdi");13 symbol(&__fixtfdi, "__fixtfdi");
12}14}
lib/compiler_rt/fixtfsi.zig+3-1
...@@ -5,8 +5,10 @@ const intFromFloat = @import("./int_from_float.zig").intFromFloat;...@@ -5,8 +5,10 @@ const intFromFloat = @import("./int_from_float.zig").intFromFloat;
5comptime {5comptime {
6 if (compiler_rt.want_ppc_abi) {6 if (compiler_rt.want_ppc_abi) {
7 symbol(&__fixtfsi, "__fixkfsi");7 symbol(&__fixtfsi, "__fixkfsi");
8 } else if (compiler_rt.want_sparc_abi) {8 } else if (compiler_rt.want_sparc64_abi) {
9 symbol(&_Qp_qtoi, "_Qp_qtoi");9 symbol(&_Qp_qtoi, "_Qp_qtoi");
10 } else if (compiler_rt.want_sparc32_abi) {
11 symbol(&__fixtfsi, "_Q_qtoi");
10 }12 }
11 symbol(&__fixtfsi, "__fixtfsi");13 symbol(&__fixtfsi, "__fixtfsi");
12}14}
lib/compiler_rt/fixunstfdi.zig+3-1
...@@ -5,8 +5,10 @@ const intFromFloat = @import("./int_from_float.zig").intFromFloat;...@@ -5,8 +5,10 @@ const intFromFloat = @import("./int_from_float.zig").intFromFloat;
5comptime {5comptime {
6 if (compiler_rt.want_ppc_abi) {6 if (compiler_rt.want_ppc_abi) {
7 symbol(&__fixunstfdi, "__fixunskfdi");7 symbol(&__fixunstfdi, "__fixunskfdi");
8 } else if (compiler_rt.want_sparc_abi) {8 } else if (compiler_rt.want_sparc64_abi) {
9 symbol(&_Qp_qtoux, "_Qp_qtoux");9 symbol(&_Qp_qtoux, "_Qp_qtoux");
10 } else if (compiler_rt.want_sparc32_abi) {
11 symbol(&__fixunstfdi, "_Q_qtoull");
10 }12 }
11 symbol(&__fixunstfdi, "__fixunstfdi");13 symbol(&__fixunstfdi, "__fixunstfdi");
12}14}
lib/compiler_rt/fixunstfsi.zig+3-1
...@@ -5,8 +5,10 @@ const intFromFloat = @import("./int_from_float.zig").intFromFloat;...@@ -5,8 +5,10 @@ const intFromFloat = @import("./int_from_float.zig").intFromFloat;
5comptime {5comptime {
6 if (compiler_rt.want_ppc_abi) {6 if (compiler_rt.want_ppc_abi) {
7 symbol(&__fixunstfsi, "__fixunskfsi");7 symbol(&__fixunstfsi, "__fixunskfsi");
8 } else if (compiler_rt.want_sparc_abi) {8 } else if (compiler_rt.want_sparc64_abi) {
9 symbol(&_Qp_qtoui, "_Qp_qtoui");9 symbol(&_Qp_qtoui, "_Qp_qtoui");
10 } else if (compiler_rt.want_sparc32_abi) {
11 symbol(&__fixunstfsi, "_Q_qtou");
10 }12 }
11 symbol(&__fixunstfsi, "__fixunstfsi");13 symbol(&__fixunstfsi, "__fixunstfsi");
12}14}
lib/compiler_rt/floatditf.zig+3-1
...@@ -5,8 +5,10 @@ const symbol = @import("../compiler_rt.zig").symbol;...@@ -5,8 +5,10 @@ const symbol = @import("../compiler_rt.zig").symbol;
5comptime {5comptime {
6 if (compiler_rt.want_ppc_abi) {6 if (compiler_rt.want_ppc_abi) {
7 symbol(&__floatditf, "__floatdikf");7 symbol(&__floatditf, "__floatdikf");
8 } else if (compiler_rt.want_sparc_abi) {8 } else if (compiler_rt.want_sparc64_abi) {
9 symbol(&_Qp_xtoq, "_Qp_xtoq");9 symbol(&_Qp_xtoq, "_Qp_xtoq");
10 } else if (compiler_rt.want_sparc32_abi) {
11 symbol(&__floatditf, "_Q_lltoq");
10 }12 }
11 symbol(&__floatditf, "__floatditf");13 symbol(&__floatditf, "__floatditf");
12}14}
lib/compiler_rt/floatsitf.zig+3-1
...@@ -5,8 +5,10 @@ const floatFromInt = @import("./float_from_int.zig").floatFromInt;...@@ -5,8 +5,10 @@ const floatFromInt = @import("./float_from_int.zig").floatFromInt;
5comptime {5comptime {
6 if (compiler_rt.want_ppc_abi) {6 if (compiler_rt.want_ppc_abi) {
7 symbol(&__floatsitf, "__floatsikf");7 symbol(&__floatsitf, "__floatsikf");
8 } else if (compiler_rt.want_sparc_abi) {8 } else if (compiler_rt.want_sparc64_abi) {
9 symbol(&_Qp_itoq, "_Qp_itoq");9 symbol(&_Qp_itoq, "_Qp_itoq");
10 } else if (compiler_rt.want_sparc32_abi) {
11 symbol(&__floatsitf, "_Q_itoq");
10 }12 }
11 symbol(&__floatsitf, "__floatsitf");13 symbol(&__floatsitf, "__floatsitf");
12}14}
lib/compiler_rt/floatunditf.zig+3-1
...@@ -5,8 +5,10 @@ const floatFromInt = @import("./float_from_int.zig").floatFromInt;...@@ -5,8 +5,10 @@ const floatFromInt = @import("./float_from_int.zig").floatFromInt;
5comptime {5comptime {
6 if (compiler_rt.want_ppc_abi) {6 if (compiler_rt.want_ppc_abi) {
7 symbol(&__floatunditf, "__floatundikf");7 symbol(&__floatunditf, "__floatundikf");
8 } else if (compiler_rt.want_sparc_abi) {8 } else if (compiler_rt.want_sparc64_abi) {
9 symbol(&_Qp_uxtoq, "_Qp_uxtoq");9 symbol(&_Qp_uxtoq, "_Qp_uxtoq");
10 } else if (compiler_rt.want_sparc32_abi) {
11 @export(&__floatunditf, "_Q_ulltoq");
10 }12 }
11 symbol(&__floatunditf, "__floatunditf");13 symbol(&__floatunditf, "__floatunditf");
12}14}
lib/compiler_rt/floatunsitf.zig+3-1
...@@ -5,8 +5,10 @@ const symbol = @import("../compiler_rt.zig").symbol;...@@ -5,8 +5,10 @@ const symbol = @import("../compiler_rt.zig").symbol;
5comptime {5comptime {
6 if (compiler_rt.want_ppc_abi) {6 if (compiler_rt.want_ppc_abi) {
7 symbol(&__floatunsitf, "__floatunsikf");7 symbol(&__floatunsitf, "__floatunsikf");
8 } else if (compiler_rt.want_sparc_abi) {8 } else if (compiler_rt.want_sparc64_abi) {
9 symbol(&_Qp_uitoq, "_Qp_uitoq");9 symbol(&_Qp_uitoq, "_Qp_uitoq");
10 } else if (compiler_rt.want_sparc32_abi) {
11 symbol(&__floatunsitf, "_Q_utoq");
10 }12 }
11 symbol(&__floatunsitf, "__floatunsitf");13 symbol(&__floatunsitf, "__floatunsitf");
12}14}
lib/compiler_rt/getf2.zig-3
...@@ -8,9 +8,6 @@ comptime {...@@ -8,9 +8,6 @@ comptime {
8 if (compiler_rt.want_ppc_abi) {8 if (compiler_rt.want_ppc_abi) {
9 symbol(&__getf2, "__gekf2");9 symbol(&__getf2, "__gekf2");
10 symbol(&__gttf2, "__gtkf2");10 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.
14 }11 }
15 symbol(&__getf2, "__getf2");12 symbol(&__getf2, "__getf2");
16 symbol(&__gttf2, "__gttf2");13 symbol(&__gttf2, "__gttf2");
lib/compiler_rt/multf3.zig+3-1
...@@ -5,8 +5,10 @@ const mulf3 = @import("./mulf3.zig").mulf3;...@@ -5,8 +5,10 @@ const mulf3 = @import("./mulf3.zig").mulf3;
5comptime {5comptime {
6 if (compiler_rt.want_ppc_abi) {6 if (compiler_rt.want_ppc_abi) {
7 symbol(&__multf3, "__mulkf3");7 symbol(&__multf3, "__mulkf3");
8 } else if (compiler_rt.want_sparc_abi) {8 } else if (compiler_rt.want_sparc64_abi) {
9 symbol(&_Qp_mul, "_Qp_mul");9 symbol(&_Qp_mul, "_Qp_mul");
10 } else if (compiler_rt.want_sparc32_abi) {
11 symbol(&__multf3, "_Q_mul");
10 }12 }
11 symbol(&__multf3, "__multf3");13 symbol(&__multf3, "__multf3");
12}14}
lib/compiler_rt/sqrt.zig+3-1
...@@ -19,8 +19,10 @@ comptime {...@@ -19,8 +19,10 @@ comptime {
19 symbol(&__sqrtx, "__sqrtx");19 symbol(&__sqrtx, "__sqrtx");
20 if (compiler_rt.want_ppc_abi) {20 if (compiler_rt.want_ppc_abi) {
21 symbol(&sqrtq, "sqrtf128");21 symbol(&sqrtq, "sqrtf128");
22 } else if (compiler_rt.want_sparc_abi) {22 } else if (compiler_rt.want_sparc64_abi) {
23 symbol(&_Qp_sqrt, "_Qp_sqrt");23 symbol(&_Qp_sqrt, "_Qp_sqrt");
24 } else if (compiler_rt.want_sparc32_abi) {
25 symbol(&sqrtq, "_Q_sqrt");
24 }26 }
25 symbol(&sqrtq, "sqrtq");27 symbol(&sqrtq, "sqrtq");
26 symbol(&sqrtl, "sqrtl");28 symbol(&sqrtl, "sqrtl");
lib/compiler_rt/subtf3.zig+3-1
...@@ -5,8 +5,10 @@ const addf3 = @import("./addf3.zig").addf3;...@@ -5,8 +5,10 @@ const addf3 = @import("./addf3.zig").addf3;
5comptime {5comptime {
6 if (compiler_rt.want_ppc_abi) {6 if (compiler_rt.want_ppc_abi) {
7 symbol(&__subtf3, "__subkf3");7 symbol(&__subtf3, "__subkf3");
8 } else if (compiler_rt.want_sparc_abi) {8 } else if (compiler_rt.want_sparc64_abi) {
9 symbol(&_Qp_sub, "_Qp_sub");9 symbol(&_Qp_sub, "_Qp_sub");
10 } else if (compiler_rt.want_sparc32_abi) {
11 symbol(&__subtf3, "_Q_sub");
10 }12 }
11 symbol(&__subtf3, "__subtf3");13 symbol(&__subtf3, "__subtf3");
12}14}
lib/compiler_rt/trunctfdf2.zig+3-1
...@@ -5,8 +5,10 @@ const truncf = @import("./truncf.zig").truncf;...@@ -5,8 +5,10 @@ const truncf = @import("./truncf.zig").truncf;
5comptime {5comptime {
6 if (compiler_rt.want_ppc_abi) {6 if (compiler_rt.want_ppc_abi) {
7 symbol(&__trunctfdf2, "__trunckfdf2");7 symbol(&__trunctfdf2, "__trunckfdf2");
8 } else if (compiler_rt.want_sparc_abi) {8 } else if (compiler_rt.want_sparc64_abi) {
9 symbol(&_Qp_qtod, "_Qp_qtod");9 symbol(&_Qp_qtod, "_Qp_qtod");
10 } else if (compiler_rt.want_sparc32_abi) {
11 symbol(&__trunctfdf2, "_Q_qtod");
10 }12 }
11 symbol(&__trunctfdf2, "__trunctfdf2");13 symbol(&__trunctfdf2, "__trunctfdf2");
12}14}
lib/compiler_rt/trunctfsf2.zig+3-1
...@@ -5,8 +5,10 @@ const symbol = @import("../compiler_rt.zig").symbol;...@@ -5,8 +5,10 @@ const symbol = @import("../compiler_rt.zig").symbol;
5comptime {5comptime {
6 if (compiler_rt.want_ppc_abi) {6 if (compiler_rt.want_ppc_abi) {
7 symbol(&__trunctfsf2, "__trunckfsf2");7 symbol(&__trunctfsf2, "__trunckfsf2");
8 } else if (compiler_rt.want_sparc_abi) {8 } else if (compiler_rt.want_sparc64_abi) {
9 symbol(&_Qp_qtos, "_Qp_qtos");9 symbol(&_Qp_qtos, "_Qp_qtos");
10 } else if (compiler_rt.want_sparc32_abi) {
11 symbol(&__trunctfsf2, "_Q_qtos");
10 }12 }
11 symbol(&__trunctfsf2, "__trunctfsf2");13 symbol(&__trunctfsf2, "__trunctfsf2");
12}14}