From 2c88821c568f5d66296f571390716f4e91552841 Mon Sep 17 00:00:00 2001 From: Mathieu Suen Date: Mon, 16 Feb 2026 10:29:26 +0100 Subject: [PATCH] x64_86 fix: RMI can accept imm16 only for imul r16,r/m16 --- src/codegen/x86_64/CodeGen.zig | 24 +++++++++++++++++++++++- 1 file changed, 23 insertions(+), 1 deletion(-) diff --git a/src/codegen/x86_64/CodeGen.zig b/src/codegen/x86_64/CodeGen.zig index e3998c245e..dc433e7101 100644 --- a/src/codegen/x86_64/CodeGen.zig +++ b/src/codegen/x86_64/CodeGen.zig @@ -1850,11 +1850,33 @@ fn asmRegisterMemoryImmediate( m: Memory, imm: Immediate, ) !void { - if (switch (imm) { + if (reg.size() == .qword and tag[1] == .mul) { + // imul does not support imm16 for RMI r64, r/m64 + const payload = try self.addExtra(Mir.Imm32{ .imm = switch (imm) { + .signed => |s| @bitCast(s), + .unsigned => |u| @as(u32, @intCast(u)), + .nav, .uav, .lazy_sym, .extern_func => unreachable, + } }); + assert(payload + 1 == try self.addExtra(Mir.Memory.encode(m))); + _ = try self.addInst(.{ + .tag = tag[1], + .ops = switch (imm) { + .signed => .rmi_s, + .unsigned => .rmi_u, + .nav, .uav, .lazy_sym, .extern_func => unreachable, + }, + .data = .{ .rx = .{ + .fixes = tag[0], + .r1 = reg, + .payload = payload, + } }, + }); + } else if (switch (imm) { .signed => |s| if (std.math.cast(i16, s)) |x| @as(u16, @bitCast(x)) else null, .unsigned => |u| std.math.cast(u16, u), .nav, .uav, .lazy_sym, .extern_func => unreachable, }) |small_imm| { + // This is only valid for imul RMI r16, r/m16 _ = try self.addInst(.{ .tag = tag[1], .ops = .rmi,