From 160e1b229b6859861108270fc8783851a38517c6 Mon Sep 17 00:00:00 2001 From: ndjenks Date: Tue, 7 Jul 2026 00:34:25 +0200 Subject: [PATCH] add the missing compiler_rt routines for sparc32 (#35835) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Fixes #31067 Co-authored-by: ndjenks Reviewed-on: https://codeberg.org/ziglang/zig/pulls/35835 Reviewed-by: Alex Rønne Petersen --- lib/compiler_rt.zig | 3 ++- lib/compiler_rt/addtf3.zig | 4 ++- lib/compiler_rt/cmptf2.zig | 44 ++++++++++++++++++++++++++++++++- lib/compiler_rt/comparef.zig | 3 --- lib/compiler_rt/divtf3.zig | 4 ++- lib/compiler_rt/extenddftf2.zig | 4 ++- lib/compiler_rt/extendsftf2.zig | 4 ++- lib/compiler_rt/fixtfdi.zig | 4 ++- lib/compiler_rt/fixtfsi.zig | 4 ++- lib/compiler_rt/fixunstfdi.zig | 4 ++- lib/compiler_rt/fixunstfsi.zig | 4 ++- lib/compiler_rt/floatditf.zig | 4 ++- lib/compiler_rt/floatsitf.zig | 4 ++- lib/compiler_rt/floatunditf.zig | 4 ++- lib/compiler_rt/floatunsitf.zig | 4 ++- lib/compiler_rt/getf2.zig | 3 --- lib/compiler_rt/multf3.zig | 4 ++- lib/compiler_rt/sqrt.zig | 4 ++- lib/compiler_rt/subtf3.zig | 4 ++- lib/compiler_rt/trunctfdf2.zig | 4 ++- lib/compiler_rt/trunctfsf2.zig | 4 ++- 21 files changed, 96 insertions(+), 25 deletions(-) diff --git a/lib/compiler_rt.zig b/lib/compiler_rt.zig index 73bb514565d0ee57ed721b7b366ebea209cff107..0a8621ed13e8e6b4422b7b2554bf29955282f91c 100644 --- a/lib/compiler_rt.zig +++ b/lib/compiler_rt.zig @@ -441,7 +441,8 @@ pub const gnu_f16_abi = switch (builtin.cpu.arch) { else => !builtin.os.tag.isDarwin(), }; -pub const want_sparc_abi = builtin.cpu.arch.isSPARC(); +pub const want_sparc64_abi = builtin.cpu.arch == .sparc64; +pub const want_sparc32_abi = builtin.cpu.arch == .sparc; pub fn F16T(comptime OtherType: type) type { return switch (builtin.cpu.arch) { diff --git a/lib/compiler_rt/addtf3.zig b/lib/compiler_rt/addtf3.zig index 50e699415a6db4d1376a03f7385543c17930e11c..3097027f482ed73deee604acfcd7be877192d1fc 100644 --- a/lib/compiler_rt/addtf3.zig +++ b/lib/compiler_rt/addtf3.zig @@ -5,8 +5,10 @@ const addf3 = @import("./addf3.zig").addf3; comptime { if (compiler_rt.want_ppc_abi) { symbol(&__addtf3, "__addkf3"); - } else if (compiler_rt.want_sparc_abi) { + } else if (compiler_rt.want_sparc64_abi) { symbol(&_Qp_add, "_Qp_add"); + } else if (compiler_rt.want_sparc32_abi) { + symbol(&__addtf3, "_Q_add"); } symbol(&__addtf3, "__addtf3"); } diff --git a/lib/compiler_rt/cmptf2.zig b/lib/compiler_rt/cmptf2.zig index bdffc97f8694d2e98939f525ffb8027d066d85f3..dfe488aedb7109c1e26b04ca6abdeac70b982f2e 100644 --- a/lib/compiler_rt/cmptf2.zig +++ b/lib/compiler_rt/cmptf2.zig @@ -10,7 +10,7 @@ comptime { symbol(&__netf2, "__nekf2"); symbol(&__lttf2, "__ltkf2"); symbol(&__letf2, "__lekf2"); - } else if (compiler_rt.want_sparc_abi) { + } else if (compiler_rt.want_sparc64_abi) { symbol(&_Qp_cmp, "_Qp_cmp"); symbol(&_Qp_feq, "_Qp_feq"); symbol(&_Qp_fne, "_Qp_fne"); @@ -18,6 +18,14 @@ comptime { symbol(&_Qp_fle, "_Qp_fle"); symbol(&_Qp_fgt, "_Qp_fgt"); symbol(&_Qp_fge, "_Qp_fge"); + } else if (compiler_rt.want_sparc32_abi) { + symbol(&_Q_cmp, "_Q_cmp"); + symbol(&_Q_feq, "_Q_feq"); + symbol(&_Q_fne, "_Q_fne"); + symbol(&_Q_flt, "_Q_flt"); + symbol(&_Q_fle, "_Q_fle"); + symbol(&_Q_fgt, "_Q_fgt"); + symbol(&_Q_fge, "_Q_fge"); } symbol(&__eqtf2, "__eqtf2"); symbol(&__netf2, "__netf2"); @@ -102,3 +110,37 @@ fn _Qp_fle(a: *const f128, b: *const f128) callconv(.c) bool { .Greater, .Unordered => false, }; } + +fn _Q_cmp(a: f128, b: f128) callconv(.c) i32 { + return @intFromEnum(comparef.cmpf2(f128, SparcFCMP, a, b)); +} + +fn _Q_feq(a: f128, b: f128) callconv(.c) bool { + return @as(SparcFCMP, @enumFromInt(_Q_cmp(a, b))) == .Equal; +} + +fn _Q_fne(a: f128, b: f128) callconv(.c) bool { + return @as(SparcFCMP, @enumFromInt(_Q_cmp(a, b))) != .Equal; +} + +fn _Q_flt(a: f128, b: f128) callconv(.c) bool { + return @as(SparcFCMP, @enumFromInt(_Q_cmp(a, b))) == .Less; +} + +fn _Q_fgt(a: f128, b: f128) callconv(.c) bool { + return @as(SparcFCMP, @enumFromInt(_Q_cmp(a, b))) == .Greater; +} + +fn _Q_fge(a: f128, b: f128) callconv(.c) bool { + return switch (@as(SparcFCMP, @enumFromInt(_Q_cmp(a, b)))) { + .Equal, .Greater => true, + .Less, .Unordered => false, + }; +} + +fn _Q_fle(a: f128, b: f128) callconv(.c) bool { + return switch (@as(SparcFCMP, @enumFromInt(_Q_cmp(a, b)))) { + .Equal, .Less => true, + .Greater, .Unordered => false, + }; +} diff --git a/lib/compiler_rt/comparef.zig b/lib/compiler_rt/comparef.zig index ae5ffd8820cbdae16260ff7babcf2a110775ef20..25437298eead6581b5f8275d700d1c2f21e0190e 100644 --- a/lib/compiler_rt/comparef.zig +++ b/lib/compiler_rt/comparef.zig @@ -32,9 +32,6 @@ comptime { if (compiler_rt.want_ppc_abi) { symbol(&__unordtf2, "__unordkf2"); - } else if (compiler_rt.want_sparc_abi) { - // These exports are handled in cmptf2.zig because unordered comparisons - // are based on calling _Qp_cmp. } symbol(&__unordtf2, "__unordtf2"); symbol(&__unordhf2, "__unordhf2"); diff --git a/lib/compiler_rt/divtf3.zig b/lib/compiler_rt/divtf3.zig index e12d762a71eba01caa8479b15ee5ca99df7d85d7..3b6f648e3ac33e2fb3183bdd7fcb892ea239500c 100644 --- a/lib/compiler_rt/divtf3.zig +++ b/lib/compiler_rt/divtf3.zig @@ -9,8 +9,10 @@ const wideMultiply = compiler_rt.wideMultiply; comptime { if (compiler_rt.want_ppc_abi) { symbol(&__divtf3, "__divkf3"); - } else if (compiler_rt.want_sparc_abi) { + } else if (compiler_rt.want_sparc64_abi) { symbol(&_Qp_div, "_Qp_div"); + } else if (compiler_rt.want_sparc32_abi) { + symbol(&__divtf3, "_Q_div"); } symbol(&__divtf3, "__divtf3"); } diff --git a/lib/compiler_rt/extenddftf2.zig b/lib/compiler_rt/extenddftf2.zig index 4ccd402b24dfdc519f1c4a9e2958c1ac6a32da9a..d6267d7d8a93acd5a56d528d803f789a013dced5 100644 --- a/lib/compiler_rt/extenddftf2.zig +++ b/lib/compiler_rt/extenddftf2.zig @@ -5,8 +5,10 @@ const symbol = @import("../compiler_rt.zig").symbol; comptime { if (compiler_rt.want_ppc_abi) { symbol(&__extenddftf2, "__extenddfkf2"); - } else if (compiler_rt.want_sparc_abi) { + } else if (compiler_rt.want_sparc64_abi) { symbol(&_Qp_dtoq, "_Qp_dtoq"); + } else if (compiler_rt.want_sparc32_abi) { + symbol(&__extenddftf2, "_Q_dtoq"); } symbol(&__extenddftf2, "__extenddftf2"); } diff --git a/lib/compiler_rt/extendsftf2.zig b/lib/compiler_rt/extendsftf2.zig index e260eec7fe93dbcc7d6f4d219186ccc9d99acc9c..6135065b14297e34c04e7cefec5b9387321089a7 100644 --- a/lib/compiler_rt/extendsftf2.zig +++ b/lib/compiler_rt/extendsftf2.zig @@ -5,8 +5,10 @@ const extendf = @import("./extendf.zig").extendf; comptime { if (compiler_rt.want_ppc_abi) { symbol(&__extendsftf2, "__extendsfkf2"); - } else if (compiler_rt.want_sparc_abi) { + } else if (compiler_rt.want_sparc64_abi) { symbol(&_Qp_stoq, "_Qp_stoq"); + } else if (compiler_rt.want_sparc32_abi) { + symbol(&__extendsftf2, "_Q_stoq"); } symbol(&__extendsftf2, "__extendsftf2"); } diff --git a/lib/compiler_rt/fixtfdi.zig b/lib/compiler_rt/fixtfdi.zig index f3cb7bc1cf152227699881577c1f8acd6787e7d8..d64682db1c1153d982acba2636b39f2b17e63753 100644 --- a/lib/compiler_rt/fixtfdi.zig +++ b/lib/compiler_rt/fixtfdi.zig @@ -5,8 +5,10 @@ const symbol = @import("../compiler_rt.zig").symbol; comptime { if (compiler_rt.want_ppc_abi) { symbol(&__fixtfdi, "__fixkfdi"); - } else if (compiler_rt.want_sparc_abi) { + } else if (compiler_rt.want_sparc64_abi) { symbol(&_Qp_qtox, "_Qp_qtox"); + } else if (compiler_rt.want_sparc32_abi) { + symbol(&__fixtfdi, "_Q_qtoll"); } symbol(&__fixtfdi, "__fixtfdi"); } diff --git a/lib/compiler_rt/fixtfsi.zig b/lib/compiler_rt/fixtfsi.zig index 10cddec0da2a55d7ec91bdbf5a0b2090a17687b4..9acc5ec8eac8cb72a826c50d6d034e1ea48ef603 100644 --- a/lib/compiler_rt/fixtfsi.zig +++ b/lib/compiler_rt/fixtfsi.zig @@ -5,8 +5,10 @@ const intFromFloat = @import("./int_from_float.zig").intFromFloat; comptime { if (compiler_rt.want_ppc_abi) { symbol(&__fixtfsi, "__fixkfsi"); - } else if (compiler_rt.want_sparc_abi) { + } else if (compiler_rt.want_sparc64_abi) { symbol(&_Qp_qtoi, "_Qp_qtoi"); + } else if (compiler_rt.want_sparc32_abi) { + symbol(&__fixtfsi, "_Q_qtoi"); } symbol(&__fixtfsi, "__fixtfsi"); } diff --git a/lib/compiler_rt/fixunstfdi.zig b/lib/compiler_rt/fixunstfdi.zig index 809fe6eb80e0286619dccdb50854c286ee4ec520..c535bcc3583c93721f4fc07146f66edcc7611b01 100644 --- a/lib/compiler_rt/fixunstfdi.zig +++ b/lib/compiler_rt/fixunstfdi.zig @@ -5,8 +5,10 @@ const intFromFloat = @import("./int_from_float.zig").intFromFloat; comptime { if (compiler_rt.want_ppc_abi) { symbol(&__fixunstfdi, "__fixunskfdi"); - } else if (compiler_rt.want_sparc_abi) { + } else if (compiler_rt.want_sparc64_abi) { symbol(&_Qp_qtoux, "_Qp_qtoux"); + } else if (compiler_rt.want_sparc32_abi) { + symbol(&__fixunstfdi, "_Q_qtoull"); } symbol(&__fixunstfdi, "__fixunstfdi"); } diff --git a/lib/compiler_rt/fixunstfsi.zig b/lib/compiler_rt/fixunstfsi.zig index e8ec0aea932237035fc36e9db5cd310f5477d5e1..d31cd759744d7616b30050335f70c50921a76ca9 100644 --- a/lib/compiler_rt/fixunstfsi.zig +++ b/lib/compiler_rt/fixunstfsi.zig @@ -5,8 +5,10 @@ const intFromFloat = @import("./int_from_float.zig").intFromFloat; comptime { if (compiler_rt.want_ppc_abi) { symbol(&__fixunstfsi, "__fixunskfsi"); - } else if (compiler_rt.want_sparc_abi) { + } else if (compiler_rt.want_sparc64_abi) { symbol(&_Qp_qtoui, "_Qp_qtoui"); + } else if (compiler_rt.want_sparc32_abi) { + symbol(&__fixunstfsi, "_Q_qtou"); } symbol(&__fixunstfsi, "__fixunstfsi"); } diff --git a/lib/compiler_rt/floatditf.zig b/lib/compiler_rt/floatditf.zig index 544c059f1b103e44b44c1e2a30dcb574114ad08c..033c35ffcbdd2137d84890c9176d7c77fe29541e 100644 --- a/lib/compiler_rt/floatditf.zig +++ b/lib/compiler_rt/floatditf.zig @@ -5,8 +5,10 @@ const symbol = @import("../compiler_rt.zig").symbol; comptime { if (compiler_rt.want_ppc_abi) { symbol(&__floatditf, "__floatdikf"); - } else if (compiler_rt.want_sparc_abi) { + } else if (compiler_rt.want_sparc64_abi) { symbol(&_Qp_xtoq, "_Qp_xtoq"); + } else if (compiler_rt.want_sparc32_abi) { + symbol(&__floatditf, "_Q_lltoq"); } symbol(&__floatditf, "__floatditf"); } diff --git a/lib/compiler_rt/floatsitf.zig b/lib/compiler_rt/floatsitf.zig index b004d539899865e6908cb454e56e81cc31c0d3bf..865ebce60fddaa5d8234cf76293b08e12be30000 100644 --- a/lib/compiler_rt/floatsitf.zig +++ b/lib/compiler_rt/floatsitf.zig @@ -5,8 +5,10 @@ const floatFromInt = @import("./float_from_int.zig").floatFromInt; comptime { if (compiler_rt.want_ppc_abi) { symbol(&__floatsitf, "__floatsikf"); - } else if (compiler_rt.want_sparc_abi) { + } else if (compiler_rt.want_sparc64_abi) { symbol(&_Qp_itoq, "_Qp_itoq"); + } else if (compiler_rt.want_sparc32_abi) { + symbol(&__floatsitf, "_Q_itoq"); } symbol(&__floatsitf, "__floatsitf"); } diff --git a/lib/compiler_rt/floatunditf.zig b/lib/compiler_rt/floatunditf.zig index 257a5779bb9bd71d80b44b79f7d4cc12a6afdace..79f9f54e176f5741bbc901b1790895feaadf1f98 100644 --- a/lib/compiler_rt/floatunditf.zig +++ b/lib/compiler_rt/floatunditf.zig @@ -5,8 +5,10 @@ const floatFromInt = @import("./float_from_int.zig").floatFromInt; comptime { if (compiler_rt.want_ppc_abi) { symbol(&__floatunditf, "__floatundikf"); - } else if (compiler_rt.want_sparc_abi) { + } else if (compiler_rt.want_sparc64_abi) { symbol(&_Qp_uxtoq, "_Qp_uxtoq"); + } else if (compiler_rt.want_sparc32_abi) { + @export(&__floatunditf, "_Q_ulltoq"); } symbol(&__floatunditf, "__floatunditf"); } diff --git a/lib/compiler_rt/floatunsitf.zig b/lib/compiler_rt/floatunsitf.zig index 6a5607c147ede2b8cdd10771caf3a97624bab7f2..2b7c58eab8bd7c2a238062e0cc123f5ce6b8c9e0 100644 --- a/lib/compiler_rt/floatunsitf.zig +++ b/lib/compiler_rt/floatunsitf.zig @@ -5,8 +5,10 @@ const symbol = @import("../compiler_rt.zig").symbol; comptime { if (compiler_rt.want_ppc_abi) { symbol(&__floatunsitf, "__floatunsikf"); - } else if (compiler_rt.want_sparc_abi) { + } else if (compiler_rt.want_sparc64_abi) { symbol(&_Qp_uitoq, "_Qp_uitoq"); + } else if (compiler_rt.want_sparc32_abi) { + symbol(&__floatunsitf, "_Q_utoq"); } symbol(&__floatunsitf, "__floatunsitf"); } diff --git a/lib/compiler_rt/getf2.zig b/lib/compiler_rt/getf2.zig index 4476ab636c27a1a2c3ef6a4e598d4f8e7b63ee8a..927013050ae01019e80c2d7c2d862991495072ed 100644 --- a/lib/compiler_rt/getf2.zig +++ b/lib/compiler_rt/getf2.zig @@ -8,9 +8,6 @@ comptime { if (compiler_rt.want_ppc_abi) { symbol(&__getf2, "__gekf2"); symbol(&__gttf2, "__gtkf2"); - } else if (compiler_rt.want_sparc_abi) { - // These exports are handled in cmptf2.zig because gt and ge on sparc - // are based on calling _Qp_cmp. } symbol(&__getf2, "__getf2"); symbol(&__gttf2, "__gttf2"); diff --git a/lib/compiler_rt/multf3.zig b/lib/compiler_rt/multf3.zig index 3befe34da0f4b3634ada353d8918d9542239a16e..7d10c70777176e7a8580eb3b909546e42535785e 100644 --- a/lib/compiler_rt/multf3.zig +++ b/lib/compiler_rt/multf3.zig @@ -5,8 +5,10 @@ const mulf3 = @import("./mulf3.zig").mulf3; comptime { if (compiler_rt.want_ppc_abi) { symbol(&__multf3, "__mulkf3"); - } else if (compiler_rt.want_sparc_abi) { + } else if (compiler_rt.want_sparc64_abi) { symbol(&_Qp_mul, "_Qp_mul"); + } else if (compiler_rt.want_sparc32_abi) { + symbol(&__multf3, "_Q_mul"); } symbol(&__multf3, "__multf3"); } diff --git a/lib/compiler_rt/sqrt.zig b/lib/compiler_rt/sqrt.zig index be2f58a12fd25213f2a1ebe7f8e150db18f92078..739285af0eaa66af2cf6ed31a3dcc142a708b590 100644 --- a/lib/compiler_rt/sqrt.zig +++ b/lib/compiler_rt/sqrt.zig @@ -19,8 +19,10 @@ comptime { symbol(&__sqrtx, "__sqrtx"); if (compiler_rt.want_ppc_abi) { symbol(&sqrtq, "sqrtf128"); - } else if (compiler_rt.want_sparc_abi) { + } else if (compiler_rt.want_sparc64_abi) { symbol(&_Qp_sqrt, "_Qp_sqrt"); + } else if (compiler_rt.want_sparc32_abi) { + symbol(&sqrtq, "_Q_sqrt"); } symbol(&sqrtq, "sqrtq"); symbol(&sqrtl, "sqrtl"); diff --git a/lib/compiler_rt/subtf3.zig b/lib/compiler_rt/subtf3.zig index 617e0e701617030ca231bd3daea6d28a8331d6ac..46580f1728d70b85c83259dce39cb860e46ac10e 100644 --- a/lib/compiler_rt/subtf3.zig +++ b/lib/compiler_rt/subtf3.zig @@ -5,8 +5,10 @@ const addf3 = @import("./addf3.zig").addf3; comptime { if (compiler_rt.want_ppc_abi) { symbol(&__subtf3, "__subkf3"); - } else if (compiler_rt.want_sparc_abi) { + } else if (compiler_rt.want_sparc64_abi) { symbol(&_Qp_sub, "_Qp_sub"); + } else if (compiler_rt.want_sparc32_abi) { + symbol(&__subtf3, "_Q_sub"); } symbol(&__subtf3, "__subtf3"); } diff --git a/lib/compiler_rt/trunctfdf2.zig b/lib/compiler_rt/trunctfdf2.zig index 5396e8715141245c8fe402e7de3f2b0238b6f532..ba909de73bf144b2f023e4f6366dac5a4ad0ea40 100644 --- a/lib/compiler_rt/trunctfdf2.zig +++ b/lib/compiler_rt/trunctfdf2.zig @@ -5,8 +5,10 @@ const truncf = @import("./truncf.zig").truncf; comptime { if (compiler_rt.want_ppc_abi) { symbol(&__trunctfdf2, "__trunckfdf2"); - } else if (compiler_rt.want_sparc_abi) { + } else if (compiler_rt.want_sparc64_abi) { symbol(&_Qp_qtod, "_Qp_qtod"); + } else if (compiler_rt.want_sparc32_abi) { + symbol(&__trunctfdf2, "_Q_qtod"); } symbol(&__trunctfdf2, "__trunctfdf2"); } diff --git a/lib/compiler_rt/trunctfsf2.zig b/lib/compiler_rt/trunctfsf2.zig index 94dbff6ef9cbe6326893550686379f6dc20bb8a6..8af51ca82f95b1dd36c7f27df20e6756b8e15396 100644 --- a/lib/compiler_rt/trunctfsf2.zig +++ b/lib/compiler_rt/trunctfsf2.zig @@ -5,8 +5,10 @@ const symbol = @import("../compiler_rt.zig").symbol; comptime { if (compiler_rt.want_ppc_abi) { symbol(&__trunctfsf2, "__trunckfsf2"); - } else if (compiler_rt.want_sparc_abi) { + } else if (compiler_rt.want_sparc64_abi) { symbol(&_Qp_qtos, "_Qp_qtos"); + } else if (compiler_rt.want_sparc32_abi) { + symbol(&__trunctfsf2, "_Q_qtos"); } symbol(&__trunctfsf2, "__trunctfsf2"); } -- 2.54.0