authorgravatar for joachim.schmidt557@outlook.comJoachim Schmidt <joachim.schmidt557@outlook.com> 2022-01-15 15:38:21+01:00
committergravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2022-01-15 12:49:36-05:00
loge23f7c01ee91321bd7845397d45f189a3e161806
treefe5ab6cea0683874bdc46c735e03101dfb9c44ca
parenta5c7742ba6fc793608b8bb7ba058e33eccd9cfec

stage2 ARM: store all function parameters to stack for unspecified cc


1 files changed, 15 insertions(+), 2 deletions(-)

src/arch/arm/CodeGen.zig+15-2
......@@ -2524,6 +2524,7 @@ fn airCondBr(self: *Self, inst: Air.Inst.Index) !void {
25242524 },
25252525 .stack_offset,
25262526 .memory,
2527 .stack_argument_offset,
25272528 => blk: {
25282529 try self.spillCompareFlagsIfOccupied();
25292530
......@@ -2953,7 +2954,7 @@ fn br(self: *Self, block: Air.Inst.Index, operand: Air.Inst.Ref) !void {
29532954 block_data.mcv = switch (operand_mcv) {
29542955 .none, .dead, .unreach => unreachable,
29552956 .register, .stack_offset, .memory => operand_mcv,
2956 .immediate => blk: {
2957 .immediate, .stack_argument_offset => blk: {
29572958 const new_mcv = try self.allocRegOrMem(block, true);
29582959 try self.setRegOrMem(self.air.typeOfIndex(block), new_mcv, operand_mcv);
29592960 break :blk new_mcv;
......@@ -3911,7 +3912,7 @@ fn resolveCallingConventionValues(self: *Self, fn_ty: Type) !CallMCValues {
39113912 result.stack_align = 1;
39123913 return result;
39133914 },
3914 .Unspecified, .C => {
3915 .C => {
39153916 // ARM Procedure Call Standard, Chapter 6.5
39163917 var ncrn: usize = 0; // Next Core Register Number
39173918 var nsaa: u32 = 0; // Next stacked argument address
......@@ -3943,6 +3944,18 @@ fn resolveCallingConventionValues(self: *Self, fn_ty: Type) !CallMCValues {
39433944 result.stack_byte_count = nsaa;
39443945 result.stack_align = 8;
39453946 },
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 },
39463959 else => return self.fail("TODO implement function parameters for {} on arm", .{cc}),
39473960 }
39483961