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
36373637 ),
36383638 },
36393639 .immediate => |imm| {
3640 // TODO
3641 try self.asmRegisterImmediate(
3642 mir_tag,
3643 registerAlias(dst_reg, abi_size),
3644 Immediate.u(@intCast(u32, imm)),
3645 );
3640 switch (abi_size) {
3641 0 => unreachable,
3642 1...4 => {
3643 try self.asmRegisterImmediate(
3644 mir_tag,
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 }
36463669 },
36473670 .memory,
36483671 .linker_load,