authorgravatar for david@vortan.devDavid Rubin <david@vortan.dev> 2024-03-23 19:09:29-07:00
committergravatar for david@vortan.devDavid Rubin <david@vortan.dev> 2024-05-11 02:17:11-07:00
log08452b1adde34f5ef20738970141f643709b6eb9
tree6963bedea478fd0340cd93b889f605607da3b404
parentf1fe5c937e5587064dde4ab357e9efe277a5ea49

riscv: correct the order of the return epilogue


1 files changed, 18 insertions(+), 17 deletions(-)

src/arch/riscv64/CodeGen.zig+18-17
......@@ -2039,20 +2039,6 @@ fn airCall(self: *Self, inst: Air.Inst.Index, modifier: std.builtin.CallModifier
20392039 return bt.finishAir(result);
20402040}
20412041
2042fn ret(self: *Self, mcv: MCValue) !void {
2043 const mod = self.bin_file.comp.module.?;
2044 const ret_ty = self.fn_type.fnReturnType(mod);
2045 try self.setValue(ret_ty, self.ret_mcv, mcv);
2046
2047 // Just add space for an instruction, patch this later
2048 const index = try self.addInst(.{
2049 .tag = .ret,
2050 .data = .{ .nop = {} },
2051 });
2052
2053 try self.exitlude_jump_relocs.append(self.gpa, index);
2054}
2055
20562042fn airRet(self: *Self, inst: Air.Inst.Index, safety: bool) !void {
20572043 if (safety) {
20582044 // safe
......@@ -2068,14 +2054,29 @@ fn airRet(self: *Self, inst: Air.Inst.Index, safety: bool) !void {
20682054 .data = .{ .nop = {} },
20692055 });
20702056
2057 try self.ret(operand);
2058
2059 return self.finishAir(inst, .dead, .{ un_op, .none, .none });
2060}
2061
2062fn ret(self: *Self, mcv: MCValue) !void {
2063 const mod = self.bin_file.comp.module.?;
2064
2065 const ret_ty = self.fn_type.fnReturnType(mod);
2066 try self.setValue(ret_ty, self.ret_mcv, mcv);
2067
20712068 _ = try self.addInst(.{
20722069 .tag = .psuedo_epilogue,
20732070 .data = .{ .nop = {} },
20742071 });
20752072
2076 try self.ret(operand);
2073 // Just add space for an instruction, patch this later
2074 const index = try self.addInst(.{
2075 .tag = .ret,
2076 .data = .{ .nop = {} },
2077 });
20772078
2078 return self.finishAir(inst, .dead, .{ un_op, .none, .none });
2079 try self.exitlude_jump_relocs.append(self.gpa, index);
20792080}
20802081
20812082fn airRetLoad(self: *Self, inst: Air.Inst.Index) !void {
......@@ -3354,7 +3355,7 @@ fn resolveCallingConventionValues(self: *Self, fn_ty: Type) !CallMCValues {
33543355 if (ret_ty_size <= 8) {
33553356 result.return_value = .{ .register = .a0 };
33563357 } else if (ret_ty_size <= 16) {
3357 return self.fail("TODO support MCValue 2 registers", .{});
3358 return self.fail("TODO support returning with a0 + a1", .{});
33583359 } else {
33593360 return self.fail("TODO support return by reference", .{});
33603361 }