authorgravatar for kubkon@jakubkonka.comJakub Konka <kubkon@jakubkonka.com> 2023-04-11 22:45:50+02:00
committergravatar for kubkon@jakubkonka.comJakub Konka <kubkon@jakubkonka.com> 2023-04-13 11:47:51+02:00
log397dd77697934a808b3545c5691399d8d69b841d
tree605c21a2f04e732e2c17ec5c0b25b663c34066b9
parentee6b4fad4714d596255f034c0b000438ee6ca943

x86_64: simplify store() logic when value is in memory


1 files changed, 20 insertions(+), 2 deletions(-)

src/arch/x86_64/CodeGen.zig+20-2
...@@ -3809,11 +3809,29 @@ fn store(self: *Self, ptr: MCValue, value: MCValue, ptr_ty: Type, value_ty: Type...@@ -3809,11 +3809,29 @@ fn store(self: *Self, ptr: MCValue, value: MCValue, ptr_ty: Type, value_ty: Type
38093809
3810 try self.store(ptr, .{ .register = tmp_reg }, ptr_ty, value_ty);3810 try self.store(ptr, .{ .register = tmp_reg }, ptr_ty, value_ty);
3811 } else {3811 } else {
3812 const addr_reg = try self.register_manager.allocReg(null, gp);3812 const addr_reg = (try self.register_manager.allocReg(null, gp)).to64();
3813 const addr_lock = self.register_manager.lockRegAssumeUnused(addr_reg);3813 const addr_lock = self.register_manager.lockRegAssumeUnused(addr_reg);
3814 defer self.register_manager.unlockReg(addr_lock);3814 defer self.register_manager.unlockReg(addr_lock);
38153815
3816 try self.loadMemPtrIntoRegister(addr_reg, Type.usize, value);3816 switch (value) {
3817 .memory => |addr| try self.genSetReg(Type.usize, addr_reg, .{ .immediate = addr }),
3818 .linker_load => |load_struct| {
3819 const atom_index = if (self.bin_file.cast(link.File.MachO)) |macho_file| blk: {
3820 const atom = try macho_file.getOrCreateAtomForDecl(self.mod_fn.owner_decl);
3821 break :blk macho_file.getAtom(atom).getSymbolIndex().?;
3822 } else if (self.bin_file.cast(link.File.Coff)) |coff_file| blk: {
3823 const atom = try coff_file.getOrCreateAtomForDecl(self.mod_fn.owner_decl);
3824 break :blk coff_file.getAtom(atom).getSymbolIndex().?;
3825 } else unreachable;
3826 switch (load_struct.type) {
3827 .import => unreachable,
3828 .got => try self.asmMovLinker(addr_reg, atom_index, load_struct),
3829 .direct => try self.asmLeaLinker(addr_reg, atom_index, load_struct),
3830 }
3831 },
3832 else => unreachable,
3833 }
3834
3817 try self.genInlineMemcpy(3835 try self.genInlineMemcpy(
3818 ptr,3836 ptr,
3819 .{ .register = addr_reg },3837 .{ .register = addr_reg },