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