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
15681568 .dead => unreachable,
15691569 .compare_flags_unsigned => unreachable,
15701570 .compare_flags_signed => unreachable,
1571 .stack_argument_offset => unreachable,
15721571 .immediate => |imm| {
15731572 try self.setRegOrMem(value_ty, .{ .memory = imm }, value);
15741573 },
......@@ -1610,13 +1609,12 @@ fn store(self: *Self, ptr: MCValue, value: MCValue, ptr_ty: Type, value_ty: Type
16101609 },
16111610 }
16121611 },
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);
16201618 },
16211619 }
16221620}
......@@ -2275,6 +2273,8 @@ fn airCall(self: *Self, inst: Air.Inst.Index) !void {
22752273 .memory => unreachable,
22762274 .compare_flags_signed => unreachable,
22772275 .compare_flags_unsigned => unreachable,
2276 .ptr_stack_offset => unreachable,
2277 .ptr_embedded_in_code => unreachable,
22782278 .register => |reg| {
22792279 try self.register_manager.getReg(reg, null);
22802280 try self.genSetReg(arg_ty, reg, arg_mcv);
......@@ -2285,12 +2285,6 @@ fn airCall(self: *Self, inst: Air.Inst.Index) !void {
22852285 info.stack_byte_count - offset,
22862286 arg_mcv,
22872287 ),
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 },
22942288 }
22952289 }
22962290
......@@ -3250,7 +3244,6 @@ fn genSetStack(self: *Self, ty: Type, stack_offset: u32, mcv: MCValue) InnerErro
32503244fn genSetReg(self: *Self, ty: Type, reg: Register, mcv: MCValue) InnerError!void {
32513245 switch (mcv) {
32523246 .dead => unreachable,
3253 .ptr_stack_offset => unreachable,
32543247 .ptr_embedded_in_code => unreachable,
32553248 .unreach, .none => return, // Nothing to do.
32563249 .undef => {
......@@ -3259,6 +3252,24 @@ fn genSetReg(self: *Self, ty: Type, reg: Register, mcv: MCValue) InnerError!void
32593252 // Write the debug undefined value.
32603253 return self.genSetReg(ty, reg, .{ .immediate = 0xaaaaaaaa });
32613254 },
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 },
32623273 .compare_flags_unsigned,
32633274 .compare_flags_signed,
32643275 => |op| {
......@@ -3575,7 +3586,8 @@ fn genSetStackArgument(self: *Self, ty: Type, stack_offset: u32, mcv: MCValue) I
35753586 }
35763587 },
35773588 .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 });
35793591 },
35803592 .ptr_embedded_in_code => {
35813593 return self.fail("TODO implement calling with MCValue.ptr_embedded_in_code arg", .{});