diff options
| author | Jakub Konka <kubkon@jakubkonka.com> | 2022-03-03 00:03:54 +0100 |
|---|---|---|
| committer | Andrew Kelley <andrew@ziglang.org> | 2022-03-02 20:04:34 -0500 |
| commit | 3ec74a1cd8b868b7cebfd584dec3f20a9aa2bda6 (patch) | |
| tree | c8406c16704cd4a47247618395257180cf7f3a0d /src/arch | |
| parent | 1c8a86f063b65e95c2e23ceaa40843069adfdc23 (diff) | |
| download | zig-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.zig | 37 |
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}), } }, |
