| ... | ... | @@ -1611,11 +1611,7 @@ fn airLoad(self: *Self, inst: Air.Inst.Index) !void { |
| 1611 | 1611 | return self.finishAir(inst, result, .{ ty_op.operand, .none, .none }); |
| 1612 | 1612 | } |
| 1613 | 1613 | |
| 1614 | | fn airStore(self: *Self, inst: Air.Inst.Index) !void { |
| 1615 | | const bin_op = self.air.instructions.items(.data)[inst].bin_op; |
| 1616 | | const ptr = try self.resolveInst(bin_op.lhs); |
| 1617 | | const value = try self.resolveInst(bin_op.rhs); |
| 1618 | | const elem_ty = self.air.typeOf(bin_op.rhs); |
| 1614 | fn store(self: *Self, ptr: MCValue, value: MCValue, ptr_ty: Type, value_ty: Type) InnerError!void { |
| 1619 | 1615 | switch (ptr) { |
| 1620 | 1616 | .none => unreachable, |
| 1621 | 1617 | .undef => unreachable, |
| ... | ... | @@ -1624,13 +1620,13 @@ fn airStore(self: *Self, inst: Air.Inst.Index) !void { |
| 1624 | 1620 | .compare_flags_unsigned => unreachable, |
| 1625 | 1621 | .compare_flags_signed => unreachable, |
| 1626 | 1622 | .immediate => |imm| { |
| 1627 | | try self.setRegOrMem(elem_ty, .{ .memory = imm }, value); |
| 1623 | try self.setRegOrMem(value_ty, .{ .memory = imm }, value); |
| 1628 | 1624 | }, |
| 1629 | 1625 | .ptr_stack_offset => |off| { |
| 1630 | | try self.genSetStack(elem_ty, off, value); |
| 1626 | try self.genSetStack(value_ty, off, value); |
| 1631 | 1627 | }, |
| 1632 | 1628 | .ptr_embedded_in_code => |off| { |
| 1633 | | try self.setRegOrMem(elem_ty, .{ .embedded_in_code = off }, value); |
| 1629 | try self.setRegOrMem(value_ty, .{ .embedded_in_code = off }, value); |
| 1634 | 1630 | }, |
| 1635 | 1631 | .embedded_in_code => { |
| 1636 | 1632 | return self.fail("TODO implement storing to MCValue.embedded_in_code", .{}); |
| ... | ... | @@ -1638,13 +1634,24 @@ fn airStore(self: *Self, inst: Air.Inst.Index) !void { |
| 1638 | 1634 | .register => { |
| 1639 | 1635 | return self.fail("TODO implement storing to MCValue.register", .{}); |
| 1640 | 1636 | }, |
| 1641 | | .memory => { |
| 1642 | | return self.fail("TODO implement storing to MCValue.memory", .{}); |
| 1643 | | }, |
| 1644 | | .stack_offset => { |
| 1645 | | return self.fail("TODO implement storing to MCValue.stack_offset", .{}); |
| 1637 | .memory, |
| 1638 | .stack_offset, |
| 1639 | => { |
| 1640 | const addr_reg = try self.copyToTmpRegister(ptr_ty, ptr); |
| 1641 | try self.store(.{ .register = addr_reg }, value, ptr_ty, value_ty); |
| 1646 | 1642 | }, |
| 1647 | 1643 | } |
| 1644 | } |
| 1645 | |
| 1646 | fn airStore(self: *Self, inst: Air.Inst.Index) !void { |
| 1647 | const bin_op = self.air.instructions.items(.data)[inst].bin_op; |
| 1648 | const ptr = try self.resolveInst(bin_op.lhs); |
| 1649 | const value = try self.resolveInst(bin_op.rhs); |
| 1650 | const ptr_ty = self.air.typeOf(bin_op.lhs); |
| 1651 | const value_ty = self.air.typeOf(bin_op.rhs); |
| 1652 | |
| 1653 | try self.store(ptr, value, ptr_ty, value_ty); |
| 1654 | |
| 1648 | 1655 | return self.finishAir(inst, .dead, .{ bin_op.lhs, bin_op.rhs, .none }); |
| 1649 | 1656 | } |
| 1650 | 1657 | |