| ... | ... | @@ -12311,25 +12311,33 @@ fn genCall(self: *Self, info: union(enum) { |
| 12311 | 12311 | const zo = elf_file.zigObjectPtr().?; |
| 12312 | 12312 | const sym_index = try zo.getOrCreateMetadataForNav(elf_file, func.owner_nav); |
| 12313 | 12313 | if (self.mod.pic) { |
| 12314 | | const callee_reg: Register = switch (resolved_cc) { |
| 12315 | | .SysV => callee: { |
| 12316 | | if (!fn_info.is_var_args) break :callee .rax; |
| 12317 | | const param_regs = abi.getCAbiIntParamRegs(resolved_cc); |
| 12318 | | break :callee if (call_info.gp_count < param_regs.len) |
| 12319 | | param_regs[call_info.gp_count] |
| 12320 | | else |
| 12321 | | .r10; |
| 12322 | | }, |
| 12323 | | .Win64 => .rax, |
| 12324 | | else => unreachable, |
| 12325 | | }; |
| 12326 | | try self.genSetReg( |
| 12327 | | callee_reg, |
| 12328 | | Type.usize, |
| 12329 | | .{ .load_symbol = .{ .sym = sym_index } }, |
| 12330 | | .{}, |
| 12331 | | ); |
| 12332 | | try self.asmRegister(.{ ._, .call }, callee_reg); |
| 12314 | // const callee_reg: Register = switch (resolved_cc) { |
| 12315 | // .SysV => callee: { |
| 12316 | // if (!fn_info.is_var_args) break :callee .rax; |
| 12317 | // const param_regs = abi.getCAbiIntParamRegs(resolved_cc); |
| 12318 | // break :callee if (call_info.gp_count < param_regs.len) |
| 12319 | // param_regs[call_info.gp_count] |
| 12320 | // else |
| 12321 | // .r10; |
| 12322 | // }, |
| 12323 | // .Win64 => .rax, |
| 12324 | // else => unreachable, |
| 12325 | // }; |
| 12326 | // TODO convert to near jump |
| 12327 | try self.asmMemory(.{ ._, .call }, .{ |
| 12328 | .base = .{ .reloc = .{ |
| 12329 | .atom_index = try self.owner.getSymbolIndex(self), |
| 12330 | .sym_index = sym_index, |
| 12331 | } }, |
| 12332 | .mod = .{ .rm = .{ .size = .qword } }, |
| 12333 | }); |
| 12334 | // try self.genSetReg( |
| 12335 | // callee_reg, |
| 12336 | // Type.usize, |
| 12337 | // .{ .load_symbol = .{ .sym = sym_index } }, |
| 12338 | // .{}, |
| 12339 | // ); |
| 12340 | // try self.asmRegister(.{ ._, .call }, callee_reg); |
| 12333 | 12341 | } else try self.asmMemory(.{ ._, .call }, .{ |
| 12334 | 12342 | .base = .{ .reloc = .{ |
| 12335 | 12343 | .atom_index = try self.owner.getSymbolIndex(self), |
| ... | ... | @@ -14097,7 +14105,7 @@ fn airAsm(self: *Self, inst: Air.Inst.Index) !void { |
| 14097 | 14105 | else |
| 14098 | 14106 | return self.fail("invalid modifier: '{s}'", .{modifier}), |
| 14099 | 14107 | .load_symbol => |sym_off| if (mem.eql(u8, modifier, "P")) |
| 14100 | | .{ .reg = try self.copyToTmpRegister(Type.usize, .{ .load_symbol = sym_off }) } |
| 14108 | .{ .reg = try self.copyToTmpRegister(Type.usize, .{ .lea_symbol = sym_off }) } |
| 14101 | 14109 | else |
| 14102 | 14110 | return self.fail("invalid modifier: '{s}'", .{modifier}), |
| 14103 | 14111 | else => return self.fail("invalid constraint: '{s}'", .{op_str}), |