Commit 219c1261a5

Jakub Konka <kubkon@jakubkonka.com>
2023-03-07 20:22:45
x86_64: all behavior tests passing
1 parent 292f91a
Changed files (4)
src/arch/x86_64/CodeGen.zig
@@ -2785,7 +2785,7 @@ fn store(self: *Self, ptr: MCValue, value: MCValue, ptr_ty: Type, value_ty: Type
                             // introduce new MIR tag specifically for mov [reg + 0], imm
                             const payload = try self.addExtra(Mir.ImmPair{
                                 .dest_off = 0,
-                                .operand = @intCast(u32, imm),
+                                .operand = @truncate(u32, imm),
                             });
                             _ = try self.addInst(.{
                                 .tag = .mov_mem_imm,
@@ -5385,31 +5385,33 @@ fn genSetStackArg(self: *Self, ty: Type, stack_offset: i32, mcv: MCValue) InnerE
             return self.genSetStackArg(ty, stack_offset, .{ .register = reg });
         },
         .immediate => |imm| {
+            _ = imm;
             switch (abi_size) {
-                1, 2, 4 => {
-                    // We have a positive stack offset value but we want a twos complement negative
-                    // offset from rbp, which is at the top of the stack frame.
-                    // mov [rbp+offset], immediate
-                    const flags: u2 = switch (abi_size) {
-                        1 => 0b00,
-                        2 => 0b01,
-                        4 => 0b10,
-                        else => unreachable,
-                    };
-                    const payload = try self.addExtra(Mir.ImmPair{
-                        .dest_off = -stack_offset,
-                        .operand = @intCast(u32, imm),
-                    });
-                    _ = try self.addInst(.{
-                        .tag = .mov_mem_imm,
-                        .ops = Mir.Inst.Ops.encode(.{
-                            .reg1 = .rsp,
-                            .flags = flags,
-                        }),
-                        .data = .{ .payload = payload },
-                    });
-                },
-                8 => {
+                // TODO
+                // 1, 2, 4 => {
+                //     // We have a positive stack offset value but we want a twos complement negative
+                //     // offset from rbp, which is at the top of the stack frame.
+                //     // mov [rbp+offset], immediate
+                //     const flags: u2 = switch (abi_size) {
+                //         1 => 0b00,
+                //         2 => 0b01,
+                //         4 => 0b10,
+                //         else => unreachable,
+                //     };
+                //     const payload = try self.addExtra(Mir.ImmPair{
+                //         .dest_off = -stack_offset,
+                //         .operand = @intCast(u32, imm),
+                //     });
+                //     _ = try self.addInst(.{
+                //         .tag = .mov_mem_imm,
+                //         .ops = Mir.Inst.Ops.encode(.{
+                //             .reg1 = .rsp,
+                //             .flags = flags,
+                //         }),
+                //         .data = .{ .payload = payload },
+                //     });
+                // },
+                1, 2, 4, 8 => {
                     const reg = try self.copyToTmpRegister(ty, mcv);
                     return self.genSetStackArg(ty, stack_offset, MCValue{ .register = reg });
                 },
@@ -5543,7 +5545,7 @@ fn genSetStack(self: *Self, ty: Type, stack_offset: i32, mcv: MCValue, opts: Inl
                     assert(ty.isError());
                     const payload = try self.addExtra(Mir.ImmPair{
                         .dest_off = -stack_offset,
-                        .operand = @intCast(u32, x_big),
+                        .operand = @truncate(u32, x_big),
                     });
                     _ = try self.addInst(.{
                         .tag = .mov_mem_imm,
@@ -5557,7 +5559,7 @@ fn genSetStack(self: *Self, ty: Type, stack_offset: i32, mcv: MCValue, opts: Inl
                 1, 2, 4 => {
                     const payload = try self.addExtra(Mir.ImmPair{
                         .dest_off = -stack_offset,
-                        .operand = @intCast(u32, x_big),
+                        .operand = @truncate(u32, x_big),
                     });
                     _ = try self.addInst(.{
                         .tag = .mov_mem_imm,
@@ -7020,7 +7022,7 @@ fn truncateRegister(self: *Self, ty: Type, reg: Register) !void {
         .unsigned => {
             const shift = @intCast(u6, max_reg_bit_width - int_info.bits);
             const mask = (~@as(u64, 0)) >> shift;
-            if (int_info.bits <= 32) {
+            if (int_info.bits < 32) {
                 try self.genBinOpMir(.@"and", Type.usize, .{ .register = reg }, .{ .immediate = mask });
             } else {
                 const tmp_reg = try self.copyToTmpRegister(Type.usize, .{ .immediate = mask });
src/arch/x86_64/Emit.zig
@@ -612,12 +612,17 @@ fn mirArithMemImm(emit: *Emit, mnemonic: Instruction.Mnemonic, inst: Mir.Inst.In
         0b10 => .dword,
         0b11 => .qword,
     };
+    const imm = switch (ops.flags) {
+        0b00 => @truncate(u8, imm_pair.operand),
+        0b01 => @truncate(u16, imm_pair.operand),
+        0b10, 0b11 => @truncate(u32, imm_pair.operand),
+    };
     return emit.encode(mnemonic, .{
         .op1 = .{ .mem = Memory.sib(ptr_size, .{
             .disp = imm_pair.dest_off,
             .base = ops.reg1,
         }) },
-        .op2 = .{ .imm = Immediate.u(imm_pair.operand) },
+        .op2 = .{ .imm = Immediate.u(imm) },
     });
 }
 
src/arch/x86_64/encoder.zig
@@ -108,7 +108,7 @@ pub const Instruction = struct {
             .op3 = args.op3,
             .op4 = args.op4,
         })) orelse {
-            std.log.debug("{s} {s} {s} {s} {s}", .{
+            std.log.warn("{s} {s} {s} {s} {s}", .{
                 @tagName(mnemonic),
                 @tagName(Encoding.Op.fromOperand(args.op1)),
                 @tagName(Encoding.Op.fromOperand(args.op2)),
src/arch/x86_64/Encoding.zig
@@ -544,6 +544,10 @@ pub const Op = enum {
                 }
                 if (op.isImmediate() and target.isImmediate()) {
                     switch (target) {
+                        .imm64 => switch (op) {
+                            .unity, .imm8s, .imm8, .imm16s, .imm16, .imm32s, .imm32, .imm64 => return true,
+                            else => return op == target,
+                        },
                         .imm32s, .rel32 => switch (op) {
                             .unity, .imm8s, .imm8, .imm16s, .imm16, .imm32s => return true,
                             else => return op == target,