| ... | ... | @@ -3637,12 +3637,35 @@ fn genBinOpMir(self: *Self, mir_tag: Mir.Inst.Tag, dst_ty: Type, dst_mcv: MCValu |
| 3637 | 3637 | ), |
| 3638 | 3638 | }, |
| 3639 | 3639 | .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 | } |
| 3646 | 3669 | }, |
| 3647 | 3670 | .memory, |
| 3648 | 3671 | .linker_load, |