| ... | ... | @@ -2732,15 +2732,46 @@ fn store(self: *Self, ptr: MCValue, value: MCValue, ptr_ty: Type, value_ty: Type |
| 2732 | 2732 | } |
| 2733 | 2733 | }, |
| 2734 | 2734 | .register => |src_reg| { |
| 2735 | | _ = try self.addInst(.{ |
| 2736 | | .tag = .mov, |
| 2737 | | .ops = Mir.Inst.Ops.encode(.{ |
| 2738 | | .reg1 = reg.to64(), |
| 2739 | | .reg2 = registerAlias(src_reg, @intCast(u32, abi_size)), |
| 2740 | | .flags = 0b10, |
| 2741 | | }), |
| 2742 | | .data = .{ .imm = 0 }, |
| 2743 | | }); |
| 2735 | const src_reg_lock = self.register_manager.lockReg(src_reg); |
| 2736 | defer if (src_reg_lock) |lock| self.register_manager.unlockReg(lock); |
| 2737 | |
| 2738 | // TODO common code-path with genSetStack, refactor! |
| 2739 | if (!math.isPowerOfTwo(abi_size)) { |
| 2740 | const tmp_reg = try self.copyToTmpRegister(value_ty, value); |
| 2741 | |
| 2742 | var next_offset: i32 = 0; |
| 2743 | var remainder = abi_size; |
| 2744 | while (remainder > 0) { |
| 2745 | const nearest_power_of_two = @as(u6, 1) << math.log2_int(u3, @intCast(u3, remainder)); |
| 2746 | |
| 2747 | _ = try self.addInst(.{ |
| 2748 | .tag = .mov, |
| 2749 | .ops = Mir.Inst.Ops.encode(.{ |
| 2750 | .reg1 = reg.to64(), |
| 2751 | .reg2 = registerAlias(tmp_reg, nearest_power_of_two), |
| 2752 | .flags = 0b10, |
| 2753 | }), |
| 2754 | .data = .{ .imm = @bitCast(u32, -next_offset) }, |
| 2755 | }); |
| 2756 | |
| 2757 | if (nearest_power_of_two > 1) { |
| 2758 | try self.genShiftBinOpMir(.shr, value_ty, tmp_reg, .{ .immediate = nearest_power_of_two * 8 }); |
| 2759 | } |
| 2760 | |
| 2761 | remainder -= nearest_power_of_two; |
| 2762 | next_offset -= nearest_power_of_two; |
| 2763 | } |
| 2764 | } else { |
| 2765 | _ = try self.addInst(.{ |
| 2766 | .tag = .mov, |
| 2767 | .ops = Mir.Inst.Ops.encode(.{ |
| 2768 | .reg1 = reg.to64(), |
| 2769 | .reg2 = registerAlias(src_reg, @intCast(u32, abi_size)), |
| 2770 | .flags = 0b10, |
| 2771 | }), |
| 2772 | .data = .{ .imm = 0 }, |
| 2773 | }); |
| 2774 | } |
| 2744 | 2775 | }, |
| 2745 | 2776 | .got_load, |
| 2746 | 2777 | .direct_load, |