@@ -266,6 +266,7 @@ class AArch64AsmParser : public MCTargetAsmParser {
266266 ParseStatus tryParseRPRFMOperand (OperandVector &Operands);
267267 ParseStatus tryParsePSBHint (OperandVector &Operands);
268268 ParseStatus tryParseBTIHint (OperandVector &Operands);
269+ ParseStatus tryParseCMHPriorityHint (OperandVector &Operands);
269270 ParseStatus tryParseAdrpLabel (OperandVector &Operands);
270271 ParseStatus tryParseAdrLabel (OperandVector &Operands);
271272 template <bool AddFPZeroAsLiteral>
@@ -370,6 +371,7 @@ class AArch64Operand : public MCParsedAsmOperand {
370371 k_PSBHint,
371372 k_PHint,
372373 k_BTIHint,
374+ k_CMHPriorityHint,
373375 } Kind;
374376
375377 SMLoc StartLoc, EndLoc;
@@ -499,6 +501,11 @@ class AArch64Operand : public MCParsedAsmOperand {
499501 unsigned Length;
500502 unsigned Val;
501503 };
504+ struct CMHPriorityHintOp {
505+ const char *Data;
506+ unsigned Length;
507+ unsigned Val;
508+ };
502509
503510 struct SVCROp {
504511 const char *Data;
@@ -525,6 +532,7 @@ class AArch64Operand : public MCParsedAsmOperand {
525532 struct PSBHintOp PSBHint;
526533 struct PHintOp PHint;
527534 struct BTIHintOp BTIHint;
535+ struct CMHPriorityHintOp CMHPriorityHint;
528536 struct ShiftExtendOp ShiftExtend;
529537 struct SVCROp SVCR;
530538 };
@@ -595,6 +603,9 @@ class AArch64Operand : public MCParsedAsmOperand {
595603 case k_BTIHint:
596604 BTIHint = o.BTIHint ;
597605 break ;
606+ case k_CMHPriorityHint:
607+ CMHPriorityHint = o.CMHPriorityHint ;
608+ break ;
598609 case k_ShiftExtend:
599610 ShiftExtend = o.ShiftExtend ;
600611 break ;
@@ -769,6 +780,16 @@ class AArch64Operand : public MCParsedAsmOperand {
769780 return StringRef (BTIHint.Data , BTIHint.Length );
770781 }
771782
783+ unsigned getCMHPriorityHint () const {
784+ assert (Kind == k_CMHPriorityHint && " Invalid access!" );
785+ return CMHPriorityHint.Val ;
786+ }
787+
788+ StringRef getCMHPriorityHintName () const {
789+ assert (Kind == k_CMHPriorityHint && " Invalid access!" );
790+ return StringRef (CMHPriorityHint.Data , CMHPriorityHint.Length );
791+ }
792+
772793 StringRef getSVCR () const {
773794 assert (Kind == k_SVCR && " Invalid access!" );
774795 return StringRef (SVCR.Data , SVCR.Length );
@@ -1511,6 +1532,7 @@ class AArch64Operand : public MCParsedAsmOperand {
15111532 bool isPSBHint () const { return Kind == k_PSBHint; }
15121533 bool isPHint () const { return Kind == k_PHint; }
15131534 bool isBTIHint () const { return Kind == k_BTIHint; }
1535+ bool isCMHPriorityHint () const { return Kind == k_CMHPriorityHint; }
15141536 bool isShiftExtend () const { return Kind == k_ShiftExtend; }
15151537 bool isShifter () const {
15161538 if (!isShiftExtend ())
@@ -2196,6 +2218,11 @@ class AArch64Operand : public MCParsedAsmOperand {
21962218 Inst.addOperand (MCOperand::createImm (getBTIHint ()));
21972219 }
21982220
2221+ void addCMHPriorityHintOperands (MCInst &Inst, unsigned N) const {
2222+ assert (N == 1 && " Invalid number of operands!" );
2223+ Inst.addOperand (MCOperand::createImm (getCMHPriorityHint ()));
2224+ }
2225+
21992226 void addShifterOperands (MCInst &Inst, unsigned N) const {
22002227 assert (N == 1 && " Invalid number of operands!" );
22012228 unsigned Imm =
@@ -2546,6 +2573,17 @@ class AArch64Operand : public MCParsedAsmOperand {
25462573 return Op;
25472574 }
25482575
2576+ static std::unique_ptr<AArch64Operand>
2577+ CreateCMHPriorityHint (unsigned Val, StringRef Str, SMLoc S, MCContext &Ctx) {
2578+ auto Op = std::make_unique<AArch64Operand>(k_CMHPriorityHint, Ctx);
2579+ Op->CMHPriorityHint .Val = Val;
2580+ Op->CMHPriorityHint .Data = Str.data ();
2581+ Op->CMHPriorityHint .Length = Str.size ();
2582+ Op->StartLoc = S;
2583+ Op->EndLoc = S;
2584+ return Op;
2585+ }
2586+
25492587 static std::unique_ptr<AArch64Operand>
25502588 CreateMatrixRegister (unsigned RegNum, unsigned ElementWidth, MatrixKind Kind,
25512589 SMLoc S, SMLoc E, MCContext &Ctx) {
@@ -2656,6 +2694,9 @@ void AArch64Operand::print(raw_ostream &OS, const MCAsmInfo &MAI) const {
26562694 case k_BTIHint:
26572695 OS << getBTIHintName ();
26582696 break ;
2697+ case k_CMHPriorityHint:
2698+ OS << getCMHPriorityHintName ();
2699+ break ;
26592700 case k_MatrixRegister:
26602701 OS << " <matrix " << getMatrixReg () << " >" ;
26612702 break ;
@@ -3279,6 +3320,24 @@ ParseStatus AArch64AsmParser::tryParseBTIHint(OperandVector &Operands) {
32793320 return ParseStatus::Success;
32803321}
32813322
3323+ // / tryParseCMHPriorityHint - Try to parse a CMHPriority operand
3324+ ParseStatus AArch64AsmParser::tryParseCMHPriorityHint (OperandVector &Operands) {
3325+ SMLoc S = getLoc ();
3326+ const AsmToken &Tok = getTok ();
3327+ if (Tok.isNot (AsmToken::Identifier))
3328+ return TokError (" invalid operand for instruction" );
3329+
3330+ auto CMHPriority =
3331+ AArch64CMHPriorityHint::lookupCMHPriorityHintByName (Tok.getString ());
3332+ if (!CMHPriority)
3333+ return TokError (" invalid operand for instruction" );
3334+
3335+ Operands.push_back (AArch64Operand::CreateCMHPriorityHint (
3336+ CMHPriority->Encoding , Tok.getString (), S, getContext ()));
3337+ Lex (); // Eat identifier token.
3338+ return ParseStatus::Success;
3339+ }
3340+
32823341// / tryParseAdrpLabel - Parse and validate a source label for the ADRP
32833342// / instruction.
32843343ParseStatus AArch64AsmParser::tryParseAdrpLabel (OperandVector &Operands) {
@@ -3824,6 +3883,8 @@ static const struct Extension {
38243883 {" ssve-bitperm" , {AArch64::FeatureSSVE_BitPerm}},
38253884 {" sme-mop4" , {AArch64::FeatureSME_MOP4}},
38263885 {" sme-tmop" , {AArch64::FeatureSME_TMOP}},
3886+ {" cmh" , {AArch64::FeatureCMH}},
3887+ {" lscp" , {AArch64::FeatureLSCP}},
38273888};
38283889
38293890static void setRequiredFeatureString (FeatureBitset FBS, std::string &Str) {
0 commit comments