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...@@ -2039,20 +2039,6 @@ fn airCall(self: *Self, inst: Air.Inst.Index, modifier: std.builtin.CallModifier
2039 return bt.finishAir(result);2039 return bt.finishAir(result);
2040}2040}
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
2056fn airRet(self: *Self, inst: Air.Inst.Index, safety: bool) !void {2042fn airRet(self: *Self, inst: Air.Inst.Index, safety: bool) !void {
2057 if (safety) {2043 if (safety) {
2058 // safe2044 // safe
...@@ -2068,14 +2054,29 @@ fn airRet(self: *Self, inst: Air.Inst.Index, safety: bool) !void {...@@ -2068,14 +2054,29 @@ fn airRet(self: *Self, inst: Air.Inst.Index, safety: bool) !void {
2068 .data = .{ .nop = {} },2054 .data = .{ .nop = {} },
2069 });2055 });
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
2071 _ = try self.addInst(.{2068 _ = try self.addInst(.{
2072 .tag = .psuedo_epilogue,2069 .tag = .psuedo_epilogue,
2073 .data = .{ .nop = {} },2070 .data = .{ .nop = {} },
2074 });2071 });
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);
2079}2080}
20802081
2081fn airRetLoad(self: *Self, inst: Air.Inst.Index) !void {2082fn airRetLoad(self: *Self, inst: Air.Inst.Index) !void {
...@@ -3354,7 +3355,7 @@ fn resolveCallingConventionValues(self: *Self, fn_ty: Type) !CallMCValues {...@@ -3354,7 +3355,7 @@ fn resolveCallingConventionValues(self: *Self, fn_ty: Type) !CallMCValues {
3354 if (ret_ty_size <= 8) {3355 if (ret_ty_size <= 8) {
3355 result.return_value = .{ .register = .a0 };3356 result.return_value = .{ .register = .a0 };
3356 } else if (ret_ty_size <= 16) {3357 } 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", .{});
3358 } else {3359 } else {
3359 return self.fail("TODO support return by reference", .{});3360 return self.fail("TODO support return by reference", .{});
3360 }3361 }