aboutsummaryrefslogtreecommitdiff
path: root/src/codegen.zig
diff options
context:
space:
mode:
authorjoachimschmidt557 <joachim.schmidt557@outlook.com>2021-01-16 14:15:40 +0100
committerAndrew Kelley <andrew@ziglang.org>2021-01-16 12:05:38 -0800
commitfbd5fbe729b7d3f085d2d479ed9957decc019332 (patch)
tree9cc38a723509ba28b64d7c0327e72fe7222e7dea /src/codegen.zig
parentb204ea0349d5a580fc8ba9d8059c520301072072 (diff)
downloadzig-fbd5fbe729b7d3f085d2d479ed9957decc019332.tar.gz
zig-fbd5fbe729b7d3f085d2d479ed9957decc019332.zip
stage2 AArch64: add very basic return values
Diffstat (limited to 'src/codegen.zig')
-rw-r--r--src/codegen.zig20
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;