authorgravatar for xtex@astrafall.orgxtex <xtex@astrafall.org> 2025-10-18 21:29:25+08:00
committergravatar for alex@alexrp.comAlex Rønne Petersen <alex@alexrp.com> 2025-10-19 01:07:51+02:00
log6de339d5d3deb4c7a1585288888f8e788e489eb6
treeaa03d6a8a1ef3f2ecee532cab749da1cfe34f6a3
parent1bca158c6e0a4f301cef18db705d89de78c86bcb

cbe: fix MIPS register names in inline assembly

Zig uses "rN" for MIPS register clobbers which are more ergonomic and easier to write (.rN vs. .@"$N"). However, GCC and Clang uses "$N". Bug: #25613 Signed-off-by: Bingwu Zhang <xtex@xtexx.eu.org>

2 files changed, 14 insertions(+), 0 deletions(-)

crt.c created
src/codegen/c.zig+14
......@@ -5770,6 +5770,20 @@ fn airAsm(f: *Function, inst: Air.Inst.Index) !CValue {
57705770 .bool_true => {
57715771 const name = struct_type.structFieldName(i, zcu).toSlice(ip).?;
57725772 assert(name.len != 0);
5773
5774 const target = &f.object.dg.mod.resolved_target.result;
5775 if (target.cpu.arch.isMIPS() and name[0] == 'r') {
5776 // GCC uses "$N" for register names instead of "rN" used by Zig.
5777 var c_name_buf: [4]u8 = undefined;
5778 const c_name = (&c_name_buf)[0..name.len];
5779 @memcpy(c_name, name);
5780 c_name_buf[0] = '$';
5781
5782 try w.print(" {f}", .{fmtStringLiteral(c_name, null)});
5783 (try w.writableArray(1))[0] = ',';
5784 continue;
5785 }
5786
57735787 try w.print(" {f}", .{fmtStringLiteral(name, null)});
57745788 (try w.writableArray(1))[0] = ',';
57755789 },