| ... | ... | @@ -118,11 +118,6 @@ const MCValue = union(enum) { |
| 118 | 118 | /// A pointer-sized integer that fits in a register. |
| 119 | 119 | /// If the type is a pointer, this is the pointer address in virtual address space. |
| 120 | 120 | immediate: u32, |
| 121 | | /// The constant was emitted into the code, at this offset. |
| 122 | | /// If the type is a pointer, it means the pointer address is embedded in the code. |
| 123 | | embedded_in_code: usize, |
| 124 | | /// The value is a pointer to a constant which was emitted into the code, at this offset. |
| 125 | | ptr_embedded_in_code: usize, |
| 126 | 121 | /// The value is in a target-specific register. |
| 127 | 122 | register: Register, |
| 128 | 123 | /// The value is in memory at a hard-coded address. |
| ... | ... | @@ -144,7 +139,7 @@ const MCValue = union(enum) { |
| 144 | 139 | |
| 145 | 140 | fn isMemory(mcv: MCValue) bool { |
| 146 | 141 | return switch (mcv) { |
| 147 | | .embedded_in_code, .memory, .stack_offset, .stack_argument_offset => true, |
| 142 | .memory, .stack_offset, .stack_argument_offset => true, |
| 148 | 143 | else => false, |
| 149 | 144 | }; |
| 150 | 145 | } |
| ... | ... | @@ -163,12 +158,10 @@ const MCValue = union(enum) { |
| 163 | 158 | .dead => unreachable, |
| 164 | 159 | |
| 165 | 160 | .immediate, |
| 166 | | .embedded_in_code, |
| 167 | 161 | .memory, |
| 168 | 162 | .compare_flags_unsigned, |
| 169 | 163 | .compare_flags_signed, |
| 170 | 164 | .ptr_stack_offset, |
| 171 | | .ptr_embedded_in_code, |
| 172 | 165 | .undef, |
| 173 | 166 | .stack_argument_offset, |
| 174 | 167 | => false, |
| ... | ... | @@ -1662,9 +1655,6 @@ fn load(self: *Self, dst_mcv: MCValue, ptr: MCValue, ptr_ty: Type) InnerError!vo |
| 1662 | 1655 | .compare_flags_signed => unreachable, |
| 1663 | 1656 | .immediate => |imm| try self.setRegOrMem(elem_ty, dst_mcv, .{ .memory = imm }), |
| 1664 | 1657 | .ptr_stack_offset => |off| try self.setRegOrMem(elem_ty, dst_mcv, .{ .stack_offset = off }), |
| 1665 | | .ptr_embedded_in_code => |off| { |
| 1666 | | try self.setRegOrMem(elem_ty, dst_mcv, .{ .embedded_in_code = off }); |
| 1667 | | }, |
| 1668 | 1658 | .register => |reg| { |
| 1669 | 1659 | self.register_manager.freezeRegs(&.{reg}); |
| 1670 | 1660 | defer self.register_manager.unfreezeRegs(&.{reg}); |
| ... | ... | @@ -1673,7 +1663,6 @@ fn load(self: *Self, dst_mcv: MCValue, ptr: MCValue, ptr_ty: Type) InnerError!vo |
| 1673 | 1663 | .dead => unreachable, |
| 1674 | 1664 | .undef => unreachable, |
| 1675 | 1665 | .compare_flags_signed, .compare_flags_unsigned => unreachable, |
| 1676 | | .embedded_in_code => unreachable, |
| 1677 | 1666 | .register => |dst_reg| { |
| 1678 | 1667 | try self.genLdrRegister(dst_reg, reg, elem_ty); |
| 1679 | 1668 | }, |
| ... | ... | @@ -1711,7 +1700,6 @@ fn load(self: *Self, dst_mcv: MCValue, ptr: MCValue, ptr_ty: Type) InnerError!vo |
| 1711 | 1700 | } |
| 1712 | 1701 | }, |
| 1713 | 1702 | .memory, |
| 1714 | | .embedded_in_code, |
| 1715 | 1703 | .stack_offset, |
| 1716 | 1704 | .stack_argument_offset, |
| 1717 | 1705 | => { |
| ... | ... | @@ -1767,9 +1755,6 @@ fn store(self: *Self, ptr: MCValue, value: MCValue, ptr_ty: Type, value_ty: Type |
| 1767 | 1755 | .ptr_stack_offset => |off| { |
| 1768 | 1756 | try self.genSetStack(value_ty, off, value); |
| 1769 | 1757 | }, |
| 1770 | | .ptr_embedded_in_code => |off| { |
| 1771 | | try self.setRegOrMem(value_ty, .{ .embedded_in_code = off }, value); |
| 1772 | | }, |
| 1773 | 1758 | .register => |addr_reg| { |
| 1774 | 1759 | self.register_manager.freezeRegs(&.{addr_reg}); |
| 1775 | 1760 | defer self.register_manager.unfreezeRegs(&.{addr_reg}); |
| ... | ... | @@ -1829,7 +1814,6 @@ fn store(self: *Self, ptr: MCValue, value: MCValue, ptr_ty: Type, value_ty: Type |
| 1829 | 1814 | } |
| 1830 | 1815 | }, |
| 1831 | 1816 | .memory, |
| 1832 | | .embedded_in_code, |
| 1833 | 1817 | .stack_offset, |
| 1834 | 1818 | .stack_argument_offset, |
| 1835 | 1819 | => { |
| ... | ... | @@ -2712,12 +2696,10 @@ fn airCall(self: *Self, inst: Air.Inst.Index, modifier: std.builtin.CallOptions. |
| 2712 | 2696 | .immediate => unreachable, |
| 2713 | 2697 | .unreach => unreachable, |
| 2714 | 2698 | .dead => unreachable, |
| 2715 | | .embedded_in_code => unreachable, |
| 2716 | 2699 | .memory => unreachable, |
| 2717 | 2700 | .compare_flags_signed => unreachable, |
| 2718 | 2701 | .compare_flags_unsigned => unreachable, |
| 2719 | 2702 | .ptr_stack_offset => unreachable, |
| 2720 | | .ptr_embedded_in_code => unreachable, |
| 2721 | 2703 | .register => |reg| { |
| 2722 | 2704 | try self.register_manager.getReg(reg, null); |
| 2723 | 2705 | try self.genSetReg(arg_ty, reg, arg_mcv); |
| ... | ... | @@ -3616,7 +3598,6 @@ fn genSetStack(self: *Self, ty: Type, stack_offset: u32, mcv: MCValue) InnerErro |
| 3616 | 3598 | .compare_flags_signed, |
| 3617 | 3599 | .immediate, |
| 3618 | 3600 | .ptr_stack_offset, |
| 3619 | | .ptr_embedded_in_code, |
| 3620 | 3601 | => { |
| 3621 | 3602 | const reg = try self.copyToTmpRegister(ty, mcv); |
| 3622 | 3603 | return self.genSetStack(ty, stack_offset, MCValue{ .register = reg }); |
| ... | ... | @@ -3669,7 +3650,6 @@ fn genSetStack(self: *Self, ty: Type, stack_offset: u32, mcv: MCValue) InnerErro |
| 3669 | 3650 | } |
| 3670 | 3651 | }, |
| 3671 | 3652 | .memory, |
| 3672 | | .embedded_in_code, |
| 3673 | 3653 | .stack_argument_offset, |
| 3674 | 3654 | .stack_offset, |
| 3675 | 3655 | => { |
| ... | ... | @@ -3716,7 +3696,6 @@ fn genSetStack(self: *Self, ty: Type, stack_offset: u32, mcv: MCValue) InnerErro |
| 3716 | 3696 | } }, |
| 3717 | 3697 | }); |
| 3718 | 3698 | }, |
| 3719 | | .embedded_in_code => return self.fail("TODO genSetStack with src={}", .{mcv}), |
| 3720 | 3699 | else => unreachable, |
| 3721 | 3700 | } |
| 3722 | 3701 | |
| ... | ... | @@ -3736,7 +3715,6 @@ fn genSetStack(self: *Self, ty: Type, stack_offset: u32, mcv: MCValue) InnerErro |
| 3736 | 3715 | fn genSetReg(self: *Self, ty: Type, reg: Register, mcv: MCValue) InnerError!void { |
| 3737 | 3716 | switch (mcv) { |
| 3738 | 3717 | .dead => unreachable, |
| 3739 | | .ptr_embedded_in_code => unreachable, |
| 3740 | 3718 | .unreach, .none => return, // Nothing to do. |
| 3741 | 3719 | .undef => { |
| 3742 | 3720 | if (!self.wantSafety()) |
| ... | ... | @@ -3996,7 +3974,6 @@ fn genSetReg(self: *Self, ty: Type, reg: Register, mcv: MCValue) InnerError!void |
| 3996 | 3974 | } }, |
| 3997 | 3975 | }); |
| 3998 | 3976 | }, |
| 3999 | | else => return self.fail("TODO implement getSetReg for arm {}", .{mcv}), |
| 4000 | 3977 | } |
| 4001 | 3978 | } |
| 4002 | 3979 | |
| ... | ... | @@ -4060,7 +4037,6 @@ fn genSetStackArgument(self: *Self, ty: Type, stack_offset: u32, mcv: MCValue) I |
| 4060 | 4037 | .stack_offset, |
| 4061 | 4038 | .memory, |
| 4062 | 4039 | .stack_argument_offset, |
| 4063 | | .embedded_in_code, |
| 4064 | 4040 | => { |
| 4065 | 4041 | if (abi_size <= 4) { |
| 4066 | 4042 | const reg = try self.copyToTmpRegister(ty, mcv); |
| ... | ... | @@ -4086,9 +4062,7 @@ fn genSetStackArgument(self: *Self, ty: Type, stack_offset: u32, mcv: MCValue) I |
| 4086 | 4062 | try self.genSetReg(ptr_ty, src_reg, .{ .ptr_stack_offset = off }); |
| 4087 | 4063 | }, |
| 4088 | 4064 | .memory => |addr| try self.genSetReg(ptr_ty, src_reg, .{ .immediate = @intCast(u32, addr) }), |
| 4089 | | .stack_argument_offset, |
| 4090 | | .embedded_in_code, |
| 4091 | | => return self.fail("TODO genSetStackArgument src={}", .{mcv}), |
| 4065 | .stack_argument_offset => return self.fail("TODO genSetStackArgument src={}", .{mcv}), |
| 4092 | 4066 | else => unreachable, |
| 4093 | 4067 | } |
| 4094 | 4068 | |
| ... | ... | @@ -4117,7 +4091,6 @@ fn genSetStackArgument(self: *Self, ty: Type, stack_offset: u32, mcv: MCValue) I |
| 4117 | 4091 | .compare_flags_signed, |
| 4118 | 4092 | .immediate, |
| 4119 | 4093 | .ptr_stack_offset, |
| 4120 | | .ptr_embedded_in_code, |
| 4121 | 4094 | => { |
| 4122 | 4095 | const reg = try self.copyToTmpRegister(ty, mcv); |
| 4123 | 4096 | return self.genSetStackArgument(ty, stack_offset, MCValue{ .register = reg }); |