Skip to content

Commit a3ea018

Browse files
authored
[X86] Use MCRegister in X86AsmParser. (#108509)
1 parent 69a2115 commit a3ea018

File tree

1 file changed

+57
-55
lines changed

1 file changed

+57
-55
lines changed

llvm/lib/Target/X86/AsmParser/X86AsmParser.cpp

Lines changed: 57 additions & 55 deletions
Original file line numberDiff line numberDiff line change
@@ -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

16091610
std::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

16181620
std::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

Comments
 (0)