diff --git a/src/arch/riscv64/CodeGen.zig b/src/arch/riscv64/CodeGen.zig index bdf42e10c7b065ea2c389f8a43010f109acd4929..7ba1d192d9fa99dc392688001a936f720aed9775 100644 --- a/src/arch/riscv64/CodeGen.zig +++ b/src/arch/riscv64/CodeGen.zig @@ -2039,11 +2039,37 @@ fn airCall(self: *Self, inst: Air.Inst.Index, modifier: std.builtin.CallModifier return bt.finishAir(result); } +fn airRet(self: *Self, inst: Air.Inst.Index, safety: bool) !void { + if (safety) { + // safe + } else { + // not safe + } + + const un_op = self.air.instructions.items(.data)[@intFromEnum(inst)].un_op; + const operand = try self.resolveInst(un_op); + + _ = try self.addInst(.{ + .tag = .dbg_epilogue_begin, + .data = .{ .nop = {} }, + }); + + try self.ret(operand); + + return self.finishAir(inst, .dead, .{ un_op, .none, .none }); +} + fn ret(self: *Self, mcv: MCValue) !void { const mod = self.bin_file.comp.module.?; + const ret_ty = self.fn_type.fnReturnType(mod); try self.setValue(ret_ty, self.ret_mcv, mcv); + _ = try self.addInst(.{ + .tag = .psuedo_epilogue, + .data = .{ .nop = {} }, + }); + // Just add space for an instruction, patch this later const index = try self.addInst(.{ .tag = .ret, @@ -2053,31 +2079,6 @@ fn ret(self: *Self, mcv: MCValue) !void { try self.exitlude_jump_relocs.append(self.gpa, index); } -fn airRet(self: *Self, inst: Air.Inst.Index, safety: bool) !void { - if (safety) { - // safe - } else { - // not safe - } - - const un_op = self.air.instructions.items(.data)[@intFromEnum(inst)].un_op; - const operand = try self.resolveInst(un_op); - - _ = try self.addInst(.{ - .tag = .dbg_epilogue_begin, - .data = .{ .nop = {} }, - }); - - _ = try self.addInst(.{ - .tag = .psuedo_epilogue, - .data = .{ .nop = {} }, - }); - - try self.ret(operand); - - return self.finishAir(inst, .dead, .{ un_op, .none, .none }); -} - fn airRetLoad(self: *Self, inst: Air.Inst.Index) !void { const un_op = self.air.instructions.items(.data)[@intFromEnum(inst)].un_op; const ptr = try self.resolveInst(un_op); @@ -3354,7 +3355,7 @@ fn resolveCallingConventionValues(self: *Self, fn_ty: Type) !CallMCValues { if (ret_ty_size <= 8) { result.return_value = .{ .register = .a0 }; } else if (ret_ty_size <= 16) { - return self.fail("TODO support MCValue 2 registers", .{}); + return self.fail("TODO support returning with a0 + a1", .{}); } else { return self.fail("TODO support return by reference", .{}); }