| ... | @@ -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 | // TODO | 3640 | 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, |