| ... | @@ -1568,7 +1568,6 @@ fn store(self: *Self, ptr: MCValue, value: MCValue, ptr_ty: Type, value_ty: Type | ... | @@ -1568,7 +1568,6 @@ fn store(self: *Self, ptr: MCValue, value: MCValue, ptr_ty: Type, value_ty: Type |
| 1568 | .dead => unreachable, | 1568 | .dead => unreachable, |
| 1569 | .compare_flags_unsigned => unreachable, | 1569 | .compare_flags_unsigned => unreachable, |
| 1570 | .compare_flags_signed => unreachable, | 1570 | .compare_flags_signed => unreachable, |
| 1571 | .stack_argument_offset => unreachable, | | |
| 1572 | .immediate => |imm| { | 1571 | .immediate => |imm| { |
| 1573 | try self.setRegOrMem(value_ty, .{ .memory = imm }, value); | 1572 | try self.setRegOrMem(value_ty, .{ .memory = imm }, value); |
| 1574 | }, | 1573 | }, |
| ... | @@ -1610,13 +1609,12 @@ fn store(self: *Self, ptr: MCValue, value: MCValue, ptr_ty: Type, value_ty: Type | ... | @@ -1610,13 +1609,12 @@ fn store(self: *Self, ptr: MCValue, value: MCValue, ptr_ty: Type, value_ty: Type |
| 1610 | }, | 1609 | }, |
| 1611 | } | 1610 | } |
| 1612 | }, | 1611 | }, |
| 1613 | .memory => { | 1612 | .memory, |
| 1614 | // const addr_reg = try self.copyToTmpRegister(ptr_ty, ptr); | 1613 | .stack_offset, |
| 1615 | // try self.store(.{ .register = addr_reg }, value, ptr_ty, value_ty); | 1614 | .stack_argument_offset, |
| 1616 | return self.fail("TODO implement storing to MCValue.memory", .{}); | 1615 | => { |
| 1617 | }, | 1616 | const addr_reg = try self.copyToTmpRegister(ptr_ty, ptr); |
| 1618 | .stack_offset => { | 1617 | try self.store(.{ .register = addr_reg }, value, ptr_ty, value_ty); |
| 1619 | return self.fail("TODO implement storing to MCValue.stack_offset", .{}); | | |
| 1620 | }, | 1618 | }, |
| 1621 | } | 1619 | } |
| 1622 | } | 1620 | } |
| ... | @@ -2275,6 +2273,8 @@ fn airCall(self: *Self, inst: Air.Inst.Index) !void { | ... | @@ -2275,6 +2273,8 @@ fn airCall(self: *Self, inst: Air.Inst.Index) !void { |
| 2275 | .memory => unreachable, | 2273 | .memory => unreachable, |
| 2276 | .compare_flags_signed => unreachable, | 2274 | .compare_flags_signed => unreachable, |
| 2277 | .compare_flags_unsigned => unreachable, | 2275 | .compare_flags_unsigned => unreachable, |
| | 2276 | .ptr_stack_offset => unreachable, |
| | 2277 | .ptr_embedded_in_code => unreachable, |
| 2278 | .register => |reg| { | 2278 | .register => |reg| { |
| 2279 | try self.register_manager.getReg(reg, null); | 2279 | try self.register_manager.getReg(reg, null); |
| 2280 | try self.genSetReg(arg_ty, reg, arg_mcv); | 2280 | try self.genSetReg(arg_ty, reg, arg_mcv); |
| ... | @@ -2285,12 +2285,6 @@ fn airCall(self: *Self, inst: Air.Inst.Index) !void { | ... | @@ -2285,12 +2285,6 @@ fn airCall(self: *Self, inst: Air.Inst.Index) !void { |
| 2285 | info.stack_byte_count - offset, | 2285 | info.stack_byte_count - offset, |
| 2286 | arg_mcv, | 2286 | arg_mcv, |
| 2287 | ), | 2287 | ), |
| 2288 | .ptr_stack_offset => { | | |
| 2289 | return self.fail("TODO implement calling with MCValue.ptr_stack_offset arg", .{}); | | |
| 2290 | }, | | |
| 2291 | .ptr_embedded_in_code => { | | |
| 2292 | return self.fail("TODO implement calling with MCValue.ptr_embedded_in_code arg", .{}); | | |
| 2293 | }, | | |
| 2294 | } | 2288 | } |
| 2295 | } | 2289 | } |
| 2296 | | 2290 | |
| ... | @@ -3250,7 +3244,6 @@ fn genSetStack(self: *Self, ty: Type, stack_offset: u32, mcv: MCValue) InnerErro | ... | @@ -3250,7 +3244,6 @@ fn genSetStack(self: *Self, ty: Type, stack_offset: u32, mcv: MCValue) InnerErro |
| 3250 | fn genSetReg(self: *Self, ty: Type, reg: Register, mcv: MCValue) InnerError!void { | 3244 | fn genSetReg(self: *Self, ty: Type, reg: Register, mcv: MCValue) InnerError!void { |
| 3251 | switch (mcv) { | 3245 | switch (mcv) { |
| 3252 | .dead => unreachable, | 3246 | .dead => unreachable, |
| 3253 | .ptr_stack_offset => unreachable, | | |
| 3254 | .ptr_embedded_in_code => unreachable, | 3247 | .ptr_embedded_in_code => unreachable, |
| 3255 | .unreach, .none => return, // Nothing to do. | 3248 | .unreach, .none => return, // Nothing to do. |
| 3256 | .undef => { | 3249 | .undef => { |
| ... | @@ -3259,6 +3252,24 @@ fn genSetReg(self: *Self, ty: Type, reg: Register, mcv: MCValue) InnerError!void | ... | @@ -3259,6 +3252,24 @@ fn genSetReg(self: *Self, ty: Type, reg: Register, mcv: MCValue) InnerError!void |
| 3259 | // Write the debug undefined value. | 3252 | // Write the debug undefined value. |
| 3260 | return self.genSetReg(ty, reg, .{ .immediate = 0xaaaaaaaa }); | 3253 | return self.genSetReg(ty, reg, .{ .immediate = 0xaaaaaaaa }); |
| 3261 | }, | 3254 | }, |
| | 3255 | .ptr_stack_offset => |unadjusted_off| { |
| | 3256 | // TODO: maybe addressing from sp instead of fp |
| | 3257 | const elem_ty = ty.childType(); |
| | 3258 | const abi_size = @intCast(u32, elem_ty.abiSize(self.target.*)); |
| | 3259 | const adj_off = unadjusted_off + abi_size; |
| | 3260 | |
| | 3261 | const op = Instruction.Operand.fromU32(adj_off) orelse |
| | 3262 | return self.fail("TODO larger stack offsets", .{}); |
| | 3263 | |
| | 3264 | _ = try self.addInst(.{ |
| | 3265 | .tag = .sub, |
| | 3266 | .data = .{ .rr_op = .{ |
| | 3267 | .rd = reg, |
| | 3268 | .rn = .fp, |
| | 3269 | .op = op, |
| | 3270 | } }, |
| | 3271 | }); |
| | 3272 | }, |
| 3262 | .compare_flags_unsigned, | 3273 | .compare_flags_unsigned, |
| 3263 | .compare_flags_signed, | 3274 | .compare_flags_signed, |
| 3264 | => |op| { | 3275 | => |op| { |
| ... | @@ -3575,7 +3586,8 @@ fn genSetStackArgument(self: *Self, ty: Type, stack_offset: u32, mcv: MCValue) I | ... | @@ -3575,7 +3586,8 @@ fn genSetStackArgument(self: *Self, ty: Type, stack_offset: u32, mcv: MCValue) I |
| 3575 | } | 3586 | } |
| 3576 | }, | 3587 | }, |
| 3577 | .ptr_stack_offset => { | 3588 | .ptr_stack_offset => { |
| 3578 | return self.fail("TODO implement calling with MCValue.ptr_stack_offset arg", .{}); | 3589 | const reg = try self.copyToTmpRegister(ty, mcv); |
| | 3590 | return self.genSetStackArgument(ty, stack_offset, MCValue{ .register = reg }); |
| 3579 | }, | 3591 | }, |
| 3580 | .ptr_embedded_in_code => { | 3592 | .ptr_embedded_in_code => { |
| 3581 | return self.fail("TODO implement calling with MCValue.ptr_embedded_in_code arg", .{}); | 3593 | return self.fail("TODO implement calling with MCValue.ptr_embedded_in_code arg", .{}); |