diff --git a/llvm/lib/Target/X86/MCTargetDesc/X86MCCodeEmitter.cpp b/llvm/lib/Target/X86/MCTargetDesc/X86MCCodeEmitter.cpp --- a/llvm/lib/Target/X86/MCTargetDesc/X86MCCodeEmitter.cpp +++ b/llvm/lib/Target/X86/MCTargetDesc/X86MCCodeEmitter.cpp @@ -409,6 +409,12 @@ switch (Opcode) { default: return X86::reloc_riprel_4byte; + case X86::MOV64rm: + // movq loads is a subset of reloc_riprel_4byte_relax_rex. It is a + // special case because COFF and Mach-O don't support ELF's more + // flexible R_X86_64_REX_GOTPCRELX relaxation. + assert(HasREX); + return X86::reloc_riprel_4byte_movq_load; case X86::ADC32rm: case X86::ADD32rm: case X86::AND32rm: @@ -419,13 +425,6 @@ case X86::SUB32rm: case X86::TEST32mr: case X86::XOR32rm: - return X86::reloc_riprel_4byte_relax; - case X86::MOV64rm: - // movq loads is a subset of reloc_riprel_4byte_relax_rex. It is a - // special case because COFF and Mach-O don't support ELF's more - // flexible R_X86_64_REX_GOTPCRELX relaxation. - assert(HasREX); - return X86::reloc_riprel_4byte_movq_load; case X86::CALL64m: case X86::JMP64m: case X86::TAILJMPm64: diff --git a/llvm/test/MC/X86/gotpcrelx.s b/llvm/test/MC/X86/gotpcrelx.s --- a/llvm/test/MC/X86/gotpcrelx.s +++ b/llvm/test/MC/X86/gotpcrelx.s @@ -17,6 +17,16 @@ # CHECK-NEXT: R_X86_64_GOTPCRELX xor # CHECK-NEXT: R_X86_64_GOTPCRELX call # CHECK-NEXT: R_X86_64_GOTPCRELX jmp +# CHECK-NEXT: R_X86_64_REX_GOTPCRELX mov +# CHECK-NEXT: R_X86_64_REX_GOTPCRELX test +# CHECK-NEXT: R_X86_64_REX_GOTPCRELX adc +# CHECK-NEXT: R_X86_64_REX_GOTPCRELX add +# CHECK-NEXT: R_X86_64_REX_GOTPCRELX and +# CHECK-NEXT: R_X86_64_REX_GOTPCRELX cmp +# CHECK-NEXT: R_X86_64_REX_GOTPCRELX or +# CHECK-NEXT: R_X86_64_REX_GOTPCRELX sbb +# CHECK-NEXT: R_X86_64_REX_GOTPCRELX sub +# CHECK-NEXT: R_X86_64_REX_GOTPCRELX xor # CHECK-NEXT: } # NORELAX-NEXT: R_X86_64_GOTPCREL mov @@ -31,6 +41,16 @@ # NORELAX-NEXT: R_X86_64_GOTPCREL xor # NORELAX-NEXT: R_X86_64_GOTPCREL call # NORELAX-NEXT: R_X86_64_GOTPCREL jmp +# NORELAX-NEXT: R_X86_64_GOTPCREL mov +# NORELAX-NEXT: R_X86_64_GOTPCREL test +# NORELAX-NEXT: R_X86_64_GOTPCREL adc +# NORELAX-NEXT: R_X86_64_GOTPCREL add +# NORELAX-NEXT: R_X86_64_GOTPCREL and +# NORELAX-NEXT: R_X86_64_GOTPCREL cmp +# NORELAX-NEXT: R_X86_64_GOTPCREL or +# NORELAX-NEXT: R_X86_64_GOTPCREL sbb +# NORELAX-NEXT: R_X86_64_GOTPCREL sub +# NORELAX-NEXT: R_X86_64_GOTPCREL xor # NORELAX-NEXT: } movl mov@GOTPCREL(%rip), %eax @@ -46,6 +66,17 @@ call *call@GOTPCREL(%rip) jmp *jmp@GOTPCREL(%rip) +movl mov@GOTPCREL(%rip), %r8d +test %r8d, test@GOTPCREL(%rip) +adc adc@GOTPCREL(%rip), %r8d +add add@GOTPCREL(%rip), %r8d +and and@GOTPCREL(%rip), %r8d +cmp cmp@GOTPCREL(%rip), %r8d +or or@GOTPCREL(%rip), %r8d +sbb sbb@GOTPCREL(%rip), %r8d +sub sub@GOTPCREL(%rip), %r8d +xor xor@GOTPCREL(%rip), %r8d + # COMMON-NEXT: Section ({{.*}}) .rela.norelax { # COMMON-NEXT: R_X86_64_GOTPCREL mov 0x0 # COMMON-NEXT: R_X86_64_GOTPCREL mov 0xFFFFFFFFFFFFFFFC