authorgravatar for kubkon@jakubkonka.comJakub Konka <kubkon@jakubkonka.com> 2022-02-19 19:33:37+01:00
committergravatar for kubkon@jakubkonka.comJakub Konka <kubkon@jakubkonka.com> 2022-02-22 21:56:34+01:00
loge582c0a043e89e0d507ca86253a836766794db0e
tree5bb3e09e7b6c7c51deece80ea4bb4171cb44b63d
parent8bc95b22dcf21e42e2c636476a6723f1c14d6695

x64: reorder resolving call params: return values first, then params


1 files changed, 24 insertions(+), 19 deletions(-)

src/arch/x86_64/CodeGen.zig+24-19
...@@ -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", .{});
930928
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 {
50635061
5064 const ret_ty = fn_ty.fnReturnType();5062 const ret_ty = fn_ty.fnReturnType();
50655063
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 }
51405158
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 }
51465168
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}
51665171