| ... | ... | @@ -1568,7 +1568,6 @@ fn store(self: *Self, ptr: MCValue, value: MCValue, ptr_ty: Type, value_ty: Type |
| 1568 | 1568 | .dead => unreachable, |
| 1569 | 1569 | .compare_flags_unsigned => unreachable, |
| 1570 | 1570 | .compare_flags_signed => unreachable, |
| 1571 | | .stack_argument_offset => unreachable, |
| 1572 | 1571 | .immediate => |imm| { |
| 1573 | 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 | 1609 | }, |
| 1611 | 1610 | } |
| 1612 | 1611 | }, |
| 1613 | | .memory => { |
| 1614 | | // const addr_reg = try self.copyToTmpRegister(ptr_ty, ptr); |
| 1615 | | // try self.store(.{ .register = addr_reg }, value, ptr_ty, value_ty); |
| 1616 | | return self.fail("TODO implement storing to MCValue.memory", .{}); |
| 1617 | | }, |
| 1618 | | .stack_offset => { |
| 1619 | | return self.fail("TODO implement storing to MCValue.stack_offset", .{}); |
| 1612 | .memory, |
| 1613 | .stack_offset, |
| 1614 | .stack_argument_offset, |
| 1615 | => { |
| 1616 | const addr_reg = try self.copyToTmpRegister(ptr_ty, ptr); |
| 1617 | try self.store(.{ .register = addr_reg }, value, ptr_ty, value_ty); |
| 1620 | 1618 | }, |
| 1621 | 1619 | } |
| 1622 | 1620 | } |
| ... | ... | @@ -2275,6 +2273,8 @@ fn airCall(self: *Self, inst: Air.Inst.Index) !void { |
| 2275 | 2273 | .memory => unreachable, |
| 2276 | 2274 | .compare_flags_signed => unreachable, |
| 2277 | 2275 | .compare_flags_unsigned => unreachable, |
| 2276 | .ptr_stack_offset => unreachable, |
| 2277 | .ptr_embedded_in_code => unreachable, |
| 2278 | 2278 | .register => |reg| { |
| 2279 | 2279 | try self.register_manager.getReg(reg, null); |
| 2280 | 2280 | try self.genSetReg(arg_ty, reg, arg_mcv); |
| ... | ... | @@ -2285,12 +2285,6 @@ fn airCall(self: *Self, inst: Air.Inst.Index) !void { |
| 2285 | 2285 | info.stack_byte_count - offset, |
| 2286 | 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 | 3244 | fn genSetReg(self: *Self, ty: Type, reg: Register, mcv: MCValue) InnerError!void { |
| 3251 | 3245 | switch (mcv) { |
| 3252 | 3246 | .dead => unreachable, |
| 3253 | | .ptr_stack_offset => unreachable, |
| 3254 | 3247 | .ptr_embedded_in_code => unreachable, |
| 3255 | 3248 | .unreach, .none => return, // Nothing to do. |
| 3256 | 3249 | .undef => { |
| ... | ... | @@ -3259,6 +3252,24 @@ fn genSetReg(self: *Self, ty: Type, reg: Register, mcv: MCValue) InnerError!void |
| 3259 | 3252 | // Write the debug undefined value. |
| 3260 | 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 | 3273 | .compare_flags_unsigned, |
| 3263 | 3274 | .compare_flags_signed, |
| 3264 | 3275 | => |op| { |
| ... | ... | @@ -3575,7 +3586,8 @@ fn genSetStackArgument(self: *Self, ty: Type, stack_offset: u32, mcv: MCValue) I |
| 3575 | 3586 | } |
| 3576 | 3587 | }, |
| 3577 | 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 | 3592 | .ptr_embedded_in_code => { |
| 3581 | 3593 | return self.fail("TODO implement calling with MCValue.ptr_embedded_in_code arg", .{}); |