authorgravatar for kubkon@jakubkonka.comJakub Konka <kubkon@jakubkonka.com> 2022-01-04 11:11:25+01:00
committergravatar for kubkon@jakubkonka.comJakub Konka <kubkon@jakubkonka.com> 2022-01-06 09:54:33+01:00
logb3f70db43899740c790b5118c2d420448191fd77
treea835609f5471fdeec88f0e963f8de3837e484fbe
parent1d55e4cae10e95841a5fd457aed6c84595994fe1

stage2: implement CMP stack value with immediate


1 files changed, 37 insertions(+), 7 deletions(-)

src/arch/x86_64/CodeGen.zig+37-7
......@@ -1785,6 +1785,15 @@ fn genBinMathOpMir(
17851785 }
17861786 },
17871787 .stack_offset => |off| {
1788 if (off > math.maxInt(i32)) {
1789 return self.fail("stack offset too large", .{});
1790 }
1791 const abi_size = dst_ty.abiSize(self.target.*);
1792 if (abi_size > 8) {
1793 return self.fail("TODO implement ADD/SUB/CMP for stack dst with large ABI", .{});
1794 }
1795 const adj_off = off + abi_size;
1796
17881797 switch (src_mcv) {
17891798 .none => unreachable,
17901799 .undef => return self.genSetStack(dst_ty, off, .undef),
......@@ -1792,11 +1801,6 @@ fn genBinMathOpMir(
17921801 .ptr_stack_offset => unreachable,
17931802 .ptr_embedded_in_code => unreachable,
17941803 .register => |src_reg| {
1795 if (off > math.maxInt(i32)) {
1796 return self.fail("stack offset too large", .{});
1797 }
1798 const abi_size = dst_ty.abiSize(self.target.*);
1799 const adj_off = off + abi_size;
18001804 _ = try self.addInst(.{
18011805 .tag = mir_tag,
18021806 .ops = (Mir.Ops{
......@@ -1808,8 +1812,34 @@ fn genBinMathOpMir(
18081812 });
18091813 },
18101814 .immediate => |imm| {
1811 _ = imm;
1812 return self.fail("TODO implement x86 ADD/SUB/CMP source immediate", .{});
1815 const tag: Mir.Inst.Tag = switch (mir_tag) {
1816 .add => .add_mem_imm,
1817 .@"or" => .or_mem_imm,
1818 .@"and" => .and_mem_imm,
1819 .sub => .sub_mem_imm,
1820 .xor => .xor_mem_imm,
1821 .cmp => .cmp_mem_imm,
1822 else => unreachable,
1823 };
1824 const flags: u2 = switch (abi_size) {
1825 1 => 0b00,
1826 2 => 0b01,
1827 4 => 0b10,
1828 8 => 0b11,
1829 else => unreachable,
1830 };
1831 const payload = try self.addExtra(Mir.ImmPair{
1832 .dest_off = -@intCast(i32, adj_off),
1833 .operand = @bitCast(i32, @intCast(u32, imm)),
1834 });
1835 _ = try self.addInst(.{
1836 .tag = tag,
1837 .ops = (Mir.Ops{
1838 .reg1 = .rbp,
1839 .flags = flags,
1840 }).encode(),
1841 .data = .{ .payload = payload },
1842 });
18131843 },
18141844 .embedded_in_code, .memory, .stack_offset => {
18151845 return self.fail("TODO implement x86 ADD/SUB/CMP source memory", .{});