aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorJakub Konka <kubkon@jakubkonka.com>2022-02-28 12:14:41 +0100
committerJakub Konka <kubkon@jakubkonka.com>2022-02-28 12:14:41 +0100
commita61ac9ecbf42a97a4f56f7384e5b862dcb169f4a (patch)
tree73413ea4f4ac89038dc2410d0c39cfe3f8ee9f85 /src
parent57a823582cfb86a7c85c4598f5580325fb674ec4 (diff)
downloadzig-a61ac9ecbf42a97a4f56f7384e5b862dcb169f4a.tar.gz
zig-a61ac9ecbf42a97a4f56f7384e5b862dcb169f4a.zip
x64: fix store with ABI size > 8 on stack; pass union tests
Diffstat (limited to 'src')
-rw-r--r--src/arch/x86_64/CodeGen.zig11
1 files changed, 9 insertions, 2 deletions
diff --git a/src/arch/x86_64/CodeGen.zig b/src/arch/x86_64/CodeGen.zig
index 6891df0a41..bf5ebf4d41 100644
--- a/src/arch/x86_64/CodeGen.zig
+++ b/src/arch/x86_64/CodeGen.zig
@@ -2484,8 +2484,15 @@ fn store(self: *Self, ptr: MCValue, value: MCValue, ptr_ty: Type, value_ty: Type
});
},
.stack_offset => {
- const tmp_reg = try self.copyToTmpRegister(value_ty, value);
- return self.store(ptr, .{ .register = tmp_reg }, ptr_ty, value_ty);
+ if (abi_size <= 8) {
+ const tmp_reg = try self.copyToTmpRegister(value_ty, value);
+ return self.store(ptr, .{ .register = tmp_reg }, ptr_ty, value_ty);
+ }
+
+ try self.genInlineMemcpy(0, value_ty, value, .{
+ .source_stack_base = .rbp,
+ .dest_stack_base = reg.to64(),
+ });
},
else => |other| {
return self.fail("TODO implement set pointee with {}", .{other});