diff options
Diffstat (limited to 'llvm/lib/Target/Mips/AsmParser/MipsAsmParser.cpp')
| -rw-r--r-- | llvm/lib/Target/Mips/AsmParser/MipsAsmParser.cpp | 859 |
1 files changed, 399 insertions, 460 deletions
diff --git a/llvm/lib/Target/Mips/AsmParser/MipsAsmParser.cpp b/llvm/lib/Target/Mips/AsmParser/MipsAsmParser.cpp index ae1f4545c6a4..01e4d17f6236 100644 --- a/llvm/lib/Target/Mips/AsmParser/MipsAsmParser.cpp +++ b/llvm/lib/Target/Mips/AsmParser/MipsAsmParser.cpp @@ -9,9 +9,9 @@ #include "MCTargetDesc/MipsABIFlagsSection.h" #include "MCTargetDesc/MipsABIInfo.h" #include "MCTargetDesc/MipsBaseInfo.h" -#include "MCTargetDesc/MipsMCExpr.h" +#include "MCTargetDesc/MipsMCAsmInfo.h" #include "MCTargetDesc/MipsMCTargetDesc.h" -#include "MipsTargetStreamer.h" +#include "MCTargetDesc/MipsTargetStreamer.h" #include "TargetInfo/MipsTargetInfo.h" #include "llvm/ADT/APFloat.h" #include "llvm/ADT/SmallVector.h" @@ -25,7 +25,7 @@ #include "llvm/MC/MCInstrDesc.h" #include "llvm/MC/MCInstrInfo.h" #include "llvm/MC/MCObjectFileInfo.h" -#include "llvm/MC/MCParser/MCAsmLexer.h" +#include "llvm/MC/MCParser/AsmLexer.h" #include "llvm/MC/MCParser/MCAsmParser.h" #include "llvm/MC/MCParser/MCAsmParserExtension.h" #include "llvm/MC/MCParser/MCAsmParserUtils.h" @@ -205,6 +205,7 @@ class MipsAsmParser : public MCTargetAsmParser { ParseStatus parseJumpTarget(OperandVector &Operands); ParseStatus parseInvNum(OperandVector &Operands); ParseStatus parseRegisterList(OperandVector &Operands); + const MCExpr *parseRelocExpr(); bool searchSymbolAlias(OperandVector &Operands); @@ -224,12 +225,12 @@ class MipsAsmParser : public MCTargetAsmParser { bool expandJalWithRegs(MCInst &Inst, SMLoc IDLoc, MCStreamer &Out, const MCSubtargetInfo *STI); - bool loadImmediate(int64_t ImmValue, unsigned DstReg, unsigned SrcReg, + bool loadImmediate(int64_t ImmValue, MCRegister DstReg, MCRegister SrcReg, bool Is32BitImm, bool IsAddress, SMLoc IDLoc, MCStreamer &Out, const MCSubtargetInfo *STI); - bool loadAndAddSymbolAddress(const MCExpr *SymExpr, unsigned DstReg, - unsigned SrcReg, bool Is32BitSym, SMLoc IDLoc, + bool loadAndAddSymbolAddress(const MCExpr *SymExpr, MCRegister DstReg, + MCRegister SrcReg, bool Is32BitSym, SMLoc IDLoc, MCStreamer &Out, const MCSubtargetInfo *STI); bool emitPartialAddress(MipsTargetStreamer &TOut, SMLoc IDLoc, MCSymbol *Sym); @@ -246,7 +247,7 @@ class MipsAsmParser : public MCTargetAsmParser { bool expandLoadDoubleImmToFPR(MCInst &Inst, bool Is64FPU, SMLoc IDLoc, MCStreamer &Out, const MCSubtargetInfo *STI); - bool expandLoadAddress(unsigned DstReg, unsigned BaseReg, + bool expandLoadAddress(MCRegister DstReg, MCRegister BaseReg, const MCOperand &Offset, bool Is32BitAddress, SMLoc IDLoc, MCStreamer &Out, const MCSubtargetInfo *STI); @@ -353,8 +354,6 @@ class MipsAsmParser : public MCTargetAsmParser { bool reportParseError(const Twine &ErrorMsg); bool reportParseError(SMLoc Loc, const Twine &ErrorMsg); - bool parseMemOffset(const MCExpr *&Res, bool isParenExpr); - bool parseSetMips0Directive(); bool parseSetArchDirective(); bool parseSetFeature(uint64_t Feature); @@ -428,12 +427,12 @@ class MipsAsmParser : public MCTargetAsmParser { int matchMSA128CtrlRegisterName(StringRef Name); - unsigned getReg(int RC, int RegNo); + MCRegister getReg(int RC, int RegNo); /// Returns the internal register number for the current AT. Also checks if /// the current AT is unavailable (set to $0) and gives an error if it is. /// This should be used in pseudo-instruction expansions which need AT. - unsigned getATReg(SMLoc Loc); + MCRegister getATReg(SMLoc Loc); bool canUseATReg(); @@ -524,9 +523,9 @@ public: MipsAsmParser(const MCSubtargetInfo &sti, MCAsmParser &parser, const MCInstrInfo &MII, const MCTargetOptions &Options) - : MCTargetAsmParser(Options, sti, MII), - ABI(MipsABIInfo::computeTargetABI(Triple(sti.getTargetTriple()), - sti.getCPU(), Options)) { + : MCTargetAsmParser(Options, sti, MII), + ABI(MipsABIInfo::computeTargetABI(sti.getTargetTriple(), sti.getCPU(), + Options)) { MCAsmParserExtension::Initialize(parser); parser.addAliasForDirective(".asciiz", ".asciz"); @@ -584,9 +583,9 @@ public: if (!EmitJalrReloc) return false; MCValue Res; - if (!JalExpr->evaluateAsRelocatable(Res, nullptr, nullptr)) + if (!JalExpr->evaluateAsRelocatable(Res, nullptr)) return false; - if (Res.getSymB() != nullptr) + if (Res.getSubSym()) return false; if (Res.getConstant() != 0) return ABI.IsN32() || ABI.IsN64(); @@ -735,70 +734,12 @@ public: void onEndOfFile() override; /// Warn if RegIndex is the same as the current AT. - void warnIfRegIndexIsAT(unsigned RegIndex, SMLoc Loc); + void warnIfRegIndexIsAT(MCRegister RegIndex, SMLoc Loc); void warnIfNoMacro(SMLoc Loc); bool isLittle() const { return IsLittleEndian; } - const MCExpr *createTargetUnaryExpr(const MCExpr *E, - AsmToken::TokenKind OperatorToken, - MCContext &Ctx) override { - switch(OperatorToken) { - default: - llvm_unreachable("Unknown token"); - return nullptr; - case AsmToken::PercentCall16: - return MipsMCExpr::create(MipsMCExpr::MEK_GOT_CALL, E, Ctx); - case AsmToken::PercentCall_Hi: - return MipsMCExpr::create(MipsMCExpr::MEK_CALL_HI16, E, Ctx); - case AsmToken::PercentCall_Lo: - return MipsMCExpr::create(MipsMCExpr::MEK_CALL_LO16, E, Ctx); - case AsmToken::PercentDtprel_Hi: - return MipsMCExpr::create(MipsMCExpr::MEK_DTPREL_HI, E, Ctx); - case AsmToken::PercentDtprel_Lo: - return MipsMCExpr::create(MipsMCExpr::MEK_DTPREL_LO, E, Ctx); - case AsmToken::PercentGot: - return MipsMCExpr::create(MipsMCExpr::MEK_GOT, E, Ctx); - case AsmToken::PercentGot_Disp: - return MipsMCExpr::create(MipsMCExpr::MEK_GOT_DISP, E, Ctx); - case AsmToken::PercentGot_Hi: - return MipsMCExpr::create(MipsMCExpr::MEK_GOT_HI16, E, Ctx); - case AsmToken::PercentGot_Lo: - return MipsMCExpr::create(MipsMCExpr::MEK_GOT_LO16, E, Ctx); - case AsmToken::PercentGot_Ofst: - return MipsMCExpr::create(MipsMCExpr::MEK_GOT_OFST, E, Ctx); - case AsmToken::PercentGot_Page: - return MipsMCExpr::create(MipsMCExpr::MEK_GOT_PAGE, E, Ctx); - case AsmToken::PercentGottprel: - return MipsMCExpr::create(MipsMCExpr::MEK_GOTTPREL, E, Ctx); - case AsmToken::PercentGp_Rel: - return MipsMCExpr::create(MipsMCExpr::MEK_GPREL, E, Ctx); - case AsmToken::PercentHi: - return MipsMCExpr::create(MipsMCExpr::MEK_HI, E, Ctx); - case AsmToken::PercentHigher: - return MipsMCExpr::create(MipsMCExpr::MEK_HIGHER, E, Ctx); - case AsmToken::PercentHighest: - return MipsMCExpr::create(MipsMCExpr::MEK_HIGHEST, E, Ctx); - case AsmToken::PercentLo: - return MipsMCExpr::create(MipsMCExpr::MEK_LO, E, Ctx); - case AsmToken::PercentNeg: - return MipsMCExpr::create(MipsMCExpr::MEK_NEG, E, Ctx); - case AsmToken::PercentPcrel_Hi: - return MipsMCExpr::create(MipsMCExpr::MEK_PCREL_HI16, E, Ctx); - case AsmToken::PercentPcrel_Lo: - return MipsMCExpr::create(MipsMCExpr::MEK_PCREL_LO16, E, Ctx); - case AsmToken::PercentTlsgd: - return MipsMCExpr::create(MipsMCExpr::MEK_TLSGD, E, Ctx); - case AsmToken::PercentTlsldm: - return MipsMCExpr::create(MipsMCExpr::MEK_TLSLDM, E, Ctx); - case AsmToken::PercentTprel_Hi: - return MipsMCExpr::create(MipsMCExpr::MEK_TPREL_HI, E, Ctx); - case AsmToken::PercentTprel_Lo: - return MipsMCExpr::create(MipsMCExpr::MEK_TPREL_LO, E, Ctx); - } - } - bool areEqualRegs(const MCParsedAsmOperand &Op1, const MCParsedAsmOperand &Op2) const override; }; @@ -915,7 +856,7 @@ private: public: /// Coerce the register to GPR32 and return the real register for the current /// target. - unsigned getGPR32Reg() const { + MCRegister getGPR32Reg() const { assert(isRegIdx() && (RegIdx.Kind & RegKind_GPR) && "Invalid access!"); AsmParser.warnIfRegIndexIsAT(RegIdx.Index, StartLoc); unsigned ClassID = Mips::GPR32RegClassID; @@ -924,7 +865,7 @@ public: /// Coerce the register to GPR32 and return the real register for the current /// target. - unsigned getGPRMM16Reg() const { + MCRegister getGPRMM16Reg() const { assert(isRegIdx() && (RegIdx.Kind & RegKind_GPR) && "Invalid access!"); unsigned ClassID = Mips::GPR32RegClassID; return RegIdx.RegInfo->getRegClass(ClassID).getRegister(RegIdx.Index); @@ -932,7 +873,7 @@ public: /// Coerce the register to GPR64 and return the real register for the current /// target. - unsigned getGPR64Reg() const { + MCRegister getGPR64Reg() const { assert(isRegIdx() && (RegIdx.Kind & RegKind_GPR) && "Invalid access!"); unsigned ClassID = Mips::GPR64RegClassID; return RegIdx.RegInfo->getRegClass(ClassID).getRegister(RegIdx.Index); @@ -941,7 +882,7 @@ public: private: /// Coerce the register to AFGR64 and return the real register for the current /// target. - unsigned getAFGR64Reg() const { + MCRegister getAFGR64Reg() const { assert(isRegIdx() && (RegIdx.Kind & RegKind_FGR) && "Invalid access!"); if (RegIdx.Index % 2 != 0) AsmParser.Warning(StartLoc, "Float register should be even."); @@ -951,7 +892,7 @@ private: /// Coerce the register to FGR64 and return the real register for the current /// target. - unsigned getFGR64Reg() const { + MCRegister getFGR64Reg() const { assert(isRegIdx() && (RegIdx.Kind & RegKind_FGR) && "Invalid access!"); return RegIdx.RegInfo->getRegClass(Mips::FGR64RegClassID) .getRegister(RegIdx.Index); @@ -959,7 +900,7 @@ private: /// Coerce the register to FGR32 and return the real register for the current /// target. - unsigned getFGR32Reg() const { + MCRegister getFGR32Reg() const { assert(isRegIdx() && (RegIdx.Kind & RegKind_FGR) && "Invalid access!"); return RegIdx.RegInfo->getRegClass(Mips::FGR32RegClassID) .getRegister(RegIdx.Index); @@ -967,7 +908,7 @@ private: /// Coerce the register to FCC and return the real register for the current /// target. - unsigned getFCCReg() const { + MCRegister getFCCReg() const { assert(isRegIdx() && (RegIdx.Kind & RegKind_FCC) && "Invalid access!"); return RegIdx.RegInfo->getRegClass(Mips::FCCRegClassID) .getRegister(RegIdx.Index); @@ -975,7 +916,7 @@ private: /// Coerce the register to MSA128 and return the real register for the current /// target. - unsigned getMSA128Reg() const { + MCRegister getMSA128Reg() const { assert(isRegIdx() && (RegIdx.Kind & RegKind_MSA128) && "Invalid access!"); // It doesn't matter which of the MSA128[BHWD] classes we use. They are all // identical @@ -985,7 +926,7 @@ private: /// Coerce the register to MSACtrl and return the real register for the /// current target. - unsigned getMSACtrlReg() const { + MCRegister getMSACtrlReg() const { assert(isRegIdx() && (RegIdx.Kind & RegKind_MSACtrl) && "Invalid access!"); unsigned ClassID = Mips::MSACtrlRegClassID; return RegIdx.RegInfo->getRegClass(ClassID).getRegister(RegIdx.Index); @@ -993,7 +934,7 @@ private: /// Coerce the register to COP0 and return the real register for the /// current target. - unsigned getCOP0Reg() const { + MCRegister getCOP0Reg() const { assert(isRegIdx() && (RegIdx.Kind & RegKind_COP0) && "Invalid access!"); unsigned ClassID = Mips::COP0RegClassID; return RegIdx.RegInfo->getRegClass(ClassID).getRegister(RegIdx.Index); @@ -1001,7 +942,7 @@ private: /// Coerce the register to COP2 and return the real register for the /// current target. - unsigned getCOP2Reg() const { + MCRegister getCOP2Reg() const { assert(isRegIdx() && (RegIdx.Kind & RegKind_COP2) && "Invalid access!"); unsigned ClassID = Mips::COP2RegClassID; return RegIdx.RegInfo->getRegClass(ClassID).getRegister(RegIdx.Index); @@ -1009,7 +950,7 @@ private: /// Coerce the register to COP3 and return the real register for the /// current target. - unsigned getCOP3Reg() const { + MCRegister getCOP3Reg() const { assert(isRegIdx() && (RegIdx.Kind & RegKind_COP3) && "Invalid access!"); unsigned ClassID = Mips::COP3RegClassID; return RegIdx.RegInfo->getRegClass(ClassID).getRegister(RegIdx.Index); @@ -1017,7 +958,7 @@ private: /// Coerce the register to ACC64DSP and return the real register for the /// current target. - unsigned getACC64DSPReg() const { + MCRegister getACC64DSPReg() const { assert(isRegIdx() && (RegIdx.Kind & RegKind_ACC) && "Invalid access!"); unsigned ClassID = Mips::ACC64DSPRegClassID; return RegIdx.RegInfo->getRegClass(ClassID).getRegister(RegIdx.Index); @@ -1025,7 +966,7 @@ private: /// Coerce the register to HI32DSP and return the real register for the /// current target. - unsigned getHI32DSPReg() const { + MCRegister getHI32DSPReg() const { assert(isRegIdx() && (RegIdx.Kind & RegKind_ACC) && "Invalid access!"); unsigned ClassID = Mips::HI32DSPRegClassID; return RegIdx.RegInfo->getRegClass(ClassID).getRegister(RegIdx.Index); @@ -1033,7 +974,7 @@ private: /// Coerce the register to LO32DSP and return the real register for the /// current target. - unsigned getLO32DSPReg() const { + MCRegister getLO32DSPReg() const { assert(isRegIdx() && (RegIdx.Kind & RegKind_ACC) && "Invalid access!"); unsigned ClassID = Mips::LO32DSPRegClassID; return RegIdx.RegInfo->getRegClass(ClassID).getRegister(RegIdx.Index); @@ -1041,7 +982,7 @@ private: /// Coerce the register to CCR and return the real register for the /// current target. - unsigned getCCRReg() const { + MCRegister getCCRReg() const { assert(isRegIdx() && (RegIdx.Kind & RegKind_CCR) && "Invalid access!"); unsigned ClassID = Mips::CCRRegClassID; return RegIdx.RegInfo->getRegClass(ClassID).getRegister(RegIdx.Index); @@ -1049,7 +990,7 @@ private: /// Coerce the register to HWRegs and return the real register for the /// current target. - unsigned getHWRegsReg() const { + MCRegister getHWRegsReg() const { assert(isRegIdx() && (RegIdx.Kind & RegKind_HWRegs) && "Invalid access!"); unsigned ClassID = Mips::HWRegsRegClassID; return RegIdx.RegInfo->getRegClass(ClassID).getRegister(RegIdx.Index); @@ -1311,11 +1252,23 @@ public: } template <unsigned Bits> bool isSImm() const { - return isConstantImm() ? isInt<Bits>(getConstantImm()) : isImm(); + if (!isImm()) + return false; + int64_t Res; + if (getImm()->evaluateAsAbsolute(Res)) + return isInt<Bits>(Res); + // Allow conservatively if not a parse-time constant. + return true; } template <unsigned Bits> bool isUImm() const { - return isConstantImm() ? isUInt<Bits>(getConstantImm()) : isImm(); + if (!isImm()) + return false; + int64_t Res; + if (getImm()->evaluateAsAbsolute(Res)) + return isUInt<Bits>(Res); + // Allow conservatively if not a parse-time constant. + return true; } template <unsigned Bits> bool isAnyImm() const { @@ -1352,12 +1305,12 @@ public: return false; if (!getMemBase()->isGPRAsmReg()) return false; - if (isa<MCTargetExpr>(getMemOff()) || + if (isa<MCSpecifierExpr>(getMemOff()) || (isConstantMemOff() && isShiftedInt<Bits, ShiftAmount>(getConstantMemOff()))) return true; MCValue Res; - bool IsReloc = getMemOff()->evaluateAsRelocatable(Res, nullptr, nullptr); + bool IsReloc = getMemOff()->evaluateAsRelocatable(Res, nullptr); return IsReloc && isShiftedInt<Bits, ShiftAmount>(Res.getConstant()); } @@ -1367,11 +1320,11 @@ public: if (!getMemBase()->isGPRAsmReg()) return false; const unsigned PtrBits = AsmParser.getABI().ArePtrs64bit() ? 64 : 32; - if (isa<MCTargetExpr>(getMemOff()) || + if (isa<MCSpecifierExpr>(getMemOff()) || (isConstantMemOff() && isIntN(PtrBits, getConstantMemOff()))) return true; MCValue Res; - bool IsReloc = getMemOff()->evaluateAsRelocatable(Res, nullptr, nullptr); + bool IsReloc = getMemOff()->evaluateAsRelocatable(Res, nullptr); return IsReloc && isIntN(PtrBits, Res.getConstant()); } @@ -1412,7 +1365,7 @@ public: if (Kind != k_Immediate) return false; MCValue Res; - bool Success = getImm()->evaluateAsRelocatable(Res, nullptr, nullptr); + bool Success = getImm()->evaluateAsRelocatable(Res, nullptr); return Success && isShiftedInt<Bits, ShiftLeftAmount>(Res.getConstant()); } @@ -1707,18 +1660,18 @@ public: /// getEndLoc - Get the location of the last token of this operand. SMLoc getEndLoc() const override { return EndLoc; } - void print(raw_ostream &OS) const override { + void print(raw_ostream &OS, const MCAsmInfo &MAI) const override { switch (Kind) { case k_Immediate: OS << "Imm<"; - OS << *Imm.Val; + MAI.printExpr(OS, *Imm.Val); OS << ">"; break; case k_Memory: OS << "Mem<"; - Mem.Base->print(OS); + Mem.Base->print(OS, MAI); OS << ", "; - OS << *Mem.Off; + MAI.printExpr(OS, *Mem.Off); OS << ">"; break; case k_RegisterIndex: @@ -1821,7 +1774,7 @@ static bool isEvaluated(const MCExpr *Expr) { case MCExpr::Constant: return true; case MCExpr::SymbolRef: - return (cast<MCSymbolRefExpr>(Expr)->getKind() != MCSymbolRefExpr::VK_None); + return (cast<MCSymbolRefExpr>(Expr)->getSpecifier()); case MCExpr::Binary: { const MCBinaryExpr *BE = cast<MCBinaryExpr>(Expr); if (!isEvaluated(BE->getLHS())) @@ -1830,8 +1783,10 @@ static bool isEvaluated(const MCExpr *Expr) { } case MCExpr::Unary: return isEvaluated(cast<MCUnaryExpr>(Expr)->getSubExpr()); - case MCExpr::Target: + case MCExpr::Specifier: return true; + case MCExpr::Target: + llvm_unreachable("unused by this backend"); } return false; } @@ -1862,7 +1817,7 @@ static bool needsExpandMemInst(MCInst &Inst, const MCInstrDesc &MCID) { // Expand symbol. const MCSymbolRefExpr *SR = static_cast<const MCSymbolRefExpr *>(Expr); - return SR->getKind() == MCSymbolRefExpr::VK_None; + return SR->getSpecifier() == 0; } return false; @@ -2123,7 +2078,7 @@ bool MipsAsmParser::processInstruction(MCInst &Inst, SMLoc IDLoc, // of the assembler. We ought to leave it to those later stages. const MCSymbol *JalSym = getSingleMCSymbol(JalExpr); - if (expandLoadAddress(Mips::T9, Mips::NoRegister, Inst.getOperand(0), + if (expandLoadAddress(Mips::T9, MCRegister(), Inst.getOperand(0), !isGP64bit(), IDLoc, Out, STI)) return true; @@ -2142,8 +2097,7 @@ bool MipsAsmParser::processInstruction(MCInst &Inst, SMLoc IDLoc, MCSymbol *TmpLabel = getContext().createTempSymbol(); const MCExpr *TmpExpr = MCSymbolRefExpr::create(TmpLabel, getContext()); const MCExpr *RelocJalrExpr = - MCSymbolRefExpr::create(JalSym, MCSymbolRefExpr::VK_None, - getContext(), IDLoc); + MCSymbolRefExpr::create(JalSym, getContext(), IDLoc); TOut.getStreamer().emitRelocDirective( *TmpExpr, inMicroMipsMode() ? "R_MICROMIPS_JALR" : "R_MIPS_JALR", @@ -2303,8 +2257,8 @@ bool MipsAsmParser::processInstruction(MCInst &Inst, SMLoc IDLoc, break; case Mips::MOVEP_MM: case Mips::MOVEP_MMR6: { - unsigned R0 = Inst.getOperand(0).getReg(); - unsigned R1 = Inst.getOperand(1).getReg(); + MCRegister R0 = Inst.getOperand(0).getReg(); + MCRegister R1 = Inst.getOperand(1).getReg(); bool RegPair = ((R0 == Mips::A1 && R1 == Mips::A2) || (R0 == Mips::A1 && R1 == Mips::A3) || (R0 == Mips::A2 && R1 == Mips::A3) || @@ -2451,10 +2405,9 @@ MipsAsmParser::tryExpandInstruction(MCInst &Inst, SMLoc IDLoc, MCStreamer &Out, assert((Inst.getOperand(1).isImm() || Inst.getOperand(1).isExpr()) && "expected immediate operand kind"); - return expandLoadAddress(Inst.getOperand(0).getReg(), Mips::NoRegister, - Inst.getOperand(1), - Inst.getOpcode() == Mips::LoadAddrImm32, IDLoc, - Out, STI) + return expandLoadAddress( + Inst.getOperand(0).getReg(), MCRegister(), Inst.getOperand(1), + Inst.getOpcode() == Mips::LoadAddrImm32, IDLoc, Out, STI) ? MER_Fail : MER_Success; case Mips::LoadAddrReg32: @@ -2753,14 +2706,14 @@ template <unsigned N> static bool isShiftedUIntAtAnyPosition(uint64_t x) { /// /// @param ImmValue The immediate to load. /// @param DstReg The register that will hold the immediate. -/// @param SrcReg A register to add to the immediate or Mips::NoRegister +/// @param SrcReg A register to add to the immediate or MCRegister() /// for a simple initialization. /// @param Is32BitImm Is ImmValue 32-bit or 64-bit? /// @param IsAddress True if the immediate represents an address. False if it /// is an integer. /// @param IDLoc Location of the immediate in the source file. -bool MipsAsmParser::loadImmediate(int64_t ImmValue, unsigned DstReg, - unsigned SrcReg, bool Is32BitImm, +bool MipsAsmParser::loadImmediate(int64_t ImmValue, MCRegister DstReg, + MCRegister SrcReg, bool Is32BitImm, bool IsAddress, SMLoc IDLoc, MCStreamer &Out, const MCSubtargetInfo *STI) { MipsTargetStreamer &TOut = getTargetStreamer(); @@ -2782,19 +2735,19 @@ bool MipsAsmParser::loadImmediate(int64_t ImmValue, unsigned DstReg, } } - unsigned ZeroReg = IsAddress ? ABI.GetNullPtr() : ABI.GetZeroReg(); + MCRegister ZeroReg = IsAddress ? ABI.GetNullPtr() : ABI.GetZeroReg(); unsigned AdduOp = !Is32BitImm ? Mips::DADDu : Mips::ADDu; bool UseSrcReg = false; - if (SrcReg != Mips::NoRegister) + if (SrcReg) UseSrcReg = true; - unsigned TmpReg = DstReg; + MCRegister TmpReg = DstReg; if (UseSrcReg && getContext().getRegisterInfo()->isSuperOrSubRegisterEq(DstReg, SrcReg)) { // At this point we need AT to perform the expansions and we exit if it is // not available. - unsigned ATReg = getATReg(IDLoc); + MCRegister ATReg = getATReg(IDLoc); if (!ATReg) return true; TmpReg = ATReg; @@ -2817,7 +2770,7 @@ bool MipsAsmParser::loadImmediate(int64_t ImmValue, unsigned DstReg, } if (isUInt<16>(ImmValue)) { - unsigned TmpReg = DstReg; + MCRegister TmpReg = DstReg; if (SrcReg == DstReg) { TmpReg = getATReg(IDLoc); if (!TmpReg) @@ -2896,8 +2849,8 @@ bool MipsAsmParser::loadImmediate(int64_t ImmValue, unsigned DstReg, // The highest 32-bit's are equivalent to a 32-bit immediate load. // Load bits 32-63 of ImmValue into bits 0-31 of the temporary register. - if (loadImmediate(ImmValue >> 32, TmpReg, Mips::NoRegister, true, false, - IDLoc, Out, STI)) + if (loadImmediate(ImmValue >> 32, TmpReg, MCRegister(), true, false, IDLoc, + Out, STI)) return false; // Shift and accumulate into the register. If a 16-bit chunk is zero, then @@ -2933,14 +2886,14 @@ bool MipsAsmParser::expandLoadImm(MCInst &Inst, bool Is32BitImm, SMLoc IDLoc, const MCOperand &DstRegOp = Inst.getOperand(0); assert(DstRegOp.isReg() && "expected register operand kind"); - if (loadImmediate(ImmOp.getImm(), DstRegOp.getReg(), Mips::NoRegister, - Is32BitImm, false, IDLoc, Out, STI)) + if (loadImmediate(ImmOp.getImm(), DstRegOp.getReg(), MCRegister(), Is32BitImm, + false, IDLoc, Out, STI)) return true; return false; } -bool MipsAsmParser::expandLoadAddress(unsigned DstReg, unsigned BaseReg, +bool MipsAsmParser::expandLoadAddress(MCRegister DstReg, MCRegister BaseReg, const MCOperand &Offset, bool Is32BitAddress, SMLoc IDLoc, MCStreamer &Out, @@ -2972,37 +2925,35 @@ bool MipsAsmParser::expandLoadAddress(unsigned DstReg, unsigned BaseReg, } bool MipsAsmParser::loadAndAddSymbolAddress(const MCExpr *SymExpr, - unsigned DstReg, unsigned SrcReg, - bool Is32BitSym, SMLoc IDLoc, - MCStreamer &Out, + MCRegister DstReg, + MCRegister SrcReg, bool Is32BitSym, + SMLoc IDLoc, MCStreamer &Out, const MCSubtargetInfo *STI) { MipsTargetStreamer &TOut = getTargetStreamer(); - bool UseSrcReg = SrcReg != Mips::NoRegister && SrcReg != Mips::ZERO && - SrcReg != Mips::ZERO_64; + bool UseSrcReg = + SrcReg.isValid() && SrcReg != Mips::ZERO && SrcReg != Mips::ZERO_64; warnIfNoMacro(IDLoc); if (inPicMode()) { MCValue Res; - if (!SymExpr->evaluateAsRelocatable(Res, nullptr, nullptr)) { + if (!SymExpr->evaluateAsRelocatable(Res, nullptr)) { Error(IDLoc, "expected relocatable expression"); return true; } - if (Res.getSymB() != nullptr) { + if (Res.getSubSym()) { Error(IDLoc, "expected relocatable expression with only one symbol"); return true; } bool IsPtr64 = ABI.ArePtrs64bit(); bool IsLocalSym = - Res.getSymA()->getSymbol().isInSection() || - Res.getSymA()->getSymbol().isTemporary() || - (Res.getSymA()->getSymbol().isELF() && - cast<MCSymbolELF>(Res.getSymA()->getSymbol()).getBinding() == - ELF::STB_LOCAL); + Res.getAddSym()->isInSection() || Res.getAddSym()->isTemporary() || + (Res.getAddSym()->isELF() && + cast<MCSymbolELF>(Res.getAddSym())->getBinding() == ELF::STB_LOCAL); // For O32, "$"-prefixed symbols are recognized as temporary while // .L-prefixed symbols are not (PrivateGlobalPrefix is "$"). Recognize ".L" // manually. - if (ABI.IsO32() && Res.getSymA()->getSymbol().getName().starts_with(".L")) + if (ABI.IsO32() && Res.getAddSym()->getName().starts_with(".L")) IsLocalSym = true; bool UseXGOT = STI->hasFeature(Mips::FeatureXGOT) && !IsLocalSym; @@ -3013,10 +2964,10 @@ bool MipsAsmParser::loadAndAddSymbolAddress(const MCExpr *SymExpr, if ((DstReg == Mips::T9 || DstReg == Mips::T9_64) && !UseSrcReg && Res.getConstant() == 0 && !IsLocalSym) { if (UseXGOT) { - const MCExpr *CallHiExpr = MipsMCExpr::create(MipsMCExpr::MEK_CALL_HI16, - SymExpr, getContext()); - const MCExpr *CallLoExpr = MipsMCExpr::create(MipsMCExpr::MEK_CALL_LO16, - SymExpr, getContext()); + const MCExpr *CallHiExpr = + MCSpecifierExpr::create(SymExpr, Mips::S_CALL_HI16, getContext()); + const MCExpr *CallLoExpr = + MCSpecifierExpr::create(SymExpr, Mips::S_CALL_LO16, getContext()); TOut.emitRX(Mips::LUi, DstReg, MCOperand::createExpr(CallHiExpr), IDLoc, STI); TOut.emitRRR(IsPtr64 ? Mips::DADDu : Mips::ADDu, DstReg, DstReg, GPReg, @@ -3025,20 +2976,20 @@ bool MipsAsmParser::loadAndAddSymbolAddress(const MCExpr *SymExpr, MCOperand::createExpr(CallLoExpr), IDLoc, STI); } else { const MCExpr *CallExpr = - MipsMCExpr::create(MipsMCExpr::MEK_GOT_CALL, SymExpr, getContext()); + MCSpecifierExpr::create(SymExpr, Mips::S_GOT_CALL, getContext()); TOut.emitRRX(IsPtr64 ? Mips::LD : Mips::LW, DstReg, GPReg, MCOperand::createExpr(CallExpr), IDLoc, STI); } return false; } - unsigned TmpReg = DstReg; + MCRegister 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); + MCRegister ATReg = getATReg(IDLoc); if (!ATReg) return true; TmpReg = ATReg; @@ -3058,9 +3009,9 @@ bool MipsAsmParser::loadAndAddSymbolAddress(const MCExpr *SymExpr, // 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()); + MCSpecifierExpr::create(SymExpr, Mips::S_GOT_HI16, getContext()); + const MCExpr *CallLoExpr = MCSpecifierExpr::create( + Res.getAddSym(), Mips::S_GOT_LO16, getContext()); TOut.emitRX(Mips::LUi, TmpReg, MCOperand::createExpr(CallHiExpr), IDLoc, STI); @@ -3081,7 +3032,7 @@ bool MipsAsmParser::loadAndAddSymbolAddress(const MCExpr *SymExpr, return false; } - const MipsMCExpr *GotExpr = nullptr; + const MCSpecifierExpr *GotExpr = nullptr; const MCExpr *LoExpr = nullptr; if (ABI.IsN32() || ABI.IsN64()) { // The remaining cases are: @@ -3091,8 +3042,8 @@ bool MipsAsmParser::loadAndAddSymbolAddress(const MCExpr *SymExpr, // The daddiu'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. - GotExpr = MipsMCExpr::create(MipsMCExpr::MEK_GOT_DISP, Res.getSymA(), - getContext()); + GotExpr = MCSpecifierExpr::create(Res.getAddSym(), Mips::S_GOT_DISP, + getContext()); if (Res.getConstant() != 0) { // Symbols fully resolve with just the %got_disp(symbol) but we // must still account for any offset to the symbol for @@ -3119,15 +3070,14 @@ bool MipsAsmParser::loadAndAddSymbolAddress(const MCExpr *SymExpr, // this happens then the last instruction must use $rd as the result // register. if (IsLocalSym) { - GotExpr = - MipsMCExpr::create(MipsMCExpr::MEK_GOT, SymExpr, getContext()); - LoExpr = MipsMCExpr::create(MipsMCExpr::MEK_LO, SymExpr, getContext()); + GotExpr = MCSpecifierExpr::create(SymExpr, Mips::S_GOT, getContext()); + LoExpr = MCSpecifierExpr::create(SymExpr, Mips::S_LO, getContext()); } else { // External symbols fully resolve the symbol with just the %got(symbol) // but we must still account for any offset to the symbol for // expressions like symbol+8. - GotExpr = MipsMCExpr::create(MipsMCExpr::MEK_GOT, Res.getSymA(), - getContext()); + GotExpr = + MCSpecifierExpr::create(Res.getAddSym(), Mips::S_GOT, getContext()); if (Res.getConstant() != 0) LoExpr = MCConstantExpr::create(Res.getConstant(), getContext()); } @@ -3147,10 +3097,10 @@ bool MipsAsmParser::loadAndAddSymbolAddress(const MCExpr *SymExpr, return false; } - const MipsMCExpr *HiExpr = - MipsMCExpr::create(MipsMCExpr::MEK_HI, SymExpr, getContext()); - const MipsMCExpr *LoExpr = - MipsMCExpr::create(MipsMCExpr::MEK_LO, SymExpr, getContext()); + const auto *HiExpr = + MCSpecifierExpr::create(SymExpr, Mips::S_HI, getContext()); + const auto *LoExpr = + MCSpecifierExpr::create(SymExpr, Mips::S_LO, getContext()); // This is the 64-bit symbol address expansion. if (ABI.ArePtrs64bit() && isGP64bit()) { @@ -3161,17 +3111,17 @@ bool MipsAsmParser::loadAndAddSymbolAddress(const MCExpr *SymExpr, // If it is not available we exit if the destination is the same as the // source register. - const MipsMCExpr *HighestExpr = - MipsMCExpr::create(MipsMCExpr::MEK_HIGHEST, SymExpr, getContext()); - const MipsMCExpr *HigherExpr = - MipsMCExpr::create(MipsMCExpr::MEK_HIGHER, SymExpr, getContext()); + const auto *HighestExpr = + MCSpecifierExpr::create(SymExpr, Mips::S_HIGHEST, getContext()); + const auto *HigherExpr = + MCSpecifierExpr::create(SymExpr, Mips::S_HIGHER, getContext()); bool RdRegIsRsReg = UseSrcReg && getContext().getRegisterInfo()->isSuperOrSubRegisterEq(DstReg, SrcReg); if (canUseATReg() && UseSrcReg && RdRegIsRsReg) { - unsigned ATReg = getATReg(IDLoc); + MCRegister ATReg = getATReg(IDLoc); // If $rs is the same as $rd: // (d)la $rd, sym($rd) => lui $at, %highest(sym) @@ -3195,7 +3145,7 @@ bool MipsAsmParser::loadAndAddSymbolAddress(const MCExpr *SymExpr, return false; } else if (canUseATReg() && !RdRegIsRsReg && DstReg != getATReg(IDLoc)) { - unsigned ATReg = getATReg(IDLoc); + MCRegister ATReg = getATReg(IDLoc); // If the $rs is different from $rd or if $rs isn't specified and we // have $at available: @@ -3265,12 +3215,12 @@ bool MipsAsmParser::loadAndAddSymbolAddress(const MCExpr *SymExpr, // (d)la $rd, sym/sym($rs) => lui $rd, %hi(sym) // ori $rd, $rd, %lo(sym) // (addu $rd, $rd, $rs) - unsigned TmpReg = DstReg; + MCRegister 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); + MCRegister ATReg = getATReg(IDLoc); if (!ATReg) return true; TmpReg = ATReg; @@ -3292,10 +3242,10 @@ bool MipsAsmParser::loadAndAddSymbolAddress(const MCExpr *SymExpr, // Each double-precision register DO-D15 overlaps with two of the single // precision registers F0-F31. As an example, all of the following hold true: // D0 + 1 == F1, F1 + 1 == D1, F1 + 1 == F2, depending on the context. -static unsigned nextReg(unsigned Reg) { +static MCRegister nextReg(MCRegister Reg) { if (MipsMCRegisterClasses[Mips::FGR32RegClassID].contains(Reg)) return Reg == (unsigned)Mips::F31 ? (unsigned)Mips::F0 : Reg + 1; - switch (Reg) { + switch (Reg.id()) { default: llvm_unreachable("Unknown register in assembly macro expansion!"); case Mips::ZERO: return Mips::AT; case Mips::AT: return Mips::V0; @@ -3356,15 +3306,14 @@ static unsigned nextReg(unsigned Reg) { // address to load a 64 bit value. bool MipsAsmParser::emitPartialAddress(MipsTargetStreamer &TOut, SMLoc IDLoc, MCSymbol *Sym) { - unsigned ATReg = getATReg(IDLoc); + MCRegister ATReg = getATReg(IDLoc); if (!ATReg) return true; if(IsPicEnabled) { - const MCExpr *GotSym = - MCSymbolRefExpr::create(Sym, MCSymbolRefExpr::VK_None, getContext()); - const MipsMCExpr *GotExpr = - MipsMCExpr::create(MipsMCExpr::MEK_GOT, GotSym, getContext()); + const MCExpr *GotSym = MCSymbolRefExpr::create(Sym, getContext()); + const auto *GotExpr = + MCSpecifierExpr::create(GotSym, Mips::S_GOT, getContext()); if(isABI_O32() || isABI_N32()) { TOut.emitRRX(Mips::LW, ATReg, GPReg, MCOperand::createExpr(GotExpr), @@ -3374,10 +3323,9 @@ bool MipsAsmParser::emitPartialAddress(MipsTargetStreamer &TOut, SMLoc IDLoc, IDLoc, STI); } } else { //!IsPicEnabled - const MCExpr *HiSym = - MCSymbolRefExpr::create(Sym, MCSymbolRefExpr::VK_None, getContext()); - const MipsMCExpr *HiExpr = - MipsMCExpr::create(MipsMCExpr::MEK_HI, HiSym, getContext()); + const MCExpr *HiSym = MCSymbolRefExpr::create(Sym, getContext()); + const auto *HiExpr = + MCSpecifierExpr::create(HiSym, Mips::S_HI, getContext()); // FIXME: This is technically correct but gives a different result to gas, // but gas is incomplete there (it has a fixme noting it doesn't work with @@ -3388,14 +3336,12 @@ bool MipsAsmParser::emitPartialAddress(MipsTargetStreamer &TOut, SMLoc IDLoc, if(isABI_O32() || isABI_N32()) { TOut.emitRX(Mips::LUi, ATReg, MCOperand::createExpr(HiExpr), IDLoc, STI); } else { //isABI_N64() - const MCExpr *HighestSym = - MCSymbolRefExpr::create(Sym, MCSymbolRefExpr::VK_None, getContext()); - const MipsMCExpr *HighestExpr = - MipsMCExpr::create(MipsMCExpr::MEK_HIGHEST, HighestSym, getContext()); - const MCExpr *HigherSym = - MCSymbolRefExpr::create(Sym, MCSymbolRefExpr::VK_None, getContext()); - const MipsMCExpr *HigherExpr = - MipsMCExpr::create(MipsMCExpr::MEK_HIGHER, HigherSym, getContext()); + const MCExpr *HighestSym = MCSymbolRefExpr::create(Sym, getContext()); + const auto *HighestExpr = + MCSpecifierExpr::create(HighestSym, Mips::S_HIGHEST, getContext()); + const MCExpr *HigherSym = MCSymbolRefExpr::create(Sym, getContext()); + const auto *HigherExpr = + MCSpecifierExpr::create(HigherSym, Mips::S_HIGHER, getContext()); TOut.emitRX(Mips::LUi, ATReg, MCOperand::createExpr(HighestExpr), IDLoc, STI); @@ -3435,13 +3381,13 @@ bool MipsAsmParser::expandLoadSingleImmToGPR(MCInst &Inst, SMLoc IDLoc, assert(Inst.getOperand(0).isReg() && Inst.getOperand(1).isImm() && "Invalid instruction operand."); - unsigned FirstReg = Inst.getOperand(0).getReg(); + MCRegister FirstReg = Inst.getOperand(0).getReg(); uint64_t ImmOp64 = Inst.getOperand(1).getImm(); uint32_t ImmOp32 = covertDoubleImmToSingleImm(convertIntToDoubleImm(ImmOp64)); - return loadImmediate(ImmOp32, FirstReg, Mips::NoRegister, true, false, IDLoc, - Out, STI); + return loadImmediate(ImmOp32, FirstReg, MCRegister(), true, false, IDLoc, Out, + STI); } bool MipsAsmParser::expandLoadSingleImmToFPR(MCInst &Inst, SMLoc IDLoc, @@ -3452,14 +3398,14 @@ bool MipsAsmParser::expandLoadSingleImmToFPR(MCInst &Inst, SMLoc IDLoc, assert(Inst.getOperand(0).isReg() && Inst.getOperand(1).isImm() && "Invalid instruction operand."); - unsigned FirstReg = Inst.getOperand(0).getReg(); + MCRegister FirstReg = Inst.getOperand(0).getReg(); uint64_t ImmOp64 = Inst.getOperand(1).getImm(); ImmOp64 = convertIntToDoubleImm(ImmOp64); uint32_t ImmOp32 = covertDoubleImmToSingleImm(ImmOp64); - unsigned TmpReg = Mips::ZERO; + MCRegister TmpReg = Mips::ZERO; if (ImmOp32 != 0) { TmpReg = getATReg(IDLoc); if (!TmpReg) @@ -3467,7 +3413,7 @@ bool MipsAsmParser::expandLoadSingleImmToFPR(MCInst &Inst, SMLoc IDLoc, } if (Lo_32(ImmOp64) == 0) { - if (TmpReg != Mips::ZERO && loadImmediate(ImmOp32, TmpReg, Mips::NoRegister, + if (TmpReg != Mips::ZERO && loadImmediate(ImmOp32, TmpReg, MCRegister(), true, false, IDLoc, Out, STI)) return true; TOut.emitRR(Mips::MTC1, FirstReg, TmpReg, IDLoc, STI); @@ -3481,10 +3427,8 @@ bool MipsAsmParser::expandLoadSingleImmToFPR(MCInst &Inst, SMLoc IDLoc, getContext().getELFSection(".rodata", ELF::SHT_PROGBITS, ELF::SHF_ALLOC); MCSymbol *Sym = getContext().createTempSymbol(); - const MCExpr *LoSym = - MCSymbolRefExpr::create(Sym, MCSymbolRefExpr::VK_None, getContext()); - const MipsMCExpr *LoExpr = - MipsMCExpr::create(MipsMCExpr::MEK_LO, LoSym, getContext()); + const MCExpr *LoSym = MCSymbolRefExpr::create(Sym, getContext()); + const auto *LoExpr = MCSpecifierExpr::create(LoSym, Mips::S_LO, getContext()); getStreamer().switchSection(ReadOnlySection); getStreamer().emitLabel(Sym, IDLoc); @@ -3506,23 +3450,23 @@ bool MipsAsmParser::expandLoadDoubleImmToGPR(MCInst &Inst, SMLoc IDLoc, assert(Inst.getOperand(0).isReg() && Inst.getOperand(1).isImm() && "Invalid instruction operand."); - unsigned FirstReg = Inst.getOperand(0).getReg(); + MCRegister FirstReg = Inst.getOperand(0).getReg(); uint64_t ImmOp64 = Inst.getOperand(1).getImm(); ImmOp64 = convertIntToDoubleImm(ImmOp64); if (Lo_32(ImmOp64) == 0) { if (isGP64bit()) { - if (loadImmediate(ImmOp64, FirstReg, Mips::NoRegister, false, false, - IDLoc, Out, STI)) + if (loadImmediate(ImmOp64, FirstReg, MCRegister(), false, false, IDLoc, + Out, STI)) return true; } else { - if (loadImmediate(Hi_32(ImmOp64), FirstReg, Mips::NoRegister, true, false, + if (loadImmediate(Hi_32(ImmOp64), FirstReg, MCRegister(), true, false, IDLoc, Out, STI)) return true; - if (loadImmediate(0, nextReg(FirstReg), Mips::NoRegister, true, false, - IDLoc, Out, STI)) + if (loadImmediate(0, nextReg(FirstReg), MCRegister(), true, false, IDLoc, + Out, STI)) return true; } return false; @@ -3533,10 +3477,8 @@ bool MipsAsmParser::expandLoadDoubleImmToGPR(MCInst &Inst, SMLoc IDLoc, getContext().getELFSection(".rodata", ELF::SHT_PROGBITS, ELF::SHF_ALLOC); MCSymbol *Sym = getContext().createTempSymbol(); - const MCExpr *LoSym = - MCSymbolRefExpr::create(Sym, MCSymbolRefExpr::VK_None, getContext()); - const MipsMCExpr *LoExpr = - MipsMCExpr::create(MipsMCExpr::MEK_LO, LoSym, getContext()); + const MCExpr *LoSym = MCSymbolRefExpr::create(Sym, getContext()); + const auto *LoExpr = MCSpecifierExpr::create(LoSym, Mips::S_LO, getContext()); getStreamer().switchSection(ReadOnlySection); getStreamer().emitLabel(Sym, IDLoc); @@ -3544,7 +3486,7 @@ bool MipsAsmParser::expandLoadDoubleImmToGPR(MCInst &Inst, SMLoc IDLoc, getStreamer().emitIntValue(ImmOp64, 8); getStreamer().switchSection(CS); - unsigned TmpReg = getATReg(IDLoc); + MCRegister TmpReg = getATReg(IDLoc); if (!TmpReg) return true; @@ -3571,12 +3513,12 @@ bool MipsAsmParser::expandLoadDoubleImmToFPR(MCInst &Inst, bool Is64FPU, assert(Inst.getOperand(0).isReg() && Inst.getOperand(1).isImm() && "Invalid instruction operand."); - unsigned FirstReg = Inst.getOperand(0).getReg(); + MCRegister FirstReg = Inst.getOperand(0).getReg(); uint64_t ImmOp64 = Inst.getOperand(1).getImm(); ImmOp64 = convertIntToDoubleImm(ImmOp64); - unsigned TmpReg = Mips::ZERO; + MCRegister TmpReg = Mips::ZERO; if (ImmOp64 != 0) { TmpReg = getATReg(IDLoc); if (!TmpReg) @@ -3586,17 +3528,16 @@ bool MipsAsmParser::expandLoadDoubleImmToFPR(MCInst &Inst, bool Is64FPU, if ((Lo_32(ImmOp64) == 0) && !((Hi_32(ImmOp64) & 0xffff0000) && (Hi_32(ImmOp64) & 0x0000ffff))) { if (isGP64bit()) { - if (TmpReg != Mips::ZERO && - loadImmediate(ImmOp64, TmpReg, Mips::NoRegister, false, false, IDLoc, - Out, STI)) + if (TmpReg != Mips::ZERO && loadImmediate(ImmOp64, TmpReg, MCRegister(), + false, false, IDLoc, Out, STI)) return true; TOut.emitRR(Mips::DMTC1, FirstReg, TmpReg, IDLoc, STI); return false; } if (TmpReg != Mips::ZERO && - loadImmediate(Hi_32(ImmOp64), TmpReg, Mips::NoRegister, true, false, - IDLoc, Out, STI)) + loadImmediate(Hi_32(ImmOp64), TmpReg, MCRegister(), true, false, IDLoc, + Out, STI)) return true; if (hasMips32r2()) { @@ -3616,10 +3557,8 @@ bool MipsAsmParser::expandLoadDoubleImmToFPR(MCInst &Inst, bool Is64FPU, getContext().getELFSection(".rodata", ELF::SHT_PROGBITS, ELF::SHF_ALLOC); MCSymbol *Sym = getContext().createTempSymbol(); - const MCExpr *LoSym = - MCSymbolRefExpr::create(Sym, MCSymbolRefExpr::VK_None, getContext()); - const MipsMCExpr *LoExpr = - MipsMCExpr::create(MipsMCExpr::MEK_LO, LoSym, getContext()); + const MCExpr *LoSym = MCSymbolRefExpr::create(Sym, getContext()); + const auto *LoExpr = MCSpecifierExpr::create(LoSym, Mips::S_LO, getContext()); getStreamer().switchSection(ReadOnlySection); getStreamer().emitLabel(Sym, IDLoc); @@ -3729,12 +3668,12 @@ bool MipsAsmParser::expandBranchImm(MCInst &Inst, SMLoc IDLoc, MCStreamer &Out, } else { warnIfNoMacro(IDLoc); - unsigned ATReg = getATReg(IDLoc); + MCRegister ATReg = getATReg(IDLoc); if (!ATReg) return true; - if (loadImmediate(ImmValue, ATReg, Mips::NoRegister, !isGP64bit(), true, - IDLoc, Out, STI)) + if (loadImmediate(ImmValue, ATReg, MCRegister(), !isGP64bit(), true, IDLoc, + Out, STI)) return true; if (IsLikely) { @@ -3761,9 +3700,9 @@ void MipsAsmParser::expandMem16Inst(MCInst &Inst, SMLoc IDLoc, MCStreamer &Out, MipsTargetStreamer &TOut = getTargetStreamer(); unsigned OpCode = Inst.getOpcode(); - unsigned DstReg = DstRegOp.getReg(); - unsigned BaseReg = BaseRegOp.getReg(); - unsigned TmpReg = DstReg; + MCRegister DstReg = DstRegOp.getReg(); + MCRegister BaseReg = BaseRegOp.getReg(); + MCRegister TmpReg = DstReg; const MCInstrDesc &Desc = MII.get(OpCode); int16_t DstRegClass = Desc.operands()[StartOp].RegClass; @@ -3800,8 +3739,8 @@ void MipsAsmParser::expandMem16Inst(MCInst &Inst, SMLoc IDLoc, MCStreamer &Out, if (IsLargeOffset) { bool Is32BitImm = isInt<32>(OffsetOp.getImm()); - if (loadImmediate(HiOffset, TmpReg, Mips::NoRegister, Is32BitImm, true, - IDLoc, Out, STI)) + if (loadImmediate(HiOffset, TmpReg, MCRegister(), Is32BitImm, true, IDLoc, + Out, STI)) return; } @@ -3821,17 +3760,18 @@ void MipsAsmParser::expandMem16Inst(MCInst &Inst, SMLoc IDLoc, MCStreamer &Out, // of R_MIPS_GOT_DISP in appropriate cases to reduce number // of GOT entries. MCValue Res; - if (!OffsetOp.getExpr()->evaluateAsRelocatable(Res, nullptr, nullptr)) { + if (!OffsetOp.getExpr()->evaluateAsRelocatable(Res, nullptr)) { Error(IDLoc, "expected relocatable expression"); return; } - if (Res.getSymB() != nullptr) { + if (Res.getSubSym()) { Error(IDLoc, "expected relocatable expression with only one symbol"); return; } - loadAndAddSymbolAddress(Res.getSymA(), TmpReg, BaseReg, - !ABI.ArePtrs64bit(), IDLoc, Out, STI); + loadAndAddSymbolAddress( + MCSymbolRefExpr::create(Res.getAddSym(), getContext()), TmpReg, + BaseReg, !ABI.ArePtrs64bit(), IDLoc, Out, STI); emitInstWithOffset(MCOperand::createImm(int16_t(Res.getConstant()))); } else { // FIXME: Implement 64-bit case. @@ -3841,15 +3781,15 @@ void MipsAsmParser::expandMem16Inst(MCInst &Inst, SMLoc IDLoc, MCStreamer &Out, // sw $8, %lo(sym)($at) const MCExpr *OffExpr = OffsetOp.getExpr(); MCOperand LoOperand = MCOperand::createExpr( - MipsMCExpr::create(MipsMCExpr::MEK_LO, OffExpr, getContext())); + MCSpecifierExpr::create(OffExpr, Mips::S_LO, getContext())); MCOperand HiOperand = MCOperand::createExpr( - MipsMCExpr::create(MipsMCExpr::MEK_HI, OffExpr, getContext())); + MCSpecifierExpr::create(OffExpr, Mips::S_HI, getContext())); if (ABI.IsN64()) { MCOperand HighestOperand = MCOperand::createExpr( - MipsMCExpr::create(MipsMCExpr::MEK_HIGHEST, OffExpr, getContext())); + MCSpecifierExpr::create(OffExpr, Mips::S_HIGHEST, getContext())); MCOperand HigherOperand = MCOperand::createExpr( - MipsMCExpr::create(MipsMCExpr::MEK_HIGHER, OffExpr, getContext())); + MCSpecifierExpr::create(OffExpr, Mips::S_HIGHER, getContext())); TOut.emitRX(Mips::LUi, TmpReg, HighestOperand, IDLoc, STI); TOut.emitRRX(Mips::DADDiu, TmpReg, TmpReg, HigherOperand, IDLoc, STI); @@ -3888,9 +3828,9 @@ void MipsAsmParser::expandMem9Inst(MCInst &Inst, SMLoc IDLoc, MCStreamer &Out, MipsTargetStreamer &TOut = getTargetStreamer(); unsigned OpCode = Inst.getOpcode(); - unsigned DstReg = DstRegOp.getReg(); - unsigned BaseReg = BaseRegOp.getReg(); - unsigned TmpReg = DstReg; + MCRegister DstReg = DstRegOp.getReg(); + MCRegister BaseReg = BaseRegOp.getReg(); + MCRegister TmpReg = DstReg; const MCInstrDesc &Desc = MII.get(OpCode); int16_t DstRegClass = Desc.operands()[StartOp].RegClass; @@ -3967,14 +3907,14 @@ bool MipsAsmParser::expandCondBranches(MCInst &Inst, SMLoc IDLoc, MipsTargetStreamer &TOut = getTargetStreamer(); bool EmittedNoMacroWarning = false; unsigned PseudoOpcode = Inst.getOpcode(); - unsigned SrcReg = Inst.getOperand(0).getReg(); + MCRegister SrcReg = Inst.getOperand(0).getReg(); const MCOperand &TrgOp = Inst.getOperand(1); const MCExpr *OffsetExpr = Inst.getOperand(2).getExpr(); unsigned ZeroSrcOpcode, ZeroTrgOpcode; bool ReverseOrderSLT, IsUnsigned, IsLikely, AcceptsEquality; - unsigned TrgReg; + MCRegister TrgReg; if (TrgOp.isReg()) TrgReg = TrgOp.getReg(); else if (TrgOp.isImm()) { @@ -4038,8 +3978,8 @@ bool MipsAsmParser::expandCondBranches(MCInst &Inst, SMLoc IDLoc, break; } - if (loadImmediate(TrgOp.getImm(), TrgReg, Mips::NoRegister, !isGP64bit(), - false, IDLoc, Out, STI)) + if (loadImmediate(TrgOp.getImm(), TrgReg, MCRegister(), !isGP64bit(), false, + IDLoc, Out, STI)) return true; } @@ -4191,7 +4131,7 @@ bool MipsAsmParser::expandCondBranches(MCInst &Inst, SMLoc IDLoc, // If neither the SrcReg nor the TrgReg are $0, we need AT to perform the // expansions. If it is not available, we return. - unsigned ATRegNum = getATReg(IDLoc); + MCRegister ATRegNum = getATReg(IDLoc); if (!ATRegNum) return true; @@ -4241,13 +4181,13 @@ bool MipsAsmParser::expandDivRem(MCInst &Inst, SMLoc IDLoc, MCStreamer &Out, const MCOperand &RdRegOp = Inst.getOperand(0); assert(RdRegOp.isReg() && "expected register operand kind"); - unsigned RdReg = RdRegOp.getReg(); + MCRegister RdReg = RdRegOp.getReg(); const MCOperand &RsRegOp = Inst.getOperand(1); assert(RsRegOp.isReg() && "expected register operand kind"); - unsigned RsReg = RsRegOp.getReg(); + MCRegister RsReg = RsRegOp.getReg(); - unsigned RtReg; + MCRegister RtReg; int64_t ImmValue; const MCOperand &RtOp = Inst.getOperand(2); @@ -4286,7 +4226,7 @@ bool MipsAsmParser::expandDivRem(MCInst &Inst, SMLoc IDLoc, MCStreamer &Out, Opcode == Mips::DURemMacro || Opcode == Mips::DURemIMacro; if (RtOp.isImm()) { - unsigned ATReg = getATReg(IDLoc); + MCRegister ATReg = getATReg(IDLoc); if (!ATReg) return true; @@ -4308,7 +4248,7 @@ bool MipsAsmParser::expandDivRem(MCInst &Inst, SMLoc IDLoc, MCStreamer &Out, TOut.emitRRR(SubOp, RdReg, ZeroReg, RsReg, IDLoc, STI); return false; } else { - if (loadImmediate(ImmValue, ATReg, Mips::NoRegister, isInt<32>(ImmValue), + if (loadImmediate(ImmValue, ATReg, MCRegister(), isInt<32>(ImmValue), false, Inst.getLoc(), Out, STI)) return true; TOut.emitRR(DivOp, RsReg, ATReg, IDLoc, STI); @@ -4339,7 +4279,7 @@ bool MipsAsmParser::expandDivRem(MCInst &Inst, SMLoc IDLoc, MCStreamer &Out, } // Temporary label for first branch traget - MCContext &Context = TOut.getStreamer().getContext(); + MCContext &Context = TOut.getContext(); MCSymbol *BrTarget; MCOperand LabelOp; @@ -4365,7 +4305,7 @@ bool MipsAsmParser::expandDivRem(MCInst &Inst, SMLoc IDLoc, MCStreamer &Out, return false; } - unsigned ATReg = getATReg(IDLoc); + MCRegister ATReg = getATReg(IDLoc); if (!ATReg) return true; @@ -4412,12 +4352,12 @@ bool MipsAsmParser::expandTrunc(MCInst &Inst, bool IsDouble, bool Is64FPU, assert(Inst.getOperand(0).isReg() && Inst.getOperand(1).isReg() && Inst.getOperand(2).isReg() && "Invalid instruction operand."); - unsigned FirstReg = Inst.getOperand(0).getReg(); - unsigned SecondReg = Inst.getOperand(1).getReg(); - unsigned ThirdReg = Inst.getOperand(2).getReg(); + MCRegister FirstReg = Inst.getOperand(0).getReg(); + MCRegister SecondReg = Inst.getOperand(1).getReg(); + MCRegister ThirdReg = Inst.getOperand(2).getReg(); if (hasMips1() && !hasMips2()) { - unsigned ATReg = getATReg(IDLoc); + MCRegister ATReg = getATReg(IDLoc); if (!ATReg) return true; TOut.emitRR(Mips::CFC1, ThirdReg, Mips::RA, IDLoc, STI); @@ -4456,14 +4396,14 @@ bool MipsAsmParser::expandUlh(MCInst &Inst, bool Signed, SMLoc IDLoc, assert(OffsetImmOp.isImm() && "expected immediate operand kind"); MipsTargetStreamer &TOut = getTargetStreamer(); - unsigned DstReg = DstRegOp.getReg(); - unsigned SrcReg = SrcRegOp.getReg(); + MCRegister DstReg = DstRegOp.getReg(); + MCRegister SrcReg = SrcRegOp.getReg(); int64_t OffsetValue = OffsetImmOp.getImm(); // NOTE: We always need AT for ULHU, as it is always used as the source // register for one of the LBu's. warnIfNoMacro(IDLoc); - unsigned ATReg = getATReg(IDLoc); + MCRegister ATReg = getATReg(IDLoc); if (!ATReg) return true; @@ -4479,11 +4419,11 @@ bool MipsAsmParser::expandUlh(MCInst &Inst, bool Signed, SMLoc IDLoc, if (isLittle()) std::swap(FirstOffset, SecondOffset); - unsigned FirstLbuDstReg = IsLargeOffset ? DstReg : ATReg; - unsigned SecondLbuDstReg = IsLargeOffset ? ATReg : DstReg; + MCRegister FirstLbuDstReg = IsLargeOffset ? DstReg : ATReg; + MCRegister SecondLbuDstReg = IsLargeOffset ? ATReg : DstReg; - unsigned LbuSrcReg = IsLargeOffset ? ATReg : SrcReg; - unsigned SllReg = IsLargeOffset ? DstReg : ATReg; + MCRegister LbuSrcReg = IsLargeOffset ? ATReg : SrcReg; + MCRegister SllReg = IsLargeOffset ? DstReg : ATReg; TOut.emitRRI(Signed ? Mips::LB : Mips::LBu, FirstLbuDstReg, LbuSrcReg, FirstOffset, IDLoc, STI); @@ -4508,12 +4448,12 @@ bool MipsAsmParser::expandUsh(MCInst &Inst, SMLoc IDLoc, MCStreamer &Out, assert(OffsetImmOp.isImm() && "expected immediate operand kind"); MipsTargetStreamer &TOut = getTargetStreamer(); - unsigned DstReg = DstRegOp.getReg(); - unsigned SrcReg = SrcRegOp.getReg(); + MCRegister DstReg = DstRegOp.getReg(); + MCRegister SrcReg = SrcRegOp.getReg(); int64_t OffsetValue = OffsetImmOp.getImm(); warnIfNoMacro(IDLoc); - unsigned ATReg = getATReg(IDLoc); + MCRegister ATReg = getATReg(IDLoc); if (!ATReg) return true; @@ -4559,8 +4499,8 @@ bool MipsAsmParser::expandUxw(MCInst &Inst, SMLoc IDLoc, MCStreamer &Out, assert(OffsetImmOp.isImm() && "expected immediate operand kind"); MipsTargetStreamer &TOut = getTargetStreamer(); - unsigned DstReg = DstRegOp.getReg(); - unsigned SrcReg = SrcRegOp.getReg(); + MCRegister DstReg = DstRegOp.getReg(); + MCRegister SrcReg = SrcRegOp.getReg(); int64_t OffsetValue = OffsetImmOp.getImm(); // Compute left/right load/store offsets. @@ -4572,7 +4512,7 @@ bool MipsAsmParser::expandUxw(MCInst &Inst, SMLoc IDLoc, MCStreamer &Out, bool IsLoadInst = (Inst.getOpcode() == Mips::Ulw); bool DoMove = IsLoadInst && (SrcReg == DstReg) && !IsLargeOffset; - unsigned TmpReg = SrcReg; + MCRegister TmpReg = SrcReg; if (IsLargeOffset || DoMove) { warnIfNoMacro(IDLoc); TmpReg = getATReg(IDLoc); @@ -4609,9 +4549,9 @@ bool MipsAsmParser::expandSge(MCInst &Inst, SMLoc IDLoc, MCStreamer &Out, Inst.getOperand(1).isReg() && Inst.getOperand(2).isReg() && "Invalid instruction operand."); - unsigned DstReg = Inst.getOperand(0).getReg(); - unsigned SrcReg = Inst.getOperand(1).getReg(); - unsigned OpReg = Inst.getOperand(2).getReg(); + MCRegister DstReg = Inst.getOperand(0).getReg(); + MCRegister SrcReg = Inst.getOperand(1).getReg(); + MCRegister OpReg = Inst.getOperand(2).getReg(); unsigned OpCode; warnIfNoMacro(IDLoc); @@ -4643,8 +4583,8 @@ bool MipsAsmParser::expandSgeImm(MCInst &Inst, SMLoc IDLoc, MCStreamer &Out, Inst.getOperand(1).isReg() && Inst.getOperand(2).isImm() && "Invalid instruction operand."); - unsigned DstReg = Inst.getOperand(0).getReg(); - unsigned SrcReg = Inst.getOperand(1).getReg(); + MCRegister DstReg = Inst.getOperand(0).getReg(); + MCRegister SrcReg = Inst.getOperand(1).getReg(); int64_t ImmValue = Inst.getOperand(2).getImm(); unsigned OpRegCode, OpImmCode; @@ -4671,15 +4611,15 @@ bool MipsAsmParser::expandSgeImm(MCInst &Inst, SMLoc IDLoc, MCStreamer &Out, TOut.emitRRI(OpImmCode, DstReg, SrcReg, ImmValue, IDLoc, STI); TOut.emitRRI(Mips::XORi, DstReg, DstReg, 1, IDLoc, STI); } else { - unsigned ImmReg = DstReg; + MCRegister ImmReg = DstReg; if (DstReg == SrcReg) { - unsigned ATReg = getATReg(Inst.getLoc()); + MCRegister ATReg = getATReg(Inst.getLoc()); if (!ATReg) return true; ImmReg = ATReg; } - if (loadImmediate(ImmValue, ImmReg, Mips::NoRegister, isInt<32>(ImmValue), + if (loadImmediate(ImmValue, ImmReg, MCRegister(), isInt<32>(ImmValue), false, IDLoc, Out, STI)) return true; @@ -4699,9 +4639,9 @@ bool MipsAsmParser::expandSgtImm(MCInst &Inst, SMLoc IDLoc, MCStreamer &Out, Inst.getOperand(1).isReg() && Inst.getOperand(2).isImm() && "Invalid instruction operand."); - unsigned DstReg = Inst.getOperand(0).getReg(); - unsigned SrcReg = Inst.getOperand(1).getReg(); - unsigned ImmReg = DstReg; + MCRegister DstReg = Inst.getOperand(0).getReg(); + MCRegister SrcReg = Inst.getOperand(1).getReg(); + MCRegister ImmReg = DstReg; int64_t ImmValue = Inst.getOperand(2).getImm(); unsigned OpCode; @@ -4721,14 +4661,14 @@ bool MipsAsmParser::expandSgtImm(MCInst &Inst, SMLoc IDLoc, MCStreamer &Out, } if (DstReg == SrcReg) { - unsigned ATReg = getATReg(Inst.getLoc()); + MCRegister ATReg = getATReg(Inst.getLoc()); if (!ATReg) return true; ImmReg = ATReg; } - if (loadImmediate(ImmValue, ImmReg, Mips::NoRegister, isInt<32>(ImmValue), - false, IDLoc, Out, STI)) + if (loadImmediate(ImmValue, ImmReg, MCRegister(), isInt<32>(ImmValue), false, + IDLoc, Out, STI)) return true; // $SrcReg > $ImmReg is equal to $ImmReg < $SrcReg @@ -4746,9 +4686,9 @@ bool MipsAsmParser::expandSle(MCInst &Inst, SMLoc IDLoc, MCStreamer &Out, Inst.getOperand(1).isReg() && Inst.getOperand(2).isReg() && "Invalid instruction operand."); - unsigned DstReg = Inst.getOperand(0).getReg(); - unsigned SrcReg = Inst.getOperand(1).getReg(); - unsigned OpReg = Inst.getOperand(2).getReg(); + MCRegister DstReg = Inst.getOperand(0).getReg(); + MCRegister SrcReg = Inst.getOperand(1).getReg(); + MCRegister OpReg = Inst.getOperand(2).getReg(); unsigned OpCode; warnIfNoMacro(IDLoc); @@ -4780,8 +4720,8 @@ bool MipsAsmParser::expandSleImm(MCInst &Inst, SMLoc IDLoc, MCStreamer &Out, Inst.getOperand(1).isReg() && Inst.getOperand(2).isImm() && "Invalid instruction operand."); - unsigned DstReg = Inst.getOperand(0).getReg(); - unsigned SrcReg = Inst.getOperand(1).getReg(); + MCRegister DstReg = Inst.getOperand(0).getReg(); + MCRegister SrcReg = Inst.getOperand(1).getReg(); int64_t ImmValue = Inst.getOperand(2).getImm(); unsigned OpRegCode; @@ -4801,16 +4741,16 @@ bool MipsAsmParser::expandSleImm(MCInst &Inst, SMLoc IDLoc, MCStreamer &Out, } // $SrcReg <= Imm is equal to (not (Imm < $SrcReg)) - unsigned ImmReg = DstReg; + MCRegister ImmReg = DstReg; if (DstReg == SrcReg) { - unsigned ATReg = getATReg(Inst.getLoc()); + MCRegister ATReg = getATReg(Inst.getLoc()); if (!ATReg) return true; ImmReg = ATReg; } - if (loadImmediate(ImmValue, ImmReg, Mips::NoRegister, isInt<32>(ImmValue), - false, IDLoc, Out, STI)) + if (loadImmediate(ImmValue, ImmReg, MCRegister(), isInt<32>(ImmValue), false, + IDLoc, Out, STI)) return true; TOut.emitRRR(OpRegCode, DstReg, ImmReg, SrcReg, IDLoc, STI); @@ -4829,10 +4769,10 @@ bool MipsAsmParser::expandAliasImmediate(MCInst &Inst, SMLoc IDLoc, Inst.getOperand(1).isReg() && Inst.getOperand(2).isImm() && "Invalid instruction operand."); - unsigned ATReg = Mips::NoRegister; - unsigned FinalDstReg = Mips::NoRegister; - unsigned DstReg = Inst.getOperand(0).getReg(); - unsigned SrcReg = Inst.getOperand(1).getReg(); + MCRegister ATReg; + MCRegister FinalDstReg; + MCRegister DstReg = Inst.getOperand(0).getReg(); + MCRegister SrcReg = Inst.getOperand(1).getReg(); int64_t ImmValue = Inst.getOperand(2).getImm(); bool Is32Bit = isInt<32>(ImmValue) || (!isGP64bit() && isUInt<32>(ImmValue)); @@ -4847,7 +4787,7 @@ bool MipsAsmParser::expandAliasImmediate(MCInst &Inst, SMLoc IDLoc, DstReg = ATReg; } - if (!loadImmediate(ImmValue, DstReg, Mips::NoRegister, Is32Bit, false, + if (!loadImmediate(ImmValue, DstReg, MCRegister(), Is32Bit, false, Inst.getLoc(), Out, STI)) { switch (FinalOpcode) { default: @@ -4917,7 +4857,7 @@ bool MipsAsmParser::expandAliasImmediate(MCInst &Inst, SMLoc IDLoc, break; } - if (FinalDstReg == Mips::NoRegister) + if (!FinalDstReg) TOut.emitRRR(FinalOpcode, DstReg, DstReg, SrcReg, IDLoc, STI); else TOut.emitRRR(FinalOpcode, FinalDstReg, FinalDstReg, DstReg, IDLoc, STI); @@ -4929,11 +4869,11 @@ bool MipsAsmParser::expandAliasImmediate(MCInst &Inst, SMLoc IDLoc, bool MipsAsmParser::expandRotation(MCInst &Inst, SMLoc IDLoc, MCStreamer &Out, const MCSubtargetInfo *STI) { MipsTargetStreamer &TOut = getTargetStreamer(); - unsigned ATReg = Mips::NoRegister; - unsigned DReg = Inst.getOperand(0).getReg(); - unsigned SReg = Inst.getOperand(1).getReg(); - unsigned TReg = Inst.getOperand(2).getReg(); - unsigned TmpReg = DReg; + MCRegister ATReg; + MCRegister DReg = Inst.getOperand(0).getReg(); + MCRegister SReg = Inst.getOperand(1).getReg(); + MCRegister TReg = Inst.getOperand(2).getReg(); + MCRegister TmpReg = DReg; unsigned FirstShift = Mips::NOP; unsigned SecondShift = Mips::NOP; @@ -4992,9 +4932,9 @@ bool MipsAsmParser::expandRotationImm(MCInst &Inst, SMLoc IDLoc, MCStreamer &Out, const MCSubtargetInfo *STI) { MipsTargetStreamer &TOut = getTargetStreamer(); - unsigned ATReg = Mips::NoRegister; - unsigned DReg = Inst.getOperand(0).getReg(); - unsigned SReg = Inst.getOperand(1).getReg(); + MCRegister ATReg; + MCRegister DReg = Inst.getOperand(0).getReg(); + MCRegister SReg = Inst.getOperand(1).getReg(); int64_t ImmValue = Inst.getOperand(2).getImm(); unsigned FirstShift = Mips::NOP; @@ -5054,11 +4994,11 @@ bool MipsAsmParser::expandRotationImm(MCInst &Inst, SMLoc IDLoc, bool MipsAsmParser::expandDRotation(MCInst &Inst, SMLoc IDLoc, MCStreamer &Out, const MCSubtargetInfo *STI) { MipsTargetStreamer &TOut = getTargetStreamer(); - unsigned ATReg = Mips::NoRegister; - unsigned DReg = Inst.getOperand(0).getReg(); - unsigned SReg = Inst.getOperand(1).getReg(); - unsigned TReg = Inst.getOperand(2).getReg(); - unsigned TmpReg = DReg; + MCRegister ATReg; + MCRegister DReg = Inst.getOperand(0).getReg(); + MCRegister SReg = Inst.getOperand(1).getReg(); + MCRegister TReg = Inst.getOperand(2).getReg(); + MCRegister TmpReg = DReg; unsigned FirstShift = Mips::NOP; unsigned SecondShift = Mips::NOP; @@ -5117,9 +5057,9 @@ bool MipsAsmParser::expandDRotationImm(MCInst &Inst, SMLoc IDLoc, MCStreamer &Out, const MCSubtargetInfo *STI) { MipsTargetStreamer &TOut = getTargetStreamer(); - unsigned ATReg = Mips::NoRegister; - unsigned DReg = Inst.getOperand(0).getReg(); - unsigned SReg = Inst.getOperand(1).getReg(); + MCRegister ATReg; + MCRegister DReg = Inst.getOperand(0).getReg(); + MCRegister SReg = Inst.getOperand(1).getReg(); int64_t ImmValue = Inst.getOperand(2).getImm() % 64; unsigned FirstShift = Mips::NOP; @@ -5211,8 +5151,8 @@ bool MipsAsmParser::expandDRotationImm(MCInst &Inst, SMLoc IDLoc, bool MipsAsmParser::expandAbs(MCInst &Inst, SMLoc IDLoc, MCStreamer &Out, const MCSubtargetInfo *STI) { MipsTargetStreamer &TOut = getTargetStreamer(); - unsigned FirstRegOp = Inst.getOperand(0).getReg(); - unsigned SecondRegOp = Inst.getOperand(1).getReg(); + MCRegister FirstRegOp = Inst.getOperand(0).getReg(); + MCRegister SecondRegOp = Inst.getOperand(1).getReg(); TOut.emitRI(Mips::BGEZ, SecondRegOp, 8, IDLoc, STI); if (FirstRegOp != SecondRegOp) @@ -5227,17 +5167,16 @@ bool MipsAsmParser::expandAbs(MCInst &Inst, SMLoc IDLoc, MCStreamer &Out, bool MipsAsmParser::expandMulImm(MCInst &Inst, SMLoc IDLoc, MCStreamer &Out, const MCSubtargetInfo *STI) { MipsTargetStreamer &TOut = getTargetStreamer(); - unsigned ATReg = Mips::NoRegister; - unsigned DstReg = Inst.getOperand(0).getReg(); - unsigned SrcReg = Inst.getOperand(1).getReg(); + MCRegister ATReg; + MCRegister DstReg = Inst.getOperand(0).getReg(); + MCRegister SrcReg = Inst.getOperand(1).getReg(); int32_t ImmValue = Inst.getOperand(2).getImm(); ATReg = getATReg(IDLoc); if (!ATReg) return true; - loadImmediate(ImmValue, ATReg, Mips::NoRegister, true, false, IDLoc, Out, - STI); + loadImmediate(ImmValue, ATReg, MCRegister(), true, false, IDLoc, Out, STI); TOut.emitRR(Inst.getOpcode() == Mips::MULImmMacro ? Mips::MULT : Mips::DMULT, SrcReg, ATReg, IDLoc, STI); @@ -5250,10 +5189,10 @@ bool MipsAsmParser::expandMulImm(MCInst &Inst, SMLoc IDLoc, MCStreamer &Out, bool MipsAsmParser::expandMulO(MCInst &Inst, SMLoc IDLoc, MCStreamer &Out, const MCSubtargetInfo *STI) { MipsTargetStreamer &TOut = getTargetStreamer(); - unsigned ATReg = Mips::NoRegister; - unsigned DstReg = Inst.getOperand(0).getReg(); - unsigned SrcReg = Inst.getOperand(1).getReg(); - unsigned TmpReg = Inst.getOperand(2).getReg(); + MCRegister ATReg; + MCRegister DstReg = Inst.getOperand(0).getReg(); + MCRegister SrcReg = Inst.getOperand(1).getReg(); + MCRegister TmpReg = Inst.getOperand(2).getReg(); ATReg = getATReg(Inst.getLoc()); if (!ATReg) @@ -5272,7 +5211,7 @@ bool MipsAsmParser::expandMulO(MCInst &Inst, SMLoc IDLoc, MCStreamer &Out, if (useTraps()) { TOut.emitRRI(Mips::TNE, DstReg, ATReg, 6, IDLoc, STI); } else { - MCContext & Context = TOut.getStreamer().getContext(); + MCContext &Context = TOut.getContext(); MCSymbol * BrTarget = Context.createTempSymbol(); MCOperand LabelOp = MCOperand::createExpr(MCSymbolRefExpr::create(BrTarget, Context)); @@ -5292,10 +5231,10 @@ bool MipsAsmParser::expandMulO(MCInst &Inst, SMLoc IDLoc, MCStreamer &Out, bool MipsAsmParser::expandMulOU(MCInst &Inst, SMLoc IDLoc, MCStreamer &Out, const MCSubtargetInfo *STI) { MipsTargetStreamer &TOut = getTargetStreamer(); - unsigned ATReg = Mips::NoRegister; - unsigned DstReg = Inst.getOperand(0).getReg(); - unsigned SrcReg = Inst.getOperand(1).getReg(); - unsigned TmpReg = Inst.getOperand(2).getReg(); + MCRegister ATReg; + MCRegister DstReg = Inst.getOperand(0).getReg(); + MCRegister SrcReg = Inst.getOperand(1).getReg(); + MCRegister TmpReg = Inst.getOperand(2).getReg(); ATReg = getATReg(IDLoc); if (!ATReg) @@ -5309,7 +5248,7 @@ bool MipsAsmParser::expandMulOU(MCInst &Inst, SMLoc IDLoc, MCStreamer &Out, if (useTraps()) { TOut.emitRRI(Mips::TNE, ATReg, Mips::ZERO, 6, IDLoc, STI); } else { - MCContext & Context = TOut.getStreamer().getContext(); + MCContext &Context = TOut.getContext(); MCSymbol * BrTarget = Context.createTempSymbol(); MCOperand LabelOp = MCOperand::createExpr(MCSymbolRefExpr::create(BrTarget, Context)); @@ -5328,9 +5267,9 @@ bool MipsAsmParser::expandMulOU(MCInst &Inst, SMLoc IDLoc, MCStreamer &Out, bool MipsAsmParser::expandDMULMacro(MCInst &Inst, SMLoc IDLoc, MCStreamer &Out, const MCSubtargetInfo *STI) { MipsTargetStreamer &TOut = getTargetStreamer(); - unsigned DstReg = Inst.getOperand(0).getReg(); - unsigned SrcReg = Inst.getOperand(1).getReg(); - unsigned TmpReg = Inst.getOperand(2).getReg(); + MCRegister DstReg = Inst.getOperand(0).getReg(); + MCRegister SrcReg = Inst.getOperand(1).getReg(); + MCRegister TmpReg = Inst.getOperand(2).getReg(); TOut.emitRR(Mips::DMULTu, SrcReg, TmpReg, IDLoc, STI); TOut.emitR(Mips::MFLO, DstReg, IDLoc, STI); @@ -5354,9 +5293,9 @@ bool MipsAsmParser::expandLoadStoreDMacro(MCInst &Inst, SMLoc IDLoc, MipsTargetStreamer &TOut = getTargetStreamer(); unsigned Opcode = IsLoad ? Mips::LW : Mips::SW; - unsigned FirstReg = Inst.getOperand(0).getReg(); - unsigned SecondReg = nextReg(FirstReg); - unsigned BaseReg = Inst.getOperand(1).getReg(); + MCRegister FirstReg = Inst.getOperand(0).getReg(); + MCRegister SecondReg = nextReg(FirstReg); + MCRegister BaseReg = Inst.getOperand(1).getReg(); if (!SecondReg) return true; @@ -5401,9 +5340,9 @@ bool MipsAsmParser::expandStoreDM1Macro(MCInst &Inst, SMLoc IDLoc, MipsTargetStreamer &TOut = getTargetStreamer(); unsigned Opcode = Mips::SWC1; - unsigned FirstReg = Inst.getOperand(0).getReg(); - unsigned SecondReg = nextReg(FirstReg); - unsigned BaseReg = Inst.getOperand(1).getReg(); + MCRegister FirstReg = Inst.getOperand(0).getReg(); + MCRegister SecondReg = nextReg(FirstReg); + MCRegister BaseReg = Inst.getOperand(1).getReg(); if (!SecondReg) return true; @@ -5437,9 +5376,9 @@ bool MipsAsmParser::expandSeq(MCInst &Inst, SMLoc IDLoc, MCStreamer &Out, Inst.getOperand(1).isReg() && Inst.getOperand(2).isReg() && "Invalid instruction operand."); - unsigned DstReg = Inst.getOperand(0).getReg(); - unsigned SrcReg = Inst.getOperand(1).getReg(); - unsigned OpReg = Inst.getOperand(2).getReg(); + MCRegister DstReg = Inst.getOperand(0).getReg(); + MCRegister SrcReg = Inst.getOperand(1).getReg(); + MCRegister OpReg = Inst.getOperand(2).getReg(); warnIfNoMacro(IDLoc); @@ -5449,7 +5388,7 @@ bool MipsAsmParser::expandSeq(MCInst &Inst, SMLoc IDLoc, MCStreamer &Out, return false; } - unsigned Reg = SrcReg == Mips::ZERO ? OpReg : SrcReg; + MCRegister Reg = SrcReg == Mips::ZERO ? OpReg : SrcReg; TOut.emitRRI(Mips::SLTiu, DstReg, Reg, 1, IDLoc, STI); return false; } @@ -5463,8 +5402,8 @@ bool MipsAsmParser::expandSeqI(MCInst &Inst, SMLoc IDLoc, MCStreamer &Out, Inst.getOperand(1).isReg() && Inst.getOperand(2).isImm() && "Invalid instruction operand."); - unsigned DstReg = Inst.getOperand(0).getReg(); - unsigned SrcReg = Inst.getOperand(1).getReg(); + MCRegister DstReg = Inst.getOperand(0).getReg(); + MCRegister SrcReg = Inst.getOperand(1).getReg(); int64_t Imm = Inst.getOperand(2).getImm(); warnIfNoMacro(IDLoc); @@ -5490,12 +5429,12 @@ bool MipsAsmParser::expandSeqI(MCInst &Inst, SMLoc IDLoc, MCStreamer &Out, } if (!isUInt<16>(Imm)) { - unsigned ATReg = getATReg(IDLoc); + MCRegister ATReg = getATReg(IDLoc); if (!ATReg) return true; - if (loadImmediate(Imm, ATReg, Mips::NoRegister, true, isGP64bit(), IDLoc, - Out, STI)) + if (loadImmediate(Imm, ATReg, MCRegister(), true, isGP64bit(), IDLoc, Out, + STI)) return true; TOut.emitRRR(Mips::XOR, DstReg, SrcReg, ATReg, IDLoc, STI); @@ -5518,9 +5457,9 @@ bool MipsAsmParser::expandSne(MCInst &Inst, SMLoc IDLoc, MCStreamer &Out, Inst.getOperand(1).isReg() && Inst.getOperand(2).isReg() && "Invalid instruction operand."); - unsigned DstReg = Inst.getOperand(0).getReg(); - unsigned SrcReg = Inst.getOperand(1).getReg(); - unsigned OpReg = Inst.getOperand(2).getReg(); + MCRegister DstReg = Inst.getOperand(0).getReg(); + MCRegister SrcReg = Inst.getOperand(1).getReg(); + MCRegister OpReg = Inst.getOperand(2).getReg(); warnIfNoMacro(IDLoc); @@ -5530,7 +5469,7 @@ bool MipsAsmParser::expandSne(MCInst &Inst, SMLoc IDLoc, MCStreamer &Out, return false; } - unsigned Reg = SrcReg == Mips::ZERO ? OpReg : SrcReg; + MCRegister Reg = SrcReg == Mips::ZERO ? OpReg : SrcReg; TOut.emitRRR(Mips::SLTu, DstReg, Mips::ZERO, Reg, IDLoc, STI); return false; } @@ -5544,8 +5483,8 @@ bool MipsAsmParser::expandSneI(MCInst &Inst, SMLoc IDLoc, MCStreamer &Out, Inst.getOperand(1).isReg() && Inst.getOperand(2).isImm() && "Invalid instruction operand."); - unsigned DstReg = Inst.getOperand(0).getReg(); - unsigned SrcReg = Inst.getOperand(1).getReg(); + MCRegister DstReg = Inst.getOperand(0).getReg(); + MCRegister SrcReg = Inst.getOperand(1).getReg(); int64_t ImmValue = Inst.getOperand(2).getImm(); warnIfNoMacro(IDLoc); @@ -5557,8 +5496,7 @@ bool MipsAsmParser::expandSneI(MCInst &Inst, SMLoc IDLoc, MCStreamer &Out, if (SrcReg == Mips::ZERO) { Warning(IDLoc, "comparison is always true"); - if (loadImmediate(1, DstReg, Mips::NoRegister, true, false, IDLoc, Out, - STI)) + if (loadImmediate(1, DstReg, MCRegister(), true, false, IDLoc, Out, STI)) return true; return false; } @@ -5577,12 +5515,12 @@ bool MipsAsmParser::expandSneI(MCInst &Inst, SMLoc IDLoc, MCStreamer &Out, return false; } - unsigned ATReg = getATReg(IDLoc); + MCRegister ATReg = getATReg(IDLoc); if (!ATReg) return true; - if (loadImmediate(ImmValue, ATReg, Mips::NoRegister, isInt<32>(ImmValue), - false, IDLoc, Out, STI)) + if (loadImmediate(ImmValue, ATReg, MCRegister(), isInt<32>(ImmValue), false, + IDLoc, Out, STI)) return true; TOut.emitRRR(Mips::XOR, DstReg, SrcReg, ATReg, IDLoc, STI); @@ -5597,7 +5535,7 @@ static unsigned getRegisterForMxtrDSP(MCInst &Inst, bool IsMFDSP) { switch (Inst.getOpcode()) { case Mips::MFTLO: case Mips::MTTLO: - switch (Inst.getOperand(IsMFDSP ? 1 : 0).getReg()) { + switch (Inst.getOperand(IsMFDSP ? 1 : 0).getReg().id()) { case Mips::AC0: return Mips::ZERO; case Mips::AC1: @@ -5611,7 +5549,7 @@ static unsigned getRegisterForMxtrDSP(MCInst &Inst, bool IsMFDSP) { } case Mips::MFTHI: case Mips::MTTHI: - switch (Inst.getOperand(IsMFDSP ? 1 : 0).getReg()) { + switch (Inst.getOperand(IsMFDSP ? 1 : 0).getReg().id()) { case Mips::AC0: return Mips::AT; case Mips::AC1: @@ -5625,7 +5563,7 @@ static unsigned getRegisterForMxtrDSP(MCInst &Inst, bool IsMFDSP) { } case Mips::MFTACX: case Mips::MTTACX: - switch (Inst.getOperand(IsMFDSP ? 1 : 0).getReg()) { + switch (Inst.getOperand(IsMFDSP ? 1 : 0).getReg().id()) { case Mips::AC0: return Mips::V0; case Mips::AC1: @@ -5648,7 +5586,7 @@ static unsigned getRegisterForMxtrDSP(MCInst &Inst, bool IsMFDSP) { // Map the floating point register operand to the corresponding register // operand. static unsigned getRegisterForMxtrFP(MCInst &Inst, bool IsMFTC1) { - switch (Inst.getOperand(IsMFTC1 ? 1 : 0).getReg()) { + switch (Inst.getOperand(IsMFTC1 ? 1 : 0).getReg().id()) { case Mips::F0: return Mips::ZERO; case Mips::F1: return Mips::AT; case Mips::F2: return Mips::V0; @@ -5687,7 +5625,7 @@ static unsigned getRegisterForMxtrFP(MCInst &Inst, bool IsMFTC1) { // Map the coprocessor operand the corresponding gpr register operand. static unsigned getRegisterForMxtrC0(MCInst &Inst, bool IsMFTC0) { - switch (Inst.getOperand(IsMFTC0 ? 1 : 0).getReg()) { + switch (Inst.getOperand(IsMFTC0 ? 1 : 0).getReg().id()) { case Mips::COP00: return Mips::ZERO; case Mips::COP01: return Mips::AT; case Mips::COP02: return Mips::V0; @@ -5729,7 +5667,7 @@ static unsigned getRegisterForMxtrC0(MCInst &Inst, bool IsMFTC0) { bool MipsAsmParser::expandMXTRAlias(MCInst &Inst, SMLoc IDLoc, MCStreamer &Out, const MCSubtargetInfo *STI) { MipsTargetStreamer &TOut = getTargetStreamer(); - unsigned rd = 0; + MCRegister rd; unsigned u = 1; unsigned sel = 0; unsigned h = 0; @@ -5806,8 +5744,8 @@ bool MipsAsmParser::expandSaaAddr(MCInst &Inst, SMLoc IDLoc, MCStreamer &Out, MipsTargetStreamer &TOut = getTargetStreamer(); unsigned Opcode = Inst.getOpcode() == Mips::SaaAddr ? Mips::SAA : Mips::SAAD; - unsigned RtReg = Inst.getOperand(0).getReg(); - unsigned BaseReg = Inst.getOperand(1).getReg(); + MCRegister RtReg = Inst.getOperand(0).getReg(); + MCRegister BaseReg = Inst.getOperand(1).getReg(); const MCOperand &BaseOp = Inst.getOperand(2); if (BaseOp.isImm()) { @@ -5818,7 +5756,7 @@ bool MipsAsmParser::expandSaaAddr(MCInst &Inst, SMLoc IDLoc, MCStreamer &Out, } } - unsigned ATReg = getATReg(IDLoc); + MCRegister ATReg = getATReg(IDLoc); if (!ATReg) return true; @@ -6197,9 +6135,9 @@ bool MipsAsmParser::matchAndEmitInstruction(SMLoc IDLoc, unsigned &Opcode, llvm_unreachable("Implement any new match types added!"); } -void MipsAsmParser::warnIfRegIndexIsAT(unsigned RegIndex, SMLoc Loc) { - if (RegIndex != 0 && AssemblerOptions.back()->getATRegIndex() == RegIndex) - Warning(Loc, "used $at (currently $" + Twine(RegIndex) + +void MipsAsmParser::warnIfRegIndexIsAT(MCRegister RegIndex, SMLoc Loc) { + if (RegIndex && AssemblerOptions.back()->getATRegIndex() == RegIndex) + Warning(Loc, "used $at (currently $" + Twine(RegIndex.id()) + ") without \".set noat\""); } @@ -6214,7 +6152,7 @@ void MipsAsmParser::ConvertXWPOperands(MCInst &Inst, (Inst.getOpcode() == Mips::LWP_MM || Inst.getOpcode() == Mips::SWP_MM) && "Unexpected instruction!"); ((MipsOperand &)*Operands[1]).addGPR32ZeroAsmRegOperands(Inst, 1); - int NextReg = nextReg(((MipsOperand &)*Operands[1]).getGPR32Reg()); + MCRegister NextReg = nextReg(((MipsOperand &)*Operands[1]).getGPR32Reg()); Inst.addOperand(MCOperand::createReg(NextReg)); ((MipsOperand &)*Operands[2]).addMemOperands(Inst, 2); } @@ -6391,20 +6329,78 @@ bool MipsAsmParser::canUseATReg() { return AssemblerOptions.back()->getATRegIndex() != 0; } -unsigned MipsAsmParser::getATReg(SMLoc Loc) { +MCRegister MipsAsmParser::getATReg(SMLoc Loc) { unsigned ATIndex = AssemblerOptions.back()->getATRegIndex(); if (ATIndex == 0) { reportParseError(Loc, "pseudo-instruction requires $at, which is not available"); return 0; } - unsigned AT = getReg( + MCRegister AT = getReg( (isGP64bit()) ? Mips::GPR64RegClassID : Mips::GPR32RegClassID, ATIndex); return AT; } -unsigned MipsAsmParser::getReg(int RC, int RegNo) { - return *(getContext().getRegisterInfo()->getRegClass(RC).begin() + RegNo); +MCRegister MipsAsmParser::getReg(int RC, int RegNo) { + return getContext().getRegisterInfo()->getRegClass(RC).getRegister(RegNo); +} + +// Parse an expression with optional relocation operator prefixes (e.g. %lo). +// Some weird expressions allowed by gas are not supported for simplicity, +// e.g. "%lo foo", "(%lo(foo))", "%lo(foo)+1". +const MCExpr *MipsAsmParser::parseRelocExpr() { + auto getOp = [](StringRef Op) { + return StringSwitch<Mips::Specifier>(Op) + .Case("call16", Mips::S_GOT_CALL) + .Case("call_hi", Mips::S_CALL_HI16) + .Case("call_lo", Mips::S_CALL_LO16) + .Case("dtprel_hi", Mips::S_DTPREL_HI) + .Case("dtprel_lo", Mips::S_DTPREL_LO) + .Case("got", Mips::S_GOT) + .Case("got_disp", Mips::S_GOT_DISP) + .Case("got_hi", Mips::S_GOT_HI16) + .Case("got_lo", Mips::S_GOT_LO16) + .Case("got_ofst", Mips::S_GOT_OFST) + .Case("got_page", Mips::S_GOT_PAGE) + .Case("gottprel", Mips::S_GOTTPREL) + .Case("gp_rel", Mips::S_GPREL) + .Case("hi", Mips::S_HI) + .Case("higher", Mips::S_HIGHER) + .Case("highest", Mips::S_HIGHEST) + .Case("lo", Mips::S_LO) + .Case("neg", Mips::S_NEG) + .Case("pcrel_hi", Mips::S_PCREL_HI16) + .Case("pcrel_lo", Mips::S_PCREL_LO16) + .Case("tlsgd", Mips::S_TLSGD) + .Case("tlsldm", Mips::S_TLSLDM) + .Case("tprel_hi", Mips::S_TPREL_HI) + .Case("tprel_lo", Mips::S_TPREL_LO) + .Default(Mips::S_None); + }; + + MCAsmParser &Parser = getParser(); + StringRef Name; + const MCExpr *Res = nullptr; + SmallVector<Mips::Specifier, 0> Ops; + while (parseOptionalToken(AsmToken::Percent)) { + if (Parser.parseIdentifier(Name) || + Parser.parseToken(AsmToken::LParen, "expected '('")) + return nullptr; + auto Op = getOp(Name); + if (Op == Mips::S_None) { + Error(Parser.getTok().getLoc(), "invalid relocation operator"); + return nullptr; + } + Ops.push_back(Op); + } + if (Parser.parseExpression(Res)) + return nullptr; + while (Ops.size()) { + if (Parser.parseToken(AsmToken::RParen, "expected ')'")) + return nullptr; + Res = MCSpecifierExpr::create(Res, Ops.pop_back_val(), getContext()); + } + return Res; } bool MipsAsmParser::parseOperand(OperandVector &Operands, StringRef Mnemonic) { @@ -6450,22 +6446,17 @@ bool MipsAsmParser::parseOperand(OperandVector &Operands, StringRef Mnemonic) { SMLoc E = SMLoc::getFromPointer(Parser.getTok().getLoc().getPointer() - 1); MCSymbol *Sym = getContext().getOrCreateSymbol(Identifier); // Otherwise create a symbol reference. - const MCExpr *SymRef = - MCSymbolRefExpr::create(Sym, MCSymbolRefExpr::VK_None, getContext()); + const MCExpr *SymRef = MCSymbolRefExpr::create(Sym, getContext()); Operands.push_back(MipsOperand::CreateImm(SymRef, S, E, *this)); return false; } default: { - LLVM_DEBUG(dbgs() << ".. generic integer expression\n"); - - const MCExpr *Expr; SMLoc S = Parser.getTok().getLoc(); // Start location of the operand. - if (getParser().parseExpression(Expr)) + const MCExpr *Expr = parseRelocExpr(); + if (!Expr) return true; - SMLoc E = SMLoc::getFromPointer(Parser.getTok().getLoc().getPointer() - 1); - Operands.push_back(MipsOperand::CreateImm(Expr, S, E, *this)); return false; } @@ -6504,14 +6495,6 @@ ParseStatus MipsAsmParser::tryParseRegister(MCRegister &Reg, SMLoc &StartLoc, return (Reg == (unsigned)-1) ? ParseStatus::NoMatch : ParseStatus::Success; } -bool MipsAsmParser::parseMemOffset(const MCExpr *&Res, bool isParenExpr) { - SMLoc S; - - if (isParenExpr) - return getParser().parseParenExprOfDepth(0, Res, S); - return getParser().parseExpression(Res); -} - ParseStatus MipsAsmParser::parseMemOperand(OperandVector &Operands) { MCAsmParser &Parser = getParser(); LLVM_DEBUG(dbgs() << "parseMemOperand\n"); @@ -6528,7 +6511,10 @@ ParseStatus MipsAsmParser::parseMemOperand(OperandVector &Operands) { } if (getLexer().getKind() != AsmToken::Dollar) { - if (parseMemOffset(IdVal, isParenExpr)) + IdVal = parseRelocExpr(); + if (!IdVal) + return ParseStatus::Failure; + if (isParenExpr && Parser.parseRParen()) return ParseStatus::Failure; const AsmToken &Tok = Parser.getTok(); // Get the next token. @@ -7519,7 +7505,7 @@ bool MipsAsmParser::parseSetAssignment() { if (MCParserUtils::parseAssignmentExpression(Name, /* allow_redef */ true, Parser, Sym, Value)) return true; - Sym->setVariableValue(Value); + getStreamer().emitAssignment(Sym, Value); return false; } @@ -8074,109 +8060,61 @@ bool MipsAsmParser::parseDirectiveSet() { /// parseDirectiveGpWord /// ::= .gpword local_sym bool MipsAsmParser::parseDirectiveGpWord() { - MCAsmParser &Parser = getParser(); const MCExpr *Value; - // EmitGPRel32Value requires an expression, so we are using base class - // method to evaluate the expression. if (getParser().parseExpression(Value)) return true; - getParser().getStreamer().emitGPRel32Value(Value); - - if (getLexer().isNot(AsmToken::EndOfStatement)) - return Error(getLexer().getLoc(), - "unexpected token, expected end of statement"); - Parser.Lex(); // Eat EndOfStatement token. - return false; + getTargetStreamer().emitGPRel32Value(Value); + return parseEOL(); } /// parseDirectiveGpDWord /// ::= .gpdword local_sym bool MipsAsmParser::parseDirectiveGpDWord() { - MCAsmParser &Parser = getParser(); const MCExpr *Value; - // EmitGPRel64Value requires an expression, so we are using base class - // method to evaluate the expression. if (getParser().parseExpression(Value)) return true; - getParser().getStreamer().emitGPRel64Value(Value); - - if (getLexer().isNot(AsmToken::EndOfStatement)) - return Error(getLexer().getLoc(), - "unexpected token, expected end of statement"); - Parser.Lex(); // Eat EndOfStatement token. - return false; + getTargetStreamer().emitGPRel64Value(Value); + return parseEOL(); } /// parseDirectiveDtpRelWord /// ::= .dtprelword tls_sym bool MipsAsmParser::parseDirectiveDtpRelWord() { - MCAsmParser &Parser = getParser(); const MCExpr *Value; - // EmitDTPRel32Value requires an expression, so we are using base class - // method to evaluate the expression. if (getParser().parseExpression(Value)) return true; - getParser().getStreamer().emitDTPRel32Value(Value); - - if (getLexer().isNot(AsmToken::EndOfStatement)) - return Error(getLexer().getLoc(), - "unexpected token, expected end of statement"); - Parser.Lex(); // Eat EndOfStatement token. - return false; + getTargetStreamer().emitDTPRel32Value(Value); + return parseEOL(); } /// parseDirectiveDtpRelDWord /// ::= .dtpreldword tls_sym bool MipsAsmParser::parseDirectiveDtpRelDWord() { - MCAsmParser &Parser = getParser(); const MCExpr *Value; - // EmitDTPRel64Value requires an expression, so we are using base class - // method to evaluate the expression. if (getParser().parseExpression(Value)) return true; - getParser().getStreamer().emitDTPRel64Value(Value); - - if (getLexer().isNot(AsmToken::EndOfStatement)) - return Error(getLexer().getLoc(), - "unexpected token, expected end of statement"); - Parser.Lex(); // Eat EndOfStatement token. - return false; + getTargetStreamer().emitDTPRel64Value(Value); + return parseEOL(); } /// parseDirectiveTpRelWord /// ::= .tprelword tls_sym bool MipsAsmParser::parseDirectiveTpRelWord() { - MCAsmParser &Parser = getParser(); const MCExpr *Value; - // EmitTPRel32Value requires an expression, so we are using base class - // method to evaluate the expression. if (getParser().parseExpression(Value)) return true; - getParser().getStreamer().emitTPRel32Value(Value); - - if (getLexer().isNot(AsmToken::EndOfStatement)) - return Error(getLexer().getLoc(), - "unexpected token, expected end of statement"); - Parser.Lex(); // Eat EndOfStatement token. - return false; + getTargetStreamer().emitTPRel32Value(Value); + return parseEOL(); } /// parseDirectiveTpRelDWord /// ::= .tpreldword tls_sym bool MipsAsmParser::parseDirectiveTpRelDWord() { - MCAsmParser &Parser = getParser(); const MCExpr *Value; - // EmitTPRel64Value requires an expression, so we are using base class - // method to evaluate the expression. if (getParser().parseExpression(Value)) return true; - getParser().getStreamer().emitTPRel64Value(Value); - - if (getLexer().isNot(AsmToken::EndOfStatement)) - return Error(getLexer().getLoc(), - "unexpected token, expected end of statement"); - Parser.Lex(); // Eat EndOfStatement token. - return false; + getTargetStreamer().emitTPRel64Value(Value); + return parseEOL(); } bool MipsAsmParser::parseDirectiveOption() { @@ -8291,7 +8229,7 @@ bool MipsAsmParser::parseSSectionDirective(StringRef Section, unsigned Type) { /// ::= .module noginv bool MipsAsmParser::parseDirectiveModule() { MCAsmParser &Parser = getParser(); - MCAsmLexer &Lexer = getLexer(); + AsmLexer &Lexer = getLexer(); SMLoc L = Lexer.getLoc(); if (!getTargetStreamer().isModuleDirectiveAllowed()) { @@ -8532,7 +8470,7 @@ bool MipsAsmParser::parseDirectiveModule() { /// ::= =64 bool MipsAsmParser::parseDirectiveModuleFP() { MCAsmParser &Parser = getParser(); - MCAsmLexer &Lexer = getLexer(); + AsmLexer &Lexer = getLexer(); if (Lexer.isNot(AsmToken::Equal)) { reportParseError("unexpected token, expected equals sign '='"); @@ -8565,7 +8503,7 @@ bool MipsAsmParser::parseDirectiveModuleFP() { bool MipsAsmParser::parseFpABIValue(MipsABIFlagsSection::FpABIKind &FpABI, StringRef Directive) { MCAsmParser &Parser = getParser(); - MCAsmLexer &Lexer = getLexer(); + AsmLexer &Lexer = getLexer(); bool ModuleLevelOptions = Directive == ".module"; if (Lexer.is(AsmToken::Identifier)) { @@ -8968,7 +8906,8 @@ bool MipsAsmParser::parseInternalDirectiveReallowModule() { return false; } -extern "C" LLVM_EXTERNAL_VISIBILITY void LLVMInitializeMipsAsmParser() { +extern "C" LLVM_ABI LLVM_EXTERNAL_VISIBILITY void +LLVMInitializeMipsAsmParser() { RegisterMCAsmParser<MipsAsmParser> X(getTheMipsTarget()); RegisterMCAsmParser<MipsAsmParser> Y(getTheMipselTarget()); RegisterMCAsmParser<MipsAsmParser> A(getTheMips64Target()); |
