authorgravatar for kubkon@jakubkonka.comJakub Konka <kubkon@jakubkonka.com> 2023-04-12 10:19:43+02:00
committergravatar for kubkon@jakubkonka.comJakub Konka <kubkon@jakubkonka.com> 2023-04-13 11:47:51+02:00
log0abaf5f88a687d29dea8556a3c4e79b4a61815e3
tree4d3496f096c26c2f813aa02a0feb5cb6b550b957
parent059ed062bc8d98be338c294d5ef443b11e0a180b

x86_64: simplify genSetStackArg() when storing value from memory


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

src/arch/x86_64/CodeGen.zig+21-2
......@@ -7097,11 +7097,30 @@ fn genSetStackArg(self: *Self, ty: Type, stack_offset: i32, mcv: MCValue) InnerE
70977097 return self.genSetStackArg(ty, stack_offset, MCValue{ .register = reg });
70987098 }
70997099
7100 const addr_reg = try self.register_manager.allocReg(null, gp);
7100 const addr_reg = (try self.register_manager.allocReg(null, gp)).to64();
71017101 const addr_lock = self.register_manager.lockRegAssumeUnused(addr_reg);
71027102 defer self.register_manager.unlockReg(addr_lock);
71037103
7104 try self.loadMemPtrIntoRegister(addr_reg, Type.usize, mcv);
7104 switch (mcv) {
7105 .memory => |addr| try self.genSetReg(Type.usize, addr_reg, .{ .immediate = addr }),
7106 .linker_load => |load_struct| {
7107 const atom_index = if (self.bin_file.cast(link.File.MachO)) |macho_file| blk: {
7108 const atom = try macho_file.getOrCreateAtomForDecl(self.mod_fn.owner_decl);
7109 break :blk macho_file.getAtom(atom).getSymbolIndex().?;
7110 } else if (self.bin_file.cast(link.File.Coff)) |coff_file| blk: {
7111 const atom = try coff_file.getOrCreateAtomForDecl(self.mod_fn.owner_decl);
7112 break :blk coff_file.getAtom(atom).getSymbolIndex().?;
7113 } else unreachable;
7114
7115 switch (load_struct.type) {
7116 .import => unreachable,
7117 .got => try self.asmMovLinker(addr_reg, atom_index, load_struct),
7118 .direct => try self.asmLeaLinker(addr_reg, atom_index, load_struct),
7119 }
7120 },
7121 else => unreachable,
7122 }
7123
71057124 try self.genInlineMemcpy(
71067125 .{ .ptr_stack_offset = stack_offset },
71077126 .{ .register = addr_reg },