| ... | @@ -402,7 +402,21 @@ fn emit(lower: *Lower, prefix: Prefix, mnemonic: Mnemonic, ops: []const Operand) | ... | @@ -402,7 +402,21 @@ fn emit(lower: *Lower, prefix: Prefix, mnemonic: Mnemonic, ops: []const Operand) |
| 402 | if (elf_sym.flags.is_extern_ptr) emit_mnemonic = .mov; | 402 | if (elf_sym.flags.is_extern_ptr) emit_mnemonic = .mov; |
| 403 | break :op .{ .mem = Memory.rip(mem_op.sib.ptr_size, 0) }; | 403 | break :op .{ .mem = Memory.rip(mem_op.sib.ptr_size, 0) }; |
| 404 | }, | 404 | }, |
| 405 | .mov => break :op .{ .mem = Memory.rip(mem_op.sib.ptr_size, 0) }, | 405 | .mov => { |
| | 406 | if (elf_sym.flags.is_extern_ptr) { |
| | 407 | const reg = ops[0].reg; |
| | 408 | lower.result_insts[lower.result_insts_len] = |
| | 409 | try Instruction.new(.none, .mov, &[_]Operand{ |
| | 410 | .{ .reg = reg.to64() }, |
| | 411 | .{ .mem = Memory.rip(.qword, 0) }, |
| | 412 | }); |
| | 413 | lower.result_insts_len += 1; |
| | 414 | break :op .{ .mem = Memory.sib(mem_op.sib.ptr_size, .{ .base = .{ |
| | 415 | .reg = reg.to64(), |
| | 416 | } }) }; |
| | 417 | } |
| | 418 | break :op .{ .mem = Memory.rip(mem_op.sib.ptr_size, 0) }; |
| | 419 | }, |
| 406 | else => unreachable, | 420 | else => unreachable, |
| 407 | } else switch (mnemonic) { | 421 | } else switch (mnemonic) { |
| 408 | .call => break :op .{ .mem = Memory.sib(mem_op.sib.ptr_size, .{ | 422 | .call => break :op .{ .mem = Memory.sib(mem_op.sib.ptr_size, .{ |