From f72603e7e8cdc0dbeae43f880c532f50a92a2c95 Mon Sep 17 00:00:00 2001 From: Jacob Young Date: Sun, 26 Oct 2025 11:12:23 -0400 Subject: [PATCH 1/2] x86_64: continue hacking around unimplemented linker logic Closes #25666 --- src/codegen/x86_64/CodeGen.zig | 9 ++++++++- test/behavior/memset.zig | 11 +++++++++++ 2 files changed, 19 insertions(+), 1 deletion(-) diff --git a/src/codegen/x86_64/CodeGen.zig b/src/codegen/x86_64/CodeGen.zig index 4fb935f01d03..e826797671b8 100644 --- a/src/codegen/x86_64/CodeGen.zig +++ b/src/codegen/x86_64/CodeGen.zig @@ -179000,7 +179000,14 @@ fn genSetMem( .reg => |base_reg| .{ .register_offset = .{ .reg = base_reg, .off = disp } }, .frame => |base_frame_index| .{ .lea_frame = .{ .index = base_frame_index, .off = disp } }, .table, .rip_inst, .lazy_sym => unreachable, - .nav => |nav| .{ .lea_nav = nav }, + .nav => |nav| { + // hack around linker relocation bugs + const addr_reg = try self.copyToTmpRegister(.usize, .{ .lea_nav = nav }); + const addr_lock = self.register_manager.lockRegAssumeUnused(addr_reg); + defer self.register_manager.unlockReg(addr_lock); + + return self.genSetMem(.{ .reg = addr_reg }, disp, ty, src_mcv, opts); + }, .uav => |uav| .{ .lea_uav = uav }, .extern_func => |extern_func| .{ .lea_extern_func = extern_func }, }; diff --git a/test/behavior/memset.zig b/test/behavior/memset.zig index f4bb080e30b4..5d8db9e6e764 100644 --- a/test/behavior/memset.zig +++ b/test/behavior/memset.zig @@ -179,3 +179,14 @@ test "@memset with zero-length array" { var array: [0]usize = undefined; @memset(&array, 0); } + +test "@memset a global array" { + const S = struct { + var buf: [1]u32 = .{123}; + }; + try expect(S.buf[0] == 123); + @memset(&S.buf, 456); + try expect(S.buf[0] == 456); + @memset(&S.buf, S.buf[0] + 333); + try expect(S.buf[0] == 789); +} From c844985a50d339f5285579c33ee9c1b3e6df0d4f Mon Sep 17 00:00:00 2001 From: Jacob Young Date: Sun, 26 Oct 2025 11:13:14 -0400 Subject: [PATCH 2/2] x86_64: add `lret` encoding Closes #25608 --- src/codegen/x86_64/Encoding.zig | 2 +- src/codegen/x86_64/Mir.zig | 4 ++-- src/codegen/x86_64/encodings.zon | 2 ++ 3 files changed, 5 insertions(+), 3 deletions(-) diff --git a/src/codegen/x86_64/Encoding.zig b/src/codegen/x86_64/Encoding.zig index 3b41e0b07afd..6043fd06b50d 100644 --- a/src/codegen/x86_64/Encoding.zig +++ b/src/codegen/x86_64/Encoding.zig @@ -297,7 +297,7 @@ pub const Mnemonic = enum { jnc, jne, jng, jnge, jnl, jnle, jno, jnp, jns, jnz, jo, jp, jpe, jpo, jrcxz, js, jz, lahf, lar, lea, leave, lfence, lgdt, lidt, lldt, lmsw, loop, loope, loopne, lods, lodsb, lodsd, lodsq, lodsw, - lsl, ltr, + lret, lsl, ltr, mfence, mov, movbe, movs, movsb, movsd, movsq, movsw, movsx, movsxd, movzx, mul, diff --git a/src/codegen/x86_64/Mir.zig b/src/codegen/x86_64/Mir.zig index caf41ffb392d..de02fbc01e25 100644 --- a/src/codegen/x86_64/Mir.zig +++ b/src/codegen/x86_64/Mir.zig @@ -1732,7 +1732,7 @@ pub const Inst = struct { assert(@sizeOf(Data) == 8); } const Mnemonic = @import("Encoding.zig").Mnemonic; - if (@typeInfo(Mnemonic).@"enum".fields.len != 977 or + if (@typeInfo(Mnemonic).@"enum".fields.len != 978 or @typeInfo(Fixes).@"enum".fields.len != 231 or @typeInfo(Tag).@"enum".fields.len != 251) { @@ -1741,7 +1741,7 @@ pub const Inst = struct { return @src(); } }).src(); - @setEvalBranchQuota(1_750_000); + @setEvalBranchQuota(2_000_000); for (@typeInfo(Mnemonic).@"enum".fields) |mnemonic| { if (mnemonic.name[0] == '.') continue; for (@typeInfo(Fixes).@"enum".fields) |fixes| { diff --git a/src/codegen/x86_64/encodings.zon b/src/codegen/x86_64/encodings.zon index ea136569ce93..682a814e52e9 100644 --- a/src/codegen/x86_64/encodings.zon +++ b/src/codegen/x86_64/encodings.zon @@ -459,6 +459,8 @@ .{ .loope, .d, .{ .rel8 }, .{ 0xe1 }, 0, .none, .none }, .{ .loopne, .d, .{ .rel8 }, .{ 0xe0 }, 0, .none, .none }, + .{ .lret, .z, .{}, .{ 0xcb }, 0, .none, .none }, + .{ .lsl, .rm, .{ .r16, .rm16 }, .{ 0x0f, 0x03 }, 0, .none, .none }, .{ .lsl, .rm, .{ .r32, .r32_m16 }, .{ 0x0f, 0x03 }, 0, .none, .none }, .{ .lsl, .rm, .{ .r64, .r32_m16 }, .{ 0x0f, 0x03 }, 0, .none, .none },