@@ -434,7 +434,8 @@ class X86AsmParser : public MCTargetAsmParser {
434434
435435 class IntelExprStateMachine {
436436 IntelExprState State = IES_INIT, PrevState = IES_ERROR;
437- unsigned BaseReg = 0 , IndexReg = 0 , TmpReg = 0 , Scale = 0 ;
437+ MCRegister BaseReg, IndexReg, TmpReg;
438+ unsigned Scale = 0 ;
438439 int64_t Imm = 0 ;
439440 const MCExpr *Sym = nullptr ;
440441 StringRef SymName;
@@ -468,8 +469,8 @@ class X86AsmParser : public MCTargetAsmParser {
468469 bool isBracketUsed () const { return BracketUsed; }
469470 bool isOffsetOperator () const { return OffsetOperator; }
470471 SMLoc getOffsetLoc () const { return OffsetOperatorLoc; }
471- unsigned getBaseReg () const { return BaseReg; }
472- unsigned getIndexReg () const { return IndexReg; }
472+ MCRegister getBaseReg () const { return BaseReg; }
473+ MCRegister getIndexReg () const { return IndexReg; }
473474 unsigned getScale () const { return Scale; }
474475 const MCExpr *getSym () const { return Sym; }
475476 StringRef getSymName () const { return SymName; }
@@ -791,7 +792,7 @@ class X86AsmParser : public MCTargetAsmParser {
791792 }
792793 PrevState = CurrState;
793794 }
794- bool onRegister (unsigned Reg, StringRef &ErrMsg) {
795+ bool onRegister (MCRegister Reg, StringRef &ErrMsg) {
795796 IntelExprState CurrState = State;
796797 switch (State) {
797798 default :
@@ -1111,8 +1112,8 @@ class X86AsmParser : public MCTargetAsmParser {
11111112
11121113 std::unique_ptr<X86Operand> DefaultMemSIOperand (SMLoc Loc);
11131114 std::unique_ptr<X86Operand> DefaultMemDIOperand (SMLoc Loc);
1114- bool IsSIReg (unsigned Reg);
1115- unsigned GetSIDIForRegClass (unsigned RegClassID, unsigned Reg , bool IsSIReg);
1115+ bool IsSIReg (MCRegister Reg);
1116+ MCRegister GetSIDIForRegClass (unsigned RegClassID, bool IsSIReg);
11161117 void
11171118 AddDefaultSrcDestOperands (OperandVector &Operands,
11181119 std::unique_ptr<llvm::MCParsedAsmOperand> &&Src,
@@ -1145,14 +1146,14 @@ class X86AsmParser : public MCTargetAsmParser {
11451146 void tryParseOperandIdx (AsmToken::TokenKind PrevTK,
11461147 IntelExprStateMachine &SM);
11471148
1148- bool ParseMemOperand (unsigned SegReg, const MCExpr *Disp, SMLoc StartLoc,
1149+ bool ParseMemOperand (MCRegister SegReg, const MCExpr *Disp, SMLoc StartLoc,
11491150 SMLoc EndLoc, OperandVector &Operands);
11501151
11511152 X86::CondCode ParseConditionCode (StringRef CCode);
11521153
11531154 bool ParseIntelMemoryOperandSize (unsigned &Size);
1154- bool CreateMemForMSInlineAsm (unsigned SegReg, const MCExpr *Disp,
1155- unsigned BaseReg, unsigned IndexReg,
1155+ bool CreateMemForMSInlineAsm (MCRegister SegReg, const MCExpr *Disp,
1156+ MCRegister BaseReg, MCRegister IndexReg,
11561157 unsigned Scale, bool NonAbsMem, SMLoc Start,
11571158 SMLoc End, unsigned Size, StringRef Identifier,
11581159 const InlineAsmIdentifierInfo &Info,
@@ -1300,14 +1301,15 @@ class X86AsmParser : public MCTargetAsmParser {
13001301#define GET_SUBTARGET_FEATURE_NAME
13011302#include " X86GenAsmMatcher.inc"
13021303
1303- static bool CheckBaseRegAndIndexRegAndScale (unsigned BaseReg, unsigned IndexReg,
1304- unsigned Scale, bool Is64BitMode,
1304+ static bool CheckBaseRegAndIndexRegAndScale (MCRegister BaseReg,
1305+ MCRegister IndexReg, unsigned Scale,
1306+ bool Is64BitMode,
13051307 StringRef &ErrMsg) {
13061308 // If we have both a base register and an index register make sure they are
13071309 // both 64-bit or 32-bit registers.
13081310 // To support VSIB, IndexReg can be 128-bit or 256-bit registers.
13091311
1310- if (BaseReg != 0 &&
1312+ if (BaseReg &&
13111313 !(BaseReg == X86::RIP || BaseReg == X86::EIP ||
13121314 X86MCRegisterClasses[X86::GR16RegClassID].contains (BaseReg) ||
13131315 X86MCRegisterClasses[X86::GR32RegClassID].contains (BaseReg) ||
@@ -1316,7 +1318,7 @@ static bool CheckBaseRegAndIndexRegAndScale(unsigned BaseReg, unsigned IndexReg,
13161318 return true ;
13171319 }
13181320
1319- if (IndexReg != 0 &&
1321+ if (IndexReg &&
13201322 !(IndexReg == X86::EIZ || IndexReg == X86::RIZ ||
13211323 X86MCRegisterClasses[X86::GR16RegClassID].contains (IndexReg) ||
13221324 X86MCRegisterClasses[X86::GR32RegClassID].contains (IndexReg) ||
@@ -1328,9 +1330,9 @@ static bool CheckBaseRegAndIndexRegAndScale(unsigned BaseReg, unsigned IndexReg,
13281330 return true ;
13291331 }
13301332
1331- if (((BaseReg == X86::RIP || BaseReg == X86::EIP) && IndexReg != 0 ) ||
1332- IndexReg == X86::EIP || IndexReg == X86::RIP ||
1333- IndexReg == X86::ESP || IndexReg == X86:: RSP) {
1333+ if (((BaseReg == X86::RIP || BaseReg == X86::EIP) && IndexReg) ||
1334+ IndexReg == X86::EIP || IndexReg == X86::RIP || IndexReg == X86::ESP ||
1335+ IndexReg == X86::RSP) {
13341336 ErrMsg = " invalid base+index expression" ;
13351337 return true ;
13361338 }
@@ -1344,13 +1346,13 @@ static bool CheckBaseRegAndIndexRegAndScale(unsigned BaseReg, unsigned IndexReg,
13441346 return true ;
13451347 }
13461348
1347- if (BaseReg == 0 &&
1349+ if (! BaseReg &&
13481350 X86MCRegisterClasses[X86::GR16RegClassID].contains (IndexReg)) {
13491351 ErrMsg = " 16-bit memory operand may not include only index register" ;
13501352 return true ;
13511353 }
13521354
1353- if (BaseReg != 0 && IndexReg != 0 ) {
1355+ if (BaseReg && IndexReg) {
13541356 if (X86MCRegisterClasses[X86::GR64RegClassID].contains (BaseReg) &&
13551357 (X86MCRegisterClasses[X86::GR16RegClassID].contains (IndexReg) ||
13561358 X86MCRegisterClasses[X86::GR32RegClassID].contains (IndexReg) ||
@@ -1380,8 +1382,7 @@ static bool CheckBaseRegAndIndexRegAndScale(unsigned BaseReg, unsigned IndexReg,
13801382 }
13811383
13821384 // RIP/EIP-relative addressing is only supported in 64-bit mode.
1383- if (!Is64BitMode && BaseReg != 0 &&
1384- (BaseReg == X86::RIP || BaseReg == X86::EIP)) {
1385+ if (!Is64BitMode && (BaseReg == X86::RIP || BaseReg == X86::EIP)) {
13851386 ErrMsg = " IP-relative addressing requires 64-bit mode" ;
13861387 return true ;
13871388 }
@@ -1608,7 +1609,8 @@ ParseStatus X86AsmParser::tryParseRegister(MCRegister &Reg, SMLoc &StartLoc,
16081609
16091610std::unique_ptr<X86Operand> X86AsmParser::DefaultMemSIOperand (SMLoc Loc) {
16101611 bool Parse32 = is32BitMode () || Code16GCC;
1611- unsigned Basereg = is64BitMode () ? X86::RSI : (Parse32 ? X86::ESI : X86::SI);
1612+ MCRegister Basereg =
1613+ is64BitMode () ? X86::RSI : (Parse32 ? X86::ESI : X86::SI);
16121614 const MCExpr *Disp = MCConstantExpr::create (0 , getContext ());
16131615 return X86Operand::CreateMem (getPointerWidth (), /* SegReg=*/ 0 , Disp,
16141616 /* BaseReg=*/ Basereg, /* IndexReg=*/ 0 , /* Scale=*/ 1 ,
@@ -1617,15 +1619,16 @@ std::unique_ptr<X86Operand> X86AsmParser::DefaultMemSIOperand(SMLoc Loc) {
16171619
16181620std::unique_ptr<X86Operand> X86AsmParser::DefaultMemDIOperand (SMLoc Loc) {
16191621 bool Parse32 = is32BitMode () || Code16GCC;
1620- unsigned Basereg = is64BitMode () ? X86::RDI : (Parse32 ? X86::EDI : X86::DI);
1622+ MCRegister Basereg =
1623+ is64BitMode () ? X86::RDI : (Parse32 ? X86::EDI : X86::DI);
16211624 const MCExpr *Disp = MCConstantExpr::create (0 , getContext ());
16221625 return X86Operand::CreateMem (getPointerWidth (), /* SegReg=*/ 0 , Disp,
16231626 /* BaseReg=*/ Basereg, /* IndexReg=*/ 0 , /* Scale=*/ 1 ,
16241627 Loc, Loc, 0 );
16251628}
16261629
1627- bool X86AsmParser::IsSIReg (unsigned Reg) {
1628- switch (Reg) {
1630+ bool X86AsmParser::IsSIReg (MCRegister Reg) {
1631+ switch (Reg. id () ) {
16291632 default : llvm_unreachable (" Only (R|E)SI and (R|E)DI are expected!" );
16301633 case X86::RSI:
16311634 case X86::ESI:
@@ -1638,8 +1641,7 @@ bool X86AsmParser::IsSIReg(unsigned Reg) {
16381641 }
16391642}
16401643
1641- unsigned X86AsmParser::GetSIDIForRegClass (unsigned RegClassID, unsigned Reg,
1642- bool IsSIReg) {
1644+ MCRegister X86AsmParser::GetSIDIForRegClass (unsigned RegClassID, bool IsSIReg) {
16431645 switch (RegClassID) {
16441646 default : llvm_unreachable (" Unexpected register class" );
16451647 case X86::GR64RegClassID:
@@ -1690,8 +1692,8 @@ bool X86AsmParser::VerifyAndAdjustOperands(OperandVector &OrigOperands,
16901692 // Return false and let a normal complaint about bogus operands happen
16911693 return false ;
16921694
1693- unsigned OrigReg = OrigOp.Mem .BaseReg ;
1694- unsigned FinalReg = FinalOp.Mem .BaseReg ;
1695+ MCRegister OrigReg = OrigOp.Mem .BaseReg ;
1696+ MCRegister FinalReg = FinalOp.Mem .BaseReg ;
16951697
16961698 // If we've already encounterd a register class, make sure all register
16971699 // bases are of the same register class
@@ -1713,7 +1715,7 @@ bool X86AsmParser::VerifyAndAdjustOperands(OperandVector &OrigOperands,
17131715 return false ;
17141716
17151717 bool IsSI = IsSIReg (FinalReg);
1716- FinalReg = GetSIDIForRegClass (RegClassID, FinalReg, IsSI);
1718+ FinalReg = GetSIDIForRegClass (RegClassID, IsSI);
17171719
17181720 if (FinalReg != OrigReg) {
17191721 std::string RegName = IsSI ? " ES:(R|E)SI" : " ES:(R|E)DI" ;
@@ -1753,13 +1755,11 @@ bool X86AsmParser::parseOperand(OperandVector &Operands, StringRef Name) {
17531755 return parseATTOperand (Operands);
17541756}
17551757
1756- bool X86AsmParser::CreateMemForMSInlineAsm (unsigned SegReg, const MCExpr *Disp,
1757- unsigned BaseReg, unsigned IndexReg,
1758- unsigned Scale, bool NonAbsMem,
1759- SMLoc Start, SMLoc End,
1760- unsigned Size, StringRef Identifier,
1761- const InlineAsmIdentifierInfo &Info,
1762- OperandVector &Operands) {
1758+ bool X86AsmParser::CreateMemForMSInlineAsm (
1759+ MCRegister SegReg, const MCExpr *Disp, MCRegister BaseReg,
1760+ MCRegister IndexReg, unsigned Scale, bool NonAbsMem, SMLoc Start, SMLoc End,
1761+ unsigned Size, StringRef Identifier, const InlineAsmIdentifierInfo &Info,
1762+ OperandVector &Operands) {
17631763 // If we found a decl other than a VarDecl, then assume it is a FuncDecl or
17641764 // some other label reference.
17651765 if (Info.isKind (InlineAsmIdentifierInfo::IK_Label)) {
@@ -2651,10 +2651,10 @@ bool X86AsmParser::parseIntelOperand(OperandVector &Operands, StringRef Name) {
26512651 }
26522652
26532653 StringRef ErrMsg;
2654- unsigned BaseReg = SM.getBaseReg ();
2655- unsigned IndexReg = SM.getIndexReg ();
2654+ MCRegister BaseReg = SM.getBaseReg ();
2655+ MCRegister IndexReg = SM.getIndexReg ();
26562656 if (IndexReg && BaseReg == X86::RIP)
2657- BaseReg = 0 ;
2657+ BaseReg = MCRegister () ;
26582658 unsigned Scale = SM.getScale ();
26592659 if (!PtrInOperand)
26602660 Size = SM.getElementSize () << 3 ;
@@ -2703,7 +2703,7 @@ bool X86AsmParser::parseIntelOperand(OperandVector &Operands, StringRef Name) {
27032703
27042704 // When parsing x64 MS-style assembly, all non-absolute references to a named
27052705 // variable default to RIP-relative.
2706- unsigned DefaultBaseReg = X86::NoRegister ;
2706+ MCRegister DefaultBaseReg;
27072707 bool MaybeDirectBranchDest = true ;
27082708
27092709 if (Parser.isParsingMasm ()) {
@@ -2738,7 +2738,7 @@ bool X86AsmParser::parseIntelOperand(OperandVector &Operands, StringRef Name) {
27382738 MaybeDirectBranchDest = false ;
27392739 }
27402740
2741- if ((BaseReg || IndexReg || RegNo || DefaultBaseReg != X86::NoRegister ))
2741+ if ((BaseReg || IndexReg || RegNo || DefaultBaseReg))
27422742 Operands.push_back (X86Operand::CreateMem (
27432743 getPointerWidth (), RegNo, Disp, BaseReg, IndexReg, Scale, Start, End,
27442744 Size, DefaultBaseReg, /* SymName=*/ StringRef (), /* OpDecl=*/ nullptr ,
@@ -2782,7 +2782,7 @@ bool X86AsmParser::parseATTOperand(OperandVector &Operands) {
27822782
27832783 SMLoc Loc = Parser.getTok ().getLoc (), EndLoc;
27842784 const MCExpr *Expr = nullptr ;
2785- unsigned Reg = 0 ;
2785+ MCRegister Reg;
27862786 if (getLexer ().isNot (AsmToken::LParen)) {
27872787 // No '(' so this is either a displacement expression or a register.
27882788 if (Parser.parseExpression (Expr, EndLoc))
@@ -2954,7 +2954,7 @@ bool X86AsmParser::HandleAVX512Operand(OperandVector &Operands) {
29542954
29552955// / ParseMemOperand: 'seg : disp(basereg, indexreg, scale)'. The '%ds:' prefix
29562956// / has already been parsed if present. disp may be provided as well.
2957- bool X86AsmParser::ParseMemOperand (unsigned SegReg, const MCExpr *Disp,
2957+ bool X86AsmParser::ParseMemOperand (MCRegister SegReg, const MCExpr *Disp,
29582958 SMLoc StartLoc, SMLoc EndLoc,
29592959 OperandVector &Operands) {
29602960 MCAsmParser &Parser = getParser ();
@@ -3041,7 +3041,8 @@ bool X86AsmParser::ParseMemOperand(unsigned SegReg, const MCExpr *Disp,
30413041
30423042 // If we reached here, then eat the '(' and Process
30433043 // the rest of the memory operand.
3044- unsigned BaseReg = 0 , IndexReg = 0 , Scale = 1 ;
3044+ MCRegister BaseReg, IndexReg;
3045+ unsigned Scale = 1 ;
30453046 SMLoc BaseLoc = getLexer ().getLoc ();
30463047 const MCExpr *E;
30473048 StringRef ErrMsg;
@@ -3888,14 +3889,14 @@ bool X86AsmParser::validateInstruction(MCInst &Inst, const OperandVector &Ops) {
38883889 uint64_t TSFlags = MII.get (Opcode).TSFlags ;
38893890 if (isVFCMADDCPH (Opcode) || isVFCMADDCSH (Opcode) || isVFMADDCPH (Opcode) ||
38903891 isVFMADDCSH (Opcode)) {
3891- unsigned Dest = Inst.getOperand (0 ).getReg ();
3892+ MCRegister Dest = Inst.getOperand (0 ).getReg ();
38923893 for (unsigned i = 2 ; i < Inst.getNumOperands (); i++)
38933894 if (Inst.getOperand (i).isReg () && Dest == Inst.getOperand (i).getReg ())
38943895 return Warning (Ops[0 ]->getStartLoc (), " Destination register should be "
38953896 " distinct from source registers" );
38963897 } else if (isVFCMULCPH (Opcode) || isVFCMULCSH (Opcode) || isVFMULCPH (Opcode) ||
38973898 isVFMULCSH (Opcode)) {
3898- unsigned Dest = Inst.getOperand (0 ).getReg ();
3899+ MCRegister Dest = Inst.getOperand (0 ).getReg ();
38993900 // The mask variants have different operand list. Scan from the third
39003901 // operand to avoid emitting incorrect warning.
39013902 // VFMULCPHZrr Dest, Src1, Src2
@@ -3909,8 +3910,9 @@ bool X86AsmParser::validateInstruction(MCInst &Inst, const OperandVector &Ops) {
39093910 } else if (isV4FMADDPS (Opcode) || isV4FMADDSS (Opcode) ||
39103911 isV4FNMADDPS (Opcode) || isV4FNMADDSS (Opcode) ||
39113912 isVP4DPWSSDS (Opcode) || isVP4DPWSSD (Opcode)) {
3912- unsigned Src2 = Inst.getOperand (Inst.getNumOperands () -
3913- X86::AddrNumOperands - 1 ).getReg ();
3913+ MCRegister Src2 =
3914+ Inst.getOperand (Inst.getNumOperands () - X86::AddrNumOperands - 1 )
3915+ .getReg ();
39143916 unsigned Src2Enc = MRI->getEncodingValue (Src2);
39153917 if (Src2Enc % 4 != 0 ) {
39163918 StringRef RegName = X86IntelInstPrinter::getRegisterName (Src2);
@@ -3946,32 +3948,32 @@ bool X86AsmParser::validateInstruction(MCInst &Inst, const OperandVector &Ops) {
39463948 } else if (isTCMMIMFP16PS (Opcode) || isTCMMRLFP16PS (Opcode) ||
39473949 isTDPBF16PS (Opcode) || isTDPFP16PS (Opcode) || isTDPBSSD (Opcode) ||
39483950 isTDPBSUD (Opcode) || isTDPBUSD (Opcode) || isTDPBUUD (Opcode)) {
3949- unsigned SrcDest = Inst.getOperand (0 ).getReg ();
3950- unsigned Src1 = Inst.getOperand (2 ).getReg ();
3951- unsigned Src2 = Inst.getOperand (3 ).getReg ();
3951+ MCRegister SrcDest = Inst.getOperand (0 ).getReg ();
3952+ MCRegister Src1 = Inst.getOperand (2 ).getReg ();
3953+ MCRegister Src2 = Inst.getOperand (3 ).getReg ();
39523954 if (SrcDest == Src1 || SrcDest == Src2 || Src1 == Src2)
39533955 return Error (Ops[0 ]->getStartLoc (), " all tmm registers must be distinct" );
39543956 }
39553957
39563958 // Check that we aren't mixing AH/BH/CH/DH with REX prefix. We only need to
39573959 // check this with the legacy encoding, VEX/EVEX/XOP don't use REX.
39583960 if ((TSFlags & X86II::EncodingMask) == 0 ) {
3959- MCPhysReg HReg = X86::NoRegister ;
3961+ MCRegister HReg;
39603962 bool UsesRex = TSFlags & X86II::REX_W;
39613963 unsigned NumOps = Inst.getNumOperands ();
39623964 for (unsigned i = 0 ; i != NumOps; ++i) {
39633965 const MCOperand &MO = Inst.getOperand (i);
39643966 if (!MO.isReg ())
39653967 continue ;
3966- unsigned Reg = MO.getReg ();
3968+ MCRegister Reg = MO.getReg ();
39673969 if (Reg == X86::AH || Reg == X86::BH || Reg == X86::CH || Reg == X86::DH)
39683970 HReg = Reg;
39693971 if (X86II::isX86_64NonExtLowByteReg (Reg) ||
39703972 X86II::isX86_64ExtendedReg (Reg))
39713973 UsesRex = true ;
39723974 }
39733975
3974- if (UsesRex && HReg != X86::NoRegister ) {
3976+ if (UsesRex && HReg) {
39753977 StringRef RegName = X86IntelInstPrinter::getRegisterName (HReg);
39763978 return Error (Ops[0 ]->getStartLoc (),
39773979 " can't encode '" + RegName + " ' in an instruction requiring "
@@ -4022,7 +4024,7 @@ void X86AsmParser::applyLVICFIMitigation(MCInst &Inst, MCStreamer &Out) {
40224024 case X86::RETI64: {
40234025 MCInst ShlInst, FenceInst;
40244026 bool Parse32 = is32BitMode () || Code16GCC;
4025- unsigned Basereg =
4027+ MCRegister Basereg =
40264028 is64BitMode () ? X86::RSP : (Parse32 ? X86::ESP : X86::SP);
40274029 const MCExpr *Disp = MCConstantExpr::create (0 , getContext ());
40284030 auto ShlMemOp = X86Operand::CreateMem (getPointerWidth (), /* SegReg=*/ 0 , Disp,
0 commit comments