authorgravatar for jacobly@ziglang.orgJacob Young <jacobly@ziglang.org> 2023-03-14 23:49:24-04:00
committergravatar for jacobly@ziglang.orgJacob Young <jacobly@ziglang.org> 2023-03-15 01:04:21-04:00
logba9d93dc9fd341f4dc08082f894fcbc1060cdcad
tree75e0b02f1179e3e13d89e740835787c398a9ed1f
parent05b12e677939effa9da147008071908a2a93fe35

x86_64: implement more binary immediate combinations


1 files changed, 29 insertions(+), 6 deletions(-)

src/arch/x86_64/CodeGen.zig+29-6
...@@ -3637,12 +3637,35 @@ fn genBinOpMir(self: *Self, mir_tag: Mir.Inst.Tag, dst_ty: Type, dst_mcv: MCValu...@@ -3637,12 +3637,35 @@ fn genBinOpMir(self: *Self, mir_tag: Mir.Inst.Tag, dst_ty: Type, dst_mcv: MCValu
3637 ),3637 ),
3638 },3638 },
3639 .immediate => |imm| {3639 .immediate => |imm| {
3640 // TODO3640 switch (abi_size) {
3641 try self.asmRegisterImmediate(3641 0 => unreachable,
3642 mir_tag,3642 1...4 => {
3643 registerAlias(dst_reg, abi_size),3643 try self.asmRegisterImmediate(
3644 Immediate.u(@intCast(u32, imm)),3644 mir_tag,
3645 );3645 registerAlias(dst_reg, abi_size),
3646 Immediate.u(@intCast(u32, imm)),
3647 );
3648 },
3649 5...8 => {
3650 if (math.cast(i32, @bitCast(i64, imm))) |small| {
3651 try self.asmRegisterImmediate(
3652 mir_tag,
3653 registerAlias(dst_reg, abi_size),
3654 Immediate.s(small),
3655 );
3656 } else {
3657 const tmp_reg = try self.register_manager.allocReg(null, gp);
3658 const tmp_alias = registerAlias(tmp_reg, abi_size);
3659 try self.asmRegisterImmediate(.mov, tmp_alias, Immediate.u(imm));
3660 try self.asmRegisterRegister(
3661 mir_tag,
3662 registerAlias(dst_reg, abi_size),
3663 tmp_alias,
3664 );
3665 }
3666 },
3667 else => return self.fail("TODO getBinOpMir implement large immediate ABI", .{}),
3668 }
3646 },3669 },
3647 .memory,3670 .memory,
3648 .linker_load,3671 .linker_load,