diff options
| author | joachimschmidt557 <joachim.schmidt557@outlook.com> | 2021-01-16 14:15:40 +0100 |
|---|---|---|
| committer | Andrew Kelley <andrew@ziglang.org> | 2021-01-16 12:05:38 -0800 |
| commit | fbd5fbe729b7d3f085d2d479ed9957decc019332 (patch) | |
| tree | 9cc38a723509ba28b64d7c0327e72fe7222e7dea /src/codegen.zig | |
| parent | b204ea0349d5a580fc8ba9d8059c520301072072 (diff) | |
| download | zig-fbd5fbe729b7d3f085d2d479ed9957decc019332.tar.gz zig-fbd5fbe729b7d3f085d2d479ed9957decc019332.zip | |
stage2 AArch64: add very basic return values
Diffstat (limited to 'src/codegen.zig')
| -rw-r--r-- | src/codegen.zig | 20 |
1 files changed, 17 insertions, 3 deletions
diff --git a/src/codegen.zig b/src/codegen.zig index bfb1540e40..7c67a9191b 100644 --- a/src/codegen.zig +++ b/src/codegen.zig @@ -2935,8 +2935,10 @@ fn Function(comptime arch: std.Target.Cpu.Arch) type { ).toU32()); // ldr x28, [sp], #16 mem.writeIntLittle(u32, try self.code.addManyAsArray(4), Instruction.ldr(.x28, .{ - .rn = Register.sp, - .offset = Instruction.LoadStoreOffset.imm_post_index(16), + .register = .{ + .rn = Register.sp, + .offset = Instruction.LoadStoreOffset.imm_post_index(16), + }, }).toU32()); } else { // stp x0, x28, [sp, #-16] @@ -2978,7 +2980,7 @@ fn Function(comptime arch: std.Target.Cpu.Arch) type { // The value is in memory at a hard-coded address. // If the type is a pointer, it means the pointer address is at this memory location. try self.genSetReg(src, reg, .{ .immediate = addr }); - mem.writeIntLittle(u32, try self.code.addManyAsArray(4), Instruction.ldr(reg, .{ .rn = reg }).toU32()); + mem.writeIntLittle(u32, try self.code.addManyAsArray(4), Instruction.ldr(reg, .{ .register = .{ .rn = reg } }).toU32()); } }, else => return self.fail(src, "TODO implement genSetReg for aarch64 {}", .{mcv}), @@ -3620,6 +3622,18 @@ fn Function(comptime arch: std.Target.Cpu.Arch) type { }, else => return self.fail(src, "TODO implement function return values for {}", .{cc}), }, + .aarch64 => switch (cc) { + .Naked => unreachable, + .Unspecified, .C => { + const ret_ty_size = @intCast(u32, ret_ty.abiSize(self.target.*)); + if (ret_ty_size <= 8) { + result.return_value = .{ .register = c_abi_int_return_regs[0] }; + } else { + return self.fail(src, "TODO support more return types for ARM backend", .{}); + } + }, + else => return self.fail(src, "TODO implement function return values for {}", .{cc}), + }, else => return self.fail(src, "TODO implement codegen return values for {}", .{self.target.cpu.arch}), } return result; |
