| ... | @@ -2524,6 +2524,7 @@ fn airCondBr(self: *Self, inst: Air.Inst.Index) !void { | ... | @@ -2524,6 +2524,7 @@ fn airCondBr(self: *Self, inst: Air.Inst.Index) !void { |
| 2524 | }, | 2524 | }, |
| 2525 | .stack_offset, | 2525 | .stack_offset, |
| 2526 | .memory, | 2526 | .memory, |
| | 2527 | .stack_argument_offset, |
| 2527 | => blk: { | 2528 | => blk: { |
| 2528 | try self.spillCompareFlagsIfOccupied(); | 2529 | try self.spillCompareFlagsIfOccupied(); |
| 2529 | | 2530 | |
| ... | @@ -2953,7 +2954,7 @@ fn br(self: *Self, block: Air.Inst.Index, operand: Air.Inst.Ref) !void { | ... | @@ -2953,7 +2954,7 @@ fn br(self: *Self, block: Air.Inst.Index, operand: Air.Inst.Ref) !void { |
| 2953 | block_data.mcv = switch (operand_mcv) { | 2954 | block_data.mcv = switch (operand_mcv) { |
| 2954 | .none, .dead, .unreach => unreachable, | 2955 | .none, .dead, .unreach => unreachable, |
| 2955 | .register, .stack_offset, .memory => operand_mcv, | 2956 | .register, .stack_offset, .memory => operand_mcv, |
| 2956 | .immediate => blk: { | 2957 | .immediate, .stack_argument_offset => blk: { |
| 2957 | const new_mcv = try self.allocRegOrMem(block, true); | 2958 | const new_mcv = try self.allocRegOrMem(block, true); |
| 2958 | try self.setRegOrMem(self.air.typeOfIndex(block), new_mcv, operand_mcv); | 2959 | try self.setRegOrMem(self.air.typeOfIndex(block), new_mcv, operand_mcv); |
| 2959 | break :blk new_mcv; | 2960 | break :blk new_mcv; |
| ... | @@ -3911,7 +3912,7 @@ fn resolveCallingConventionValues(self: *Self, fn_ty: Type) !CallMCValues { | ... | @@ -3911,7 +3912,7 @@ fn resolveCallingConventionValues(self: *Self, fn_ty: Type) !CallMCValues { |
| 3911 | result.stack_align = 1; | 3912 | result.stack_align = 1; |
| 3912 | return result; | 3913 | return result; |
| 3913 | }, | 3914 | }, |
| 3914 | .Unspecified, .C => { | 3915 | .C => { |
| 3915 | // ARM Procedure Call Standard, Chapter 6.5 | 3916 | // ARM Procedure Call Standard, Chapter 6.5 |
| 3916 | var ncrn: usize = 0; // Next Core Register Number | 3917 | var ncrn: usize = 0; // Next Core Register Number |
| 3917 | var nsaa: u32 = 0; // Next stacked argument address | 3918 | var nsaa: u32 = 0; // Next stacked argument address |
| ... | @@ -3943,6 +3944,18 @@ fn resolveCallingConventionValues(self: *Self, fn_ty: Type) !CallMCValues { | ... | @@ -3943,6 +3944,18 @@ fn resolveCallingConventionValues(self: *Self, fn_ty: Type) !CallMCValues { |
| 3943 | result.stack_byte_count = nsaa; | 3944 | result.stack_byte_count = nsaa; |
| 3944 | result.stack_align = 8; | 3945 | result.stack_align = 8; |
| 3945 | }, | 3946 | }, |
| | 3947 | .Unspecified => { |
| | 3948 | var stack_offset: u32 = 0; |
| | 3949 | |
| | 3950 | for (param_types) |ty, i| { |
| | 3951 | stack_offset = std.mem.alignForwardGeneric(u32, stack_offset, ty.abiAlignment(self.target.*)); |
| | 3952 | result.args[i] = .{ .stack_argument_offset = stack_offset }; |
| | 3953 | stack_offset += @intCast(u32, ty.abiSize(self.target.*)); |
| | 3954 | } |
| | 3955 | |
| | 3956 | result.stack_byte_count = stack_offset; |
| | 3957 | result.stack_align = 8; |
| | 3958 | }, |
| 3946 | else => return self.fail("TODO implement function parameters for {} on arm", .{cc}), | 3959 | else => return self.fail("TODO implement function parameters for {} on arm", .{cc}), |
| 3947 | } | 3960 | } |
| 3948 | | 3961 | |