| ... | @@ -925,8 +925,6 @@ fn airIntCast(self: *Self, inst: Air.Inst.Index) !void { | ... | @@ -925,8 +925,6 @@ fn airIntCast(self: *Self, inst: Air.Inst.Index) !void { |
| 925 | const operand = try self.resolveInst(ty_op.operand); | 925 | const operand = try self.resolveInst(ty_op.operand); |
| 926 | const info_a = operand_ty.intInfo(self.target.*); | 926 | const info_a = operand_ty.intInfo(self.target.*); |
| 927 | const info_b = self.air.typeOfIndex(inst).intInfo(self.target.*); | 927 | const info_b = self.air.typeOfIndex(inst).intInfo(self.target.*); |
| 928 | if (info_a.signedness != info_b.signedness) | | |
| 929 | return self.fail("TODO gen intcast sign safety in semantic analysis", .{}); | | |
| 930 | | 928 | |
| 931 | const operand_abi_size = operand_ty.abiSize(self.target.*); | 929 | const operand_abi_size = operand_ty.abiSize(self.target.*); |
| 932 | const dest_ty = self.air.typeOfIndex(inst); | 930 | const dest_ty = self.air.typeOfIndex(inst); |
| ... | @@ -5063,6 +5061,26 @@ fn resolveCallingConventionValues(self: *Self, fn_ty: Type) !CallMCValues { | ... | @@ -5063,6 +5061,26 @@ fn resolveCallingConventionValues(self: *Self, fn_ty: Type) !CallMCValues { |
| 5063 | | 5061 | |
| 5064 | const ret_ty = fn_ty.fnReturnType(); | 5062 | const ret_ty = fn_ty.fnReturnType(); |
| 5065 | | 5063 | |
| | 5064 | // Return values |
| | 5065 | if (ret_ty.zigTypeTag() == .NoReturn) { |
| | 5066 | result.return_value = .{ .unreach = {} }; |
| | 5067 | } else if (!ret_ty.hasRuntimeBits()) { |
| | 5068 | result.return_value = .{ .none = {} }; |
| | 5069 | } else switch (cc) { |
| | 5070 | .Naked => unreachable, |
| | 5071 | .Unspecified, .C => { |
| | 5072 | const ret_ty_size = @intCast(u32, ret_ty.abiSize(self.target.*)); |
| | 5073 | if (ret_ty_size <= 8) { |
| | 5074 | const aliased_reg = registerAlias(c_abi_int_return_regs[0], ret_ty_size); |
| | 5075 | result.return_value = .{ .register = aliased_reg }; |
| | 5076 | } else { |
| | 5077 | return self.fail("TODO support more return types for x86_64 backend", .{}); |
| | 5078 | } |
| | 5079 | }, |
| | 5080 | else => return self.fail("TODO implement function return values for {}", .{cc}), |
| | 5081 | } |
| | 5082 | |
| | 5083 | // Input params |
| 5066 | switch (cc) { | 5084 | switch (cc) { |
| 5067 | .Naked => { | 5085 | .Naked => { |
| 5068 | assert(result.args.len == 0); | 5086 | assert(result.args.len == 0); |
| ... | @@ -5139,28 +5157,15 @@ fn resolveCallingConventionValues(self: *Self, fn_ty: Type) !CallMCValues { | ... | @@ -5139,28 +5157,15 @@ fn resolveCallingConventionValues(self: *Self, fn_ty: Type) !CallMCValues { |
| 5139 | } | 5157 | } |
| 5140 | | 5158 | |
| 5141 | result.stack_align = 16; | 5159 | result.stack_align = 16; |
| | 5160 | // TODO fix this so that the 16byte alignment padding is at the current value of $rsp, and push |
| | 5161 | // the args onto the stack so that there is no padding between the first argument and |
| | 5162 | // the standard preamble. |
| | 5163 | // alignment padding | args ... | ret addr | $rbp | |
| 5142 | result.stack_byte_count = mem.alignForwardGeneric(u32, next_stack_offset, result.stack_align); | 5164 | result.stack_byte_count = mem.alignForwardGeneric(u32, next_stack_offset, result.stack_align); |
| 5143 | }, | 5165 | }, |
| 5144 | else => return self.fail("TODO implement function parameters for {} on x86_64", .{cc}), | 5166 | else => return self.fail("TODO implement function parameters for {} on x86_64", .{cc}), |
| 5145 | } | 5167 | } |
| 5146 | | 5168 | |
| 5147 | if (ret_ty.zigTypeTag() == .NoReturn) { | | |
| 5148 | result.return_value = .{ .unreach = {} }; | | |
| 5149 | } else if (!ret_ty.hasRuntimeBits()) { | | |
| 5150 | result.return_value = .{ .none = {} }; | | |
| 5151 | } else switch (cc) { | | |
| 5152 | .Naked => unreachable, | | |
| 5153 | .Unspecified, .C => { | | |
| 5154 | const ret_ty_size = @intCast(u32, ret_ty.abiSize(self.target.*)); | | |
| 5155 | if (ret_ty_size <= 8) { | | |
| 5156 | const aliased_reg = registerAlias(c_abi_int_return_regs[0], ret_ty_size); | | |
| 5157 | result.return_value = .{ .register = aliased_reg }; | | |
| 5158 | } else { | | |
| 5159 | return self.fail("TODO support more return types for x86_64 backend", .{}); | | |
| 5160 | } | | |
| 5161 | }, | | |
| 5162 | else => return self.fail("TODO implement function return values for {}", .{cc}), | | |
| 5163 | } | | |
| 5164 | return result; | 5169 | return result; |
| 5165 | } | 5170 | } |
| 5166 | | 5171 | |