aboutsummaryrefslogtreecommitdiff
path: root/src/arch
diff options
context:
space:
mode:
authorJakub Konka <kubkon@jakubkonka.com>2022-03-03 00:03:54 +0100
committerAndrew Kelley <andrew@ziglang.org>2022-03-02 20:04:34 -0500
commit3ec74a1cd8b868b7cebfd584dec3f20a9aa2bda6 (patch)
treec8406c16704cd4a47247618395257180cf7f3a0d /src/arch
parent1c8a86f063b65e95c2e23ceaa40843069adfdc23 (diff)
downloadzig-3ec74a1cd8b868b7cebfd584dec3f20a9aa2bda6.tar.gz
zig-3ec74a1cd8b868b7cebfd584dec3f20a9aa2bda6.zip
codegen: handle elem_ptr when lowering to memory
* x64: handle storing from-to non-stack memory
Diffstat (limited to 'src/arch')
-rw-r--r--src/arch/x86_64/CodeGen.zig37
1 files changed, 37 insertions, 0 deletions
diff --git a/src/arch/x86_64/CodeGen.zig b/src/arch/x86_64/CodeGen.zig
index 79e5c88050..33fd2c8321 100644
--- a/src/arch/x86_64/CodeGen.zig
+++ b/src/arch/x86_64/CodeGen.zig
@@ -2599,6 +2599,9 @@ fn store(self: *Self, ptr: MCValue, value: MCValue, ptr_ty: Type, value_ty: Type
defer value.unfreezeIfRegister(&self.register_manager);
const addr_reg = try self.register_manager.allocReg(null);
+ self.register_manager.freezeRegs(&.{addr_reg});
+ defer self.register_manager.unfreezeRegs(&.{addr_reg});
+
try self.loadMemPtrIntoRegister(addr_reg, ptr_ty, ptr);
// to get the actual address of the value we want to modify we have to go through the GOT
@@ -2662,6 +2665,40 @@ fn store(self: *Self, ptr: MCValue, value: MCValue, ptr_ty: Type, value_ty: Type
.data = .{ .imm = 0 },
});
},
+ .got_load,
+ .direct_load,
+ .memory,
+ => {
+ if (abi_size <= 8) {
+ const tmp_reg = try self.register_manager.allocReg(null);
+ self.register_manager.freezeRegs(&.{tmp_reg});
+ defer self.register_manager.unfreezeRegs(&.{tmp_reg});
+
+ try self.loadMemPtrIntoRegister(tmp_reg, value_ty, value);
+
+ _ = try self.addInst(.{
+ .tag = .mov,
+ .ops = (Mir.Ops{
+ .reg1 = tmp_reg,
+ .reg2 = tmp_reg,
+ .flags = 0b01,
+ }).encode(),
+ .data = .{ .imm = 0 },
+ });
+ _ = try self.addInst(.{
+ .tag = .mov,
+ .ops = (Mir.Ops{
+ .reg1 = addr_reg.to64(),
+ .reg2 = tmp_reg,
+ .flags = 0b10,
+ }).encode(),
+ .data = .{ .imm = 0 },
+ });
+ return;
+ }
+
+ try self.genInlineMemcpy(.{ .register = addr_reg.to64() }, value, .{ .immediate = abi_size }, .{});
+ },
else => return self.fail("TODO implement storing {} to MCValue.memory", .{value}),
}
},