authorgravatar for joachim.schmidt557@outlook.comJoachim Schmidt <joachim.schmidt557@outlook.com> 2022-01-31 18:02:27+01:00
committergravatar for kubkon@jakubkonka.comJakub Konka <kubkon@jakubkonka.com> 2022-01-31 23:52:32+01:00
log2913950ca9deea6cbbbfea6f4592db366961c428
treeee6218e392c9981beb1edca5a016ae7a5005b9ad
parent5210b9074ca68c23da474b0afcaa4ce11f7cc57c

stage2 ARM: implement ptr_stack_offset function parameters


1 files changed, 28 insertions(+), 16 deletions(-)

src/arch/arm/CodeGen.zig+28-16
...@@ -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 }
22962290
...@@ -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
3250fn genSetReg(self: *Self, ty: Type, reg: Register, mcv: MCValue) InnerError!void {3244fn 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", .{});