authorgravatar for kubkon@jakubkonka.comJakub Konka <kubkon@jakubkonka.com> 2021-12-20 18:20:06+01:00
committergravatar for kubkon@jakubkonka.comJakub Konka <kubkon@jakubkonka.com> 2021-12-20 18:20:06+01:00
log71c5eebd32d44ca01fedcb48674c5e7185f10289
tree2f58bd79d159f7c8952af53fe68e78e17e312003
parent4a40c0a80c8f7014097f3ac6f523c7e21cda80a9

stage2: remove obsolete MOV variant 0b11

* variant `0b11` when both `reg1 != .none` and `reg2 != .none` is identical to `0b00` therefore it can safely be removed * fix proper destination register size calculation when setting register from another source register

3 files changed, 3 insertions(+), 14 deletions(-)

src/arch/x86_64/CodeGen.zig+1-2
......@@ -2968,9 +2968,8 @@ fn genSetReg(self: *Self, ty: Type, reg: Register, mcv: MCValue) InnerError!void
29682968 _ = try self.addInst(.{
29692969 .tag = .mov,
29702970 .ops = (Mir.Ops{
2971 .reg1 = reg,
2971 .reg1 = registerAlias(reg, @divExact(src_reg.size(), 8)),
29722972 .reg2 = src_reg,
2973 .flags = 0b11,
29742973 }).encode(),
29752974 .data = undefined,
29762975 });
src/arch/x86_64/Emit.zig+1-11
......@@ -1119,17 +1119,7 @@ fn mirMovImpl(
11191119 encoder.imm32(imm_op);
11201120 break :blk;
11211121 }
1122 // mov reg1, reg2
1123 // RM
1124 const opc: u8 = if (ops.reg1.size() == 8) 0x8a else 0x8b;
1125 const encoder = try Encoder.init(code, 3);
1126 encoder.rex(.{
1127 .w = ops.reg1.size() == 64 and ops.reg2.size() == 64,
1128 .r = ops.reg1.isExtended(),
1129 .b = ops.reg2.isExtended(),
1130 });
1131 encoder.opcode_1byte(opc);
1132 encoder.modRm_direct(ops.reg1.lowId(), ops.reg2.lowId());
1122 return EmitResult.err(allocator, src_loc, "TODO unused variant: mov reg1, reg2, 0b11", .{});
11331123 },
11341124 }
11351125 return EmitResult.ok();
src/arch/x86_64/Mir.zig+1-1
......@@ -145,7 +145,7 @@ pub const Inst = struct {
145145 /// 0b10 [reg1 + imm32], reg2
146146 /// 0b10 [reg1 + 0], imm32
147147 /// 0b11 [reg1 + imm32], imm32
148 /// 0b11 reg1, reg2 (RM)
148 /// 0b11 AVAILABLE
149149 /// Notes:
150150 /// * If reg2 is `none` then it means Data field `imm` is used as the immediate.
151151 /// * When two imm32 values are required, Data field `payload` points at `ImmPair`.