authorgravatar for kubkon@jakubkonka.comJakub Konka <kubkon@jakubkonka.com> 2022-06-29 09:05:34+02:00
committergravatar for kubkon@jakubkonka.comJakub Konka <kubkon@jakubkonka.com> 2022-06-29 17:19:49+02:00
log59359b25474724018c14b8cb685837f4480c0de5
treeff7de3ed01eb147e9717bbdc0e42efb4ced34db0
parent234ccb4a5088cd6fa06144d7ba1aceab0596f1cc

aarch64: add airRetLoad for register mcv


2 files changed, 46 insertions(+), 25 deletions(-)

src/arch/aarch64/CodeGen.zig+46-24
......@@ -362,6 +362,13 @@ fn addInst(self: *Self, inst: Mir.Inst) error{OutOfMemory}!Mir.Inst.Index {
362362 return result_index;
363363}
364364
365fn addNop(self: *Self) error{OutOfMemory}!Mir.Inst.Index {
366 return try self.addInst(.{
367 .tag = .nop,
368 .data = .{ .nop = {} },
369 });
370}
371
365372pub fn addExtra(self: *Self, extra: anytype) Allocator.Error!u32 {
366373 const fields = std.meta.fields(@TypeOf(extra));
367374 try self.mir_extra.ensureUnusedCapacity(self.gpa, fields.len);
......@@ -396,10 +403,7 @@ fn gen(self: *Self) !void {
396403 });
397404
398405 // <store other registers>
399 const backpatch_save_registers = try self.addInst(.{
400 .tag = .nop,
401 .data = .{ .nop = {} },
402 });
406 const backpatch_save_registers = try self.addNop();
403407
404408 // mov fp, sp
405409 _ = try self.addInst(.{
......@@ -408,10 +412,7 @@ fn gen(self: *Self) !void {
408412 });
409413
410414 // sub sp, sp, #reloc
411 const backpatch_reloc = try self.addInst(.{
412 .tag = .nop,
413 .data = .{ .nop = {} },
414 });
415 const backpatch_reloc = try self.addNop();
415416
416417 _ = try self.addInst(.{
417418 .tag = .dbg_prologue_end,
......@@ -3261,37 +3262,58 @@ fn airCall(self: *Self, inst: Air.Inst.Index, modifier: std.builtin.CallOptions.
32613262 return bt.finishAir(result);
32623263}
32633264
3264fn ret(self: *Self, mcv: MCValue) !void {
3265fn airRet(self: *Self, inst: Air.Inst.Index) !void {
3266 const un_op = self.air.instructions.items(.data)[inst].un_op;
3267 const operand = try self.resolveInst(un_op);
32653268 const ret_ty = self.fn_type.fnReturnType();
3269
32663270 switch (self.ret_mcv) {
3271 .none => {},
32673272 .immediate => {
32683273 assert(ret_ty.isError());
32693274 },
3270 else => {
3271 try self.setRegOrMem(ret_ty, self.ret_mcv, mcv);
3275 .register => |reg| {
3276 // Return result by value
3277 try self.genSetReg(ret_ty, reg, operand);
3278 },
3279 .stack_offset => {
3280 // Return result by reference
3281 // TODO
3282 return self.fail("TODO implement airRet for {}", .{self.ret_mcv});
32723283 },
3284 else => unreachable,
32733285 }
3286
32743287 // Just add space for an instruction, patch this later
3275 const index = try self.addInst(.{
3276 .tag = .nop,
3277 .data = .{ .nop = {} },
3278 });
3279 try self.exitlude_jump_relocs.append(self.gpa, index);
3280}
3288 try self.exitlude_jump_relocs.append(self.gpa, try self.addNop());
32813289
3282fn airRet(self: *Self, inst: Air.Inst.Index) !void {
3283 const un_op = self.air.instructions.items(.data)[inst].un_op;
3284 const operand = try self.resolveInst(un_op);
3285 try self.ret(operand);
32863290 return self.finishAir(inst, .dead, .{ un_op, .none, .none });
32873291}
32883292
32893293fn airRetLoad(self: *Self, inst: Air.Inst.Index) !void {
32903294 const un_op = self.air.instructions.items(.data)[inst].un_op;
32913295 const ptr = try self.resolveInst(un_op);
3292 _ = ptr;
3293 return self.fail("TODO implement airRetLoad for {}", .{self.target.cpu.arch});
3294 //return self.finishAir(inst, .dead, .{ un_op, .none, .none });
3296 const ptr_ty = self.air.typeOf(un_op);
3297 const ret_ty = self.fn_type.fnReturnType();
3298 _ = ret_ty;
3299
3300 switch (self.ret_mcv) {
3301 .none => {},
3302 .register => {
3303 // Return result by value
3304 try self.load(self.ret_mcv, ptr, ptr_ty);
3305 },
3306 .stack_offset => {
3307 // Return result by reference
3308 // TODO
3309 return self.fail("TODO implement airRetLoad for {}", .{self.ret_mcv});
3310 },
3311 else => unreachable,
3312 }
3313
3314 try self.exitlude_jump_relocs.append(self.gpa, try self.addNop());
3315
3316 return self.finishAir(inst, .dead, .{ un_op, .none, .none });
32953317}
32963318
32973319fn airCmp(self: *Self, inst: Air.Inst.Index, op: math.CompareOperator) !void {
test/behavior/incomplete_struct_param_tld.zig-1
......@@ -22,7 +22,6 @@ fn foo(a: A) i32 {
2222}
2323
2424test "incomplete struct param top level declaration" {
25 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
2625 const a = A{
2726 .b = B{
2827 .c = C{ .x = 13 },