From b3f70db43899740c790b5118c2d420448191fd77 Mon Sep 17 00:00:00 2001 From: Jakub Konka Date: Tue, 4 Jan 2022 11:11:25 +0100 Subject: [PATCH] stage2: implement CMP stack value with immediate --- src/arch/x86_64/CodeGen.zig | 44 +++++++++++++++++++++++++++++++------ 1 file changed, 37 insertions(+), 7 deletions(-) diff --git a/src/arch/x86_64/CodeGen.zig b/src/arch/x86_64/CodeGen.zig index b8d832c5cf..516e175604 100644 --- a/src/arch/x86_64/CodeGen.zig +++ b/src/arch/x86_64/CodeGen.zig @@ -1785,6 +1785,15 @@ fn genBinMathOpMir( } }, .stack_offset => |off| { + if (off > math.maxInt(i32)) { + return self.fail("stack offset too large", .{}); + } + const abi_size = dst_ty.abiSize(self.target.*); + if (abi_size > 8) { + return self.fail("TODO implement ADD/SUB/CMP for stack dst with large ABI", .{}); + } + const adj_off = off + abi_size; + switch (src_mcv) { .none => unreachable, .undef => return self.genSetStack(dst_ty, off, .undef), @@ -1792,11 +1801,6 @@ fn genBinMathOpMir( .ptr_stack_offset => unreachable, .ptr_embedded_in_code => unreachable, .register => |src_reg| { - if (off > math.maxInt(i32)) { - return self.fail("stack offset too large", .{}); - } - const abi_size = dst_ty.abiSize(self.target.*); - const adj_off = off + abi_size; _ = try self.addInst(.{ .tag = mir_tag, .ops = (Mir.Ops{ @@ -1808,8 +1812,34 @@ fn genBinMathOpMir( }); }, .immediate => |imm| { - _ = imm; - return self.fail("TODO implement x86 ADD/SUB/CMP source immediate", .{}); + const tag: Mir.Inst.Tag = switch (mir_tag) { + .add => .add_mem_imm, + .@"or" => .or_mem_imm, + .@"and" => .and_mem_imm, + .sub => .sub_mem_imm, + .xor => .xor_mem_imm, + .cmp => .cmp_mem_imm, + else => unreachable, + }; + const flags: u2 = switch (abi_size) { + 1 => 0b00, + 2 => 0b01, + 4 => 0b10, + 8 => 0b11, + else => unreachable, + }; + const payload = try self.addExtra(Mir.ImmPair{ + .dest_off = -@intCast(i32, adj_off), + .operand = @bitCast(i32, @intCast(u32, imm)), + }); + _ = try self.addInst(.{ + .tag = tag, + .ops = (Mir.Ops{ + .reg1 = .rbp, + .flags = flags, + }).encode(), + .data = .{ .payload = payload }, + }); }, .embedded_in_code, .memory, .stack_offset => { return self.fail("TODO implement x86 ADD/SUB/CMP source memory", .{});