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