diff --git a/llvm/lib/Target/Mips/AsmParser/MipsAsmParser.cpp b/llvm/lib/Target/Mips/AsmParser/MipsAsmParser.cpp --- a/llvm/lib/Target/Mips/AsmParser/MipsAsmParser.cpp +++ b/llvm/lib/Target/Mips/AsmParser/MipsAsmParser.cpp @@ -2871,7 +2871,6 @@ bool Is32BitSym, SMLoc IDLoc, MCStreamer &Out, const MCSubtargetInfo *STI) { - // FIXME: These expansions do not respect -mxgot. MipsTargetStreamer &TOut = getTargetStreamer(); bool UseSrcReg = SrcReg != Mips::NoRegister && SrcReg != Mips::ZERO && SrcReg != Mips::ZERO_64; @@ -2895,6 +2894,7 @@ (Res.getSymA()->getSymbol().isELF() && cast(Res.getSymA()->getSymbol()).getBinding() == ELF::STB_LOCAL); + bool UseXGOT = STI->getFeatureBits()[Mips::FeatureXGOT] && !IsLocalSym; // The case where the result register is $25 is somewhat special. If the // symbol in the final relocation is external and not modified with a @@ -2902,10 +2902,69 @@ // or R_MIPS_CALL16 instead of R_MIPS_GOT_DISP in 64-bit case. if ((DstReg == Mips::T9 || DstReg == Mips::T9_64) && !UseSrcReg && Res.getConstant() == 0 && !IsLocalSym) { - const MCExpr *CallExpr = - MipsMCExpr::create(MipsMCExpr::MEK_GOT_CALL, SymExpr, getContext()); - TOut.emitRRX(IsPtr64 ? Mips::LD : Mips::LW, DstReg, GPReg, - MCOperand::createExpr(CallExpr), IDLoc, STI); + if (UseXGOT) { + const MCExpr *CallHiExpr = MipsMCExpr::create(MipsMCExpr::MEK_CALL_HI16, + SymExpr, getContext()); + const MCExpr *CallLoExpr = MipsMCExpr::create(MipsMCExpr::MEK_CALL_LO16, + SymExpr, getContext()); + TOut.emitRX(Mips::LUi, DstReg, MCOperand::createExpr(CallHiExpr), IDLoc, + STI); + TOut.emitRRR(IsPtr64 ? Mips::DADDu : Mips::ADDu, DstReg, DstReg, GPReg, + IDLoc, STI); + TOut.emitRRX(IsPtr64 ? Mips::LD : Mips::LW, DstReg, DstReg, + MCOperand::createExpr(CallLoExpr), IDLoc, STI); + } else { + const MCExpr *CallExpr = + MipsMCExpr::create(MipsMCExpr::MEK_GOT_CALL, SymExpr, getContext()); + TOut.emitRRX(IsPtr64 ? Mips::LD : Mips::LW, DstReg, GPReg, + MCOperand::createExpr(CallExpr), IDLoc, STI); + } + return false; + } + + unsigned TmpReg = DstReg; + if (UseSrcReg && + getContext().getRegisterInfo()->isSuperOrSubRegisterEq(DstReg, + SrcReg)) { + // If $rs is the same as $rd, we need to use AT. + // If it is not available we exit. + unsigned ATReg = getATReg(IDLoc); + if (!ATReg) + return true; + TmpReg = ATReg; + } + + if (UseXGOT) { + // Loading address from XGOT + // External GOT: lui $tmp, %got_hi(symbol)($gp) + // addu $tmp, $tmp, $gp + // lw $tmp, %got_lo(symbol)($tmp) + // >addiu $tmp, $tmp, offset + // >addiu $rd, $tmp, $rs + // The addiu's marked with a '>' may be omitted if they are redundant. If + // this happens then the last instruction must use $rd as the result + // register. + const MCExpr *CallHiExpr = + MipsMCExpr::create(MipsMCExpr::MEK_GOT_HI16, SymExpr, getContext()); + const MCExpr *CallLoExpr = MipsMCExpr::create( + MipsMCExpr::MEK_GOT_LO16, Res.getSymA(), getContext()); + + TOut.emitRX(Mips::LUi, TmpReg, MCOperand::createExpr(CallHiExpr), IDLoc, + STI); + TOut.emitRRR(IsPtr64 ? Mips::DADDu : Mips::ADDu, TmpReg, TmpReg, GPReg, + IDLoc, STI); + TOut.emitRRX(IsPtr64 ? Mips::LD : Mips::LW, TmpReg, TmpReg, + MCOperand::createExpr(CallLoExpr), IDLoc, STI); + + if (Res.getConstant() != 0) + TOut.emitRRX(IsPtr64 ? Mips::DADDiu : Mips::ADDiu, TmpReg, TmpReg, + MCOperand::createExpr(MCConstantExpr::create( + Res.getConstant(), getContext())), + IDLoc, STI); + + if (UseSrcReg) + TOut.emitRRR(IsPtr64 ? Mips::DADDu : Mips::ADDu, DstReg, TmpReg, SrcReg, + IDLoc, STI); return false; } @@ -2961,18 +3020,6 @@ } } - unsigned TmpReg = DstReg; - if (UseSrcReg && - getContext().getRegisterInfo()->isSuperOrSubRegisterEq(DstReg, - SrcReg)) { - // If $rs is the same as $rd, we need to use AT. - // If it is not available we exit. - unsigned ATReg = getATReg(IDLoc); - if (!ATReg) - return true; - TmpReg = ATReg; - } - TOut.emitRRX(IsPtr64 ? Mips::LD : Mips::LW, TmpReg, GPReg, MCOperand::createExpr(GotExpr), IDLoc, STI); diff --git a/llvm/test/MC/Mips/mips-expansions.s b/llvm/test/MC/Mips/mips-expansions.s --- a/llvm/test/MC/Mips/mips-expansions.s +++ b/llvm/test/MC/Mips/mips-expansions.s @@ -1,5 +1,7 @@ -# RUN: llvm-mc %s -triple=mipsel-unknown-linux -mcpu=mips32r2 \ +# RUN: llvm-mc %s -triple=mipsel-unknown-linux -mcpu=mips32r2 -mattr=-xgot \ # RUN: -show-encoding | FileCheck %s --check-prefixes=CHECK,CHECK-LE,GOT +# RUN: llvm-mc %s -triple=mipsel-unknown-linux -mcpu=mips32r2 -mattr=+xgot \ +# RUN: -show-encoding | FileCheck %s --check-prefixes=CHECK,CHECK-LE,XGOT # RUN: llvm-mc %s -triple=mips-unknown-linux -mcpu=mips32r2 \ # RUN: -show-encoding | FileCheck %s --check-prefixes=CHECK,CHECK-BE @@ -114,6 +116,14 @@ # GOT-NEXT: # fixup A - offset: 0, value: %got(symbol), kind: fixup_Mips_GOT # GOT-NEXT: addu $10, $10, $4 # encoding: [0x21,0x50,0x44,0x01] # GOT-NEXT: lw $10, 0($10) # encoding: [0x00,0x00,0x4a,0x8d] + +# XGOT: lui $10, %got_hi(symbol) # encoding: [A,A,0x0a,0x3c] +# XGOT-NEXT: # fixup A - offset: 0, value: %got_hi(symbol), kind: fixup_Mips_GOT_HI16 +# XGOT-NEXT: addu $10, $10, $gp # encoding: [0x21,0x50,0x5c,0x01] +# XGOT-NEXT: lw $10, %got_lo(symbol)($10) # encoding: [A,A,0x4a,0x8d] +# XGOT-NEXT: # fixup A - offset: 0, value: %got_lo(symbol), kind: fixup_Mips_GOT_LO16 +# XGOT-NEXT: addu $10, $10, $4 # encoding: [0x21,0x50,0x44,0x01] +# XGOT-NEXT: lw $10, 0($10) # encoding: [0x00,0x00,0x4a,0x8d] .set at sw $10, symbol($9) # GOT: lw $1, %got(symbol)($gp) # encoding: [A,A,0x81,0x8f] @@ -121,12 +131,26 @@ # GOT-NEXT: addu $1, $1, $9 # encoding: [0x21,0x08,0x29,0x00] # GOT-NEXT: sw $10, 0($1) # encoding: [0x00,0x00,0x2a,0xac] +# XGOT: lui $1, %got_hi(symbol) # encoding: [A,A,0x01,0x3c] +# XGOT-NEXT: # fixup A - offset: 0, value: %got_hi(symbol), kind: fixup_Mips_GOT_HI16 +# XGOT-NEXT: addu $1, $1, $gp # encoding: [0x21,0x08,0x3c,0x00] +# XGOT-NEXT: lw $1, %got_lo(symbol)($1) # encoding: [A,A,0x21,0x8c] +# XGOT-NEXT: # fixup A - offset: 0, value: %got_lo(symbol), kind: fixup_Mips_GOT_LO16 +# XGOT-NEXT: addu $1, $1, $9 # encoding: [0x21,0x08,0x29,0x00] +# XGOT-NEXT: sw $10, 0($1) # encoding: [0x00,0x00,0x2a,0xac] + lw $8, 1f+8 # GOT: lw $8, %got($tmp0)($gp) # encoding: [A,A,0x88,0x8f] # GOT-NEXT: # fixup A - offset: 0, value: %got($tmp0), kind: fixup_Mips_GOT # GOT-NEXT: addiu $8, $8, %lo($tmp0) # encoding: [A,A,0x08,0x25] # GOT-NEXT: # fixup A - offset: 0, value: %lo($tmp0), kind: fixup_Mips_LO16 # GOT-NEXT: lw $8, 8($8) # encoding: [0x08,0x00,0x08,0x8d] + +# XGOT: lw $8, %got($tmp0)($gp) # encoding: [A,A,0x88,0x8f] +# XGOT-NEXT: # fixup A - offset: 0, value: %got($tmp0), kind: fixup_Mips_GOT +# XGOT-NEXT: addiu $8, $8, %lo($tmp0) # encoding: [A,A,0x08,0x25] +# XGOT-NEXT: # fixup A - offset: 0, value: %lo($tmp0), kind: fixup_Mips_LO16 +# XGOT-NEXT: lw $8, 8($8) # encoding: [0x08,0x00,0x08,0x8d] sw $8, 1f+8 # GOT: lw $1, %got($tmp0)($gp) # encoding: [A,A,0x81,0x8f] # GOT-NEXT: # fixup A - offset: 0, value: %got($tmp0), kind: fixup_Mips_GOT @@ -134,32 +158,74 @@ # GOT-NEXT: # fixup A - offset: 0, value: %lo($tmp0), kind: fixup_Mips_LO16 # GOT-NEXT: sw $8, 8($1) # encoding: [0x08,0x00,0x28,0xac] +# XGOT: lw $1, %got($tmp0)($gp) # encoding: [A,A,0x81,0x8f] +# XGOT-NEXT: # fixup A - offset: 0, value: %got($tmp0), kind: fixup_Mips_GOT +# XGOT-NEXT: addiu $1, $1, %lo($tmp0) # encoding: [A,A,0x21,0x24] +# XGOT-NEXT: # fixup A - offset: 0, value: %lo($tmp0), kind: fixup_Mips_LO16 +# XGOT-NEXT: sw $8, 8($1) # encoding: [0x08,0x00,0x28,0xac] + lw $10, 655483($4) # GOT: lui $10, 10 # encoding: [0x0a,0x00,0x0a,0x3c] # GOT-NEXT: addu $10, $10, $4 # encoding: [0x21,0x50,0x44,0x01] # GOT-NEXT: lw $10, 123($10) # encoding: [0x7b,0x00,0x4a,0x8d] + +# XGOT: lui $10, 10 # encoding: [0x0a,0x00,0x0a,0x3c] +# XGOT-NEXT: addu $10, $10, $4 # encoding: [0x21,0x50,0x44,0x01] +# XGOT-NEXT: lw $10, 123($10) # encoding: [0x7b,0x00,0x4a,0x8d] sw $10, 123456($9) # GOT: lui $1, 2 # encoding: [0x02,0x00,0x01,0x3c] # GOT-NEXT: addu $1, $1, $9 # encoding: [0x21,0x08,0x29,0x00] # GOT-NEXT: sw $10, -7616($1) # encoding: [0x40,0xe2,0x2a,0xac] +# XGOT: lui $1, 2 # encoding: [0x02,0x00,0x01,0x3c] +# XGOT-NEXT: addu $1, $1, $9 # encoding: [0x21,0x08,0x29,0x00] +# XGOT-NEXT: sw $10, -7616($1) # encoding: [0x40,0xe2,0x2a,0xac] + lw $8, symbol+8 # GOT: lw $8, %got(symbol)($gp) # encoding: [A,A,0x88,0x8f] # GOT-NEXT: # fixup A - offset: 0, value: %got(symbol), kind: fixup_Mips_GOT # GOT-NEXT: lw $8, 8($8) # encoding: [0x08,0x00,0x08,0x8d] + +# XGOT: lui $8, %got_hi(symbol) # encoding: [A,A,0x08,0x3c] +# XGOT-NEXT: # fixup A - offset: 0, value: %got_hi(symbol), kind: fixup_Mips_GOT_HI16 +# XGOT-NEXT: addu $8, $8, $gp # encoding: [0x21,0x40,0x1c,0x01] +# XGOT-NEXT: lw $8, %got_lo(symbol)($8) # encoding: [A,A,0x08,0x8d] +# XGOT-NEXT: # fixup A - offset: 0, value: %got_lo(symbol), kind: fixup_Mips_GOT_LO16 +# XGOT-NEXT: lw $8, 8($8) # encoding: [0x08,0x00,0x08,0x8d] sw $8, symbol+8 # GOT: lw $1, %got(symbol)($gp) # encoding: [A,A,0x81,0x8f] # GOT-NEXT: # fixup A - offset: 0, value: %got(symbol), kind: fixup_Mips_GOT # GOT-NEXT: sw $8, 8($1) # encoding: [0x08,0x00,0x28,0xac] +# XGOT: lui $1, %got_hi(symbol) # encoding: [A,A,0x01,0x3c] +# XGOT-NEXT: # fixup A - offset: 0, value: %got_hi(symbol), kind: fixup_Mips_GOT_HI16 +# XGOT-NEXT: addu $1, $1, $gp # encoding: [0x21,0x08,0x3c,0x00] +# XGOT-NEXT: lw $1, %got_lo(symbol)($1) # encoding: [A,A,0x21,0x8c] +# XGOT-NEXT: # fixup A - offset: 0, value: %got_lo(symbol), kind: fixup_Mips_GOT_LO16 +# XGOT-NEXT: sw $8, 8($1) # encoding: [0x08,0x00,0x28,0xac] + ldc1 $f0, symbol # GOT: lw $1, %got(symbol)($gp) # encoding: [A,A,0x81,0x8f] # GOT-NEXT: # fixup A - offset: 0, value: %got(symbol), kind: fixup_Mips_GOT # GOT-NEXT: ldc1 $f0, 0($1) # encoding: [0x00,0x00,0x20,0xd4] + +# XGOT: lui $1, %got_hi(symbol) # encoding: [A,A,0x01,0x3c] +# XGOT-NEXT: # fixup A - offset: 0, value: %got_hi(symbol), kind: fixup_Mips_GOT_HI16 +# XGOT-NEXT: addu $1, $1, $gp # encoding: [0x21,0x08,0x3c,0x00] +# XGOT-NEXT: lw $1, %got_lo(symbol)($1) # encoding: [A,A,0x21,0x8c] +# XGOT-NEXT: # fixup A - offset: 0, value: %got_lo(symbol), kind: fixup_Mips_GOT_LO16 +# XGOT-NEXT: ldc1 $f0, 0($1) # encoding: [0x00,0x00,0x20,0xd4] sdc1 $f0, symbol # GOT: lw $1, %got(symbol)($gp) # encoding: [A,A,0x81,0x8f] # GOT-NEXT: # fixup A - offset: 0, value: %got(symbol), kind: fixup_Mips_GOT # GOT-NEXT: sdc1 $f0, 0($1) # encoding: [0x00,0x00,0x20,0xf4] + +# XGOT: lui $1, %got_hi(symbol) # encoding: [A,A,0x01,0x3c] +# XGOT-NEXT: # fixup A - offset: 0, value: %got_hi(symbol), kind: fixup_Mips_GOT_HI16 +# XGOT-NEXT: addu $1, $1, $gp # encoding: [0x21,0x08,0x3c,0x00] +# XGOT-NEXT: lw $1, %got_lo(symbol)($1) # encoding: [A,A,0x21,0x8c] +# XGOT-NEXT: # fixup A - offset: 0, value: %got_lo(symbol), kind: fixup_Mips_GOT_LO16 +# XGOT-NEXT: sdc1 $f0, 0($1) # encoding: [0x00,0x00,0x20,0xf4] .option pic0 # Test BNE with an immediate as the 2nd operand. diff --git a/llvm/test/MC/Mips/mips64-expansions.s b/llvm/test/MC/Mips/mips64-expansions.s --- a/llvm/test/MC/Mips/mips64-expansions.s +++ b/llvm/test/MC/Mips/mips64-expansions.s @@ -475,44 +475,108 @@ # GOT-NEXT: # fixup A - offset: 0, value: %got_disp(symbol), kind: fixup_Mips_GOT_DISP # GOT-NEXT: daddu $10, $10, $4 # encoding: [0x2d,0x50,0x44,0x01] # GOT-NEXT: lw $10, 0($10) # encoding: [0x00,0x00,0x4a,0x8d] + +# XGOT: lui $10, %got_hi(symbol) # encoding: [A,A,0x0a,0x3c] +# XGOT-NEXT: # fixup A - offset: 0, value: %got_hi(symbol), kind: fixup_Mips_GOT_HI16 +# XGOT-NEXT: daddu $10, $10, $gp # encoding: [0x2d,0x50,0x5c,0x01] +# XGOT-NEXT: ld $10, %got_lo(symbol)($10) # encoding: [A,A,0x4a,0xdd] +# XGOT-NEXT: # fixup A - offset: 0, value: %got_lo(symbol), kind: fixup_Mips_GOT_LO16 +# XGOT-NEXT: daddu $10, $10, $4 # encoding: [0x2d,0x50,0x44,0x01] +# XGOT-NEXT: lw $10, 0($10) # encoding: [0x00,0x00,0x4a,0x8d] + sw $10, symbol($9) # GOT: ld $1, %got_disp(symbol)($gp) # encoding: [A,A,0x81,0xdf] # GOT-NEXT: # fixup A - offset: 0, value: %got_disp(symbol), kind: fixup_Mips_GOT_DISP # GOT-NEXT: daddu $1, $1, $9 # encoding: [0x2d,0x08,0x29,0x00] # GOT-NEXT: sw $10, 0($1) # encoding: [0x00,0x00,0x2a,0xac] +# XGOT: lui $1, %got_hi(symbol) # encoding: [A,A,0x01,0x3c] +# XGOT-NEXT: # fixup A - offset: 0, value: %got_hi(symbol), kind: fixup_Mips_GOT_HI16 +# XGOT-NEXT: daddu $1, $1, $gp # encoding: [0x2d,0x08,0x3c,0x00] +# XGOT-NEXT: ld $1, %got_lo(symbol)($1) # encoding: [A,A,0x21,0xdc] +# XGOT-NEXT: # fixup A - offset: 0, value: %got_lo(symbol), kind: fixup_Mips_GOT_LO16 +# XGOT-NEXT: daddu $1, $1, $9 # encoding: [0x2d,0x08,0x29,0x00] +# XGOT-NEXT: sw $10, 0($1) # encoding: [0x00,0x00,0x2a,0xac] + lw $8, sym+8 # GOT: ld $8, %got_disp(sym)($gp) # encoding: [A,A,0x88,0xdf] # GOT-NEXT: # fixup A - offset: 0, value: %got_disp(sym), kind: fixup_Mips_GOT_DISP # GOT-NEXT: lw $8, 8($8) # encoding: [0x08,0x00,0x08,0x8d] + +# XGOT: ld $8, %got_disp(sym)($gp) # encoding: [A,A,0x88,0xdf] +# XGOT-NEXT: # fixup A - offset: 0, value: %got_disp(sym), kind: fixup_Mips_GOT_DISP +# XGOT-NEXT: lw $8, 8($8) # encoding: [0x08,0x00,0x08,0x8d] + sw $8, sym+8 # GOT: ld $1, %got_disp(sym)($gp) # encoding: [A,A,0x81,0xdf] # GOT-NEXT: # fixup A - offset: 0, value: %got_disp(sym), kind: fixup_Mips_GOT_DISP # GOT-NEXT: sw $8, 8($1) # encoding: [0x08,0x00,0x28,0xac] +# XGOT: ld $1, %got_disp(sym)($gp) # encoding: [A,A,0x81,0xdf] +# XGOT-NEXT: # fixup A - offset: 0, value: %got_disp(sym), kind: fixup_Mips_GOT_DISP +# XGOT-NEXT: sw $8, 8($1) # encoding: [0x08,0x00,0x28,0xac] + lw $10, 655483($4) # GOT: lui $10, 10 # encoding: [0x0a,0x00,0x0a,0x3c] # GOT-NEXT: daddu $10, $10, $4 # encoding: [0x2d,0x50,0x44,0x01] # GOT-NEXT: lw $10, 123($10) # encoding: [0x7b,0x00,0x4a,0x8d] + +# XGOT: lui $10, 10 # encoding: [0x0a,0x00,0x0a,0x3c] +# XGOT-NEXT: daddu $10, $10, $4 # encoding: [0x2d,0x50,0x44,0x01] +# XGOT-NEXT: lw $10, 123($10) # encoding: [0x7b,0x00,0x4a,0x8d] sw $10, 123456($9) # GOT: lui $1, 2 # encoding: [0x02,0x00,0x01,0x3c] # GOT-NEXT: daddu $1, $1, $9 # encoding: [0x2d,0x08,0x29,0x00] # GOT-NEXT: sw $10, -7616($1) # encoding: [0x40,0xe2,0x2a,0xac] +# XGOT: lui $1, 2 # encoding: [0x02,0x00,0x01,0x3c] +# XGOT-NEXT: daddu $1, $1, $9 # encoding: [0x2d,0x08,0x29,0x00] +# XGOT-NEXT: sw $10, -7616($1) # encoding: [0x40,0xe2,0x2a,0xac] + lw $8, symbol+8 # GOT: ld $8, %got_disp(symbol)($gp) # encoding: [A,A,0x88,0xdf] # GOT-NEXT: # fixup A - offset: 0, value: %got_disp(symbol), kind: fixup_Mips_GOT_DISP # GOT-NEXT: lw $8, 8($8) # encoding: [0x08,0x00,0x08,0x8d] + +# XGOT: lui $8, %got_hi(symbol) # encoding: [A,A,0x08,0x3c] +# XGOT-NEXT: # fixup A - offset: 0, value: %got_hi(symbol), kind: fixup_Mips_GOT_HI16 +# XGOT-NEXT: daddu $8, $8, $gp # encoding: [0x2d,0x40,0x1c,0x01] +# XGOT-NEXT: ld $8, %got_lo(symbol)($8) # encoding: [A,A,0x08,0xdd] +# XGOT-NEXT: # fixup A - offset: 0, value: %got_lo(symbol), kind: fixup_Mips_GOT_LO16 +# XGOT-NEXT: lw $8, 8($8) # encoding: [0x08,0x00,0x08,0x8d] + sw $8, symbol+8 # GOT: ld $1, %got_disp(symbol)($gp) # encoding: [A,A,0x81,0xdf] # GOT-NEXT: # fixup A - offset: 0, value: %got_disp(symbol), kind: fixup_Mips_GOT_DISP # GOT-NEXT: sw $8, 8($1) # encoding: [0x08,0x00,0x28,0xac] +# XGOT: lui $1, %got_hi(symbol) # encoding: [A,A,0x01,0x3c] +# XGOT-NEXT: # fixup A - offset: 0, value: %got_hi(symbol), kind: fixup_Mips_GOT_HI16 +# XGOT-NEXT: daddu $1, $1, $gp # encoding: [0x2d,0x08,0x3c,0x00] +# XGOT-NEXT: ld $1, %got_lo(symbol)($1) # encoding: [A,A,0x21,0xdc] +# XGOT-NEXT: # fixup A - offset: 0, value: %got_lo(symbol), kind: fixup_Mips_GOT_LO16 +# XGOT-NEXT: sw $8, 8($1) # encoding: [0x08,0x00,0x28,0xac] + ldc1 $f0, symbol # GOT: ld $1, %got_disp(symbol)($gp) # encoding: [A,A,0x81,0xdf] # GOT-NEXT: # fixup A - offset: 0, value: %got_disp(symbol), kind: fixup_Mips_GOT_DISP # GOT-NEXT: ldc1 $f0, 0($1) # encoding: [0x00,0x00,0x20,0xd4] + +# XGOT: lui $1, %got_hi(symbol) # encoding: [A,A,0x01,0x3c] +# XGOT-NEXT: # fixup A - offset: 0, value: %got_hi(symbol), kind: fixup_Mips_GOT_HI16 +# XGOT-NEXT: daddu $1, $1, $gp # encoding: [0x2d,0x08,0x3c,0x00] +# XGOT-NEXT: ld $1, %got_lo(symbol)($1) # encoding: [A,A,0x21,0xdc] +# XGOT-NEXT: # fixup A - offset: 0, value: %got_lo(symbol), kind: fixup_Mips_GOT_LO16 +# XGOT-NEXT: ldc1 $f0, 0($1) # encoding: [0x00,0x00,0x20,0xd4] + sdc1 $f0, symbol # GOT: ld $1, %got_disp(symbol)($gp) # encoding: [A,A,0x81,0xdf] # GOT-NEXT: # fixup A - offset: 0, value: %got_disp(symbol), kind: fixup_Mips_GOT_DISP # GOT-NEXT: sdc1 $f0, 0($1) # encoding: [0x00,0x00,0x20,0xf4] + +# XGOT: lui $1, %got_hi(symbol) # encoding: [A,A,0x01,0x3c] +# XGOT-NEXT: # fixup A - offset: 0, value: %got_hi(symbol), kind: fixup_Mips_GOT_HI16 +# XGOT-NEXT: daddu $1, $1, $gp # encoding: [0x2d,0x08,0x3c,0x00] +# XGOT-NEXT: ld $1, %got_lo(symbol)($1) # encoding: [A,A,0x21,0xdc] +# XGOT-NEXT: # fixup A - offset: 0, value: %got_lo(symbol), kind: fixup_Mips_GOT_LO16 +# XGOT-NEXT: sdc1 $f0, 0($1) # encoding: [0x00,0x00,0x20,0xf4]