| ... | @@ -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 | } |
| 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 | fn airRet(self: *Self, inst: Air.Inst.Index, safety: bool) !void { | 2042 | fn airRet(self: *Self, inst: Air.Inst.Index, safety: bool) !void { |
| 2057 | if (safety) { | 2043 | if (safety) { |
| 2058 | // safe | 2044 | // 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 | }); |
| 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 | _ = try self.addInst(.{ | 2068 | _ = try self.addInst(.{ |
| 2072 | .tag = .psuedo_epilogue, | 2069 | .tag = .psuedo_epilogue, |
| 2073 | .data = .{ .nop = {} }, | 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 | fn airRetLoad(self: *Self, inst: Air.Inst.Index) !void { | 2082 | fn 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 | } |