@@ -73,6 +73,7 @@ class XtensaAsmParser : public MCTargetAsmParser {
7373 SMLoc &EndLoc) override {
7474 return ParseStatus::NoMatch;
7575 }
76+
7677 ParseStatus parsePCRelTarget (OperandVector &Operands);
7778 bool parseLiteralDirective (SMLoc L);
7879
@@ -89,6 +90,10 @@ class XtensaAsmParser : public MCTargetAsmParser {
8990 : MCTargetAsmParser(Options, STI, MII) {
9091 setAvailableFeatures (ComputeAvailableFeatures (STI.getFeatureBits ()));
9192 }
93+
94+ bool hasWindowed () const {
95+ return getSTI ().getFeatureBits ()[Xtensa::FeatureWindowed];
96+ };
9297};
9398
9499// Return true if Expr is in the range [MinValue, MaxValue].
@@ -181,6 +186,11 @@ struct XtensaOperand : public MCParsedAsmOperand {
181186 ((cast<MCConstantExpr>(getImm ())->getValue () & 0x3 ) == 0 );
182187 }
183188
189+ bool isentry_imm12 () const {
190+ return isImm (0 , 32760 ) &&
191+ ((cast<MCConstantExpr>(getImm ())->getValue () % 8 ) == 0 );
192+ }
193+
184194 bool isUimm4 () const { return isImm (0 , 15 ); }
185195
186196 bool isUimm5 () const { return isImm (0 , 31 ); }
@@ -198,6 +208,11 @@ struct XtensaOperand : public MCParsedAsmOperand {
198208
199209 bool isImm32n_95 () const { return isImm (-32 , 95 ); }
200210
211+ bool isImm64n_4n () const {
212+ return isImm (-64 , -4 ) &&
213+ ((cast<MCConstantExpr>(getImm ())->getValue () & 0x3 ) == 0 );
214+ }
215+
201216 bool isB4const () const {
202217 if (Kind != Immediate)
203218 return false ;
@@ -491,6 +506,12 @@ bool XtensaAsmParser::matchAndEmitInstruction(SMLoc IDLoc, unsigned &Opcode,
491506 case Match_InvalidImm32n_95:
492507 return Error (RefineErrorLoc (IDLoc, Operands, ErrorInfo),
493508 " expected immediate in range [-32, 95]" );
509+ case Match_InvalidImm64n_4n:
510+ return Error (RefineErrorLoc (IDLoc, Operands, ErrorInfo),
511+ " expected immediate in range [-64, -4]" );
512+ case Match_InvalidImm8n_7:
513+ return Error (RefineErrorLoc (IDLoc, Operands, ErrorInfo),
514+ " expected immediate in range [-8, 7]" );
494515 case Match_InvalidShimm1_31:
495516 return Error (RefineErrorLoc (IDLoc, Operands, ErrorInfo),
496517 " expected immediate in range [1, 31]" );
@@ -515,6 +536,10 @@ bool XtensaAsmParser::matchAndEmitInstruction(SMLoc IDLoc, unsigned &Opcode,
515536 return Error (RefineErrorLoc (IDLoc, Operands, ErrorInfo),
516537 " expected immediate in range [0, 60], first 2 bits "
517538 " should be zero" );
539+ case Match_Invalidentry_imm12:
540+ return Error (RefineErrorLoc (IDLoc, Operands, ErrorInfo),
541+ " expected immediate in range [0, 32760], first 3 bits "
542+ " should be zero" );
518543 }
519544
520545 report_fatal_error (" Unknown match type detected!" );
@@ -601,6 +626,10 @@ ParseStatus XtensaAsmParser::parseRegister(OperandVector &Operands,
601626 getLexer ().UnLex (Buf[0 ]);
602627 return ParseStatus::NoMatch;
603628 }
629+
630+ if (!Xtensa::checkRegister (RegNo, getSTI ().getFeatureBits ()))
631+ return ParseStatus::NoMatch;
632+
604633 if (HadParens)
605634 Operands.push_back (XtensaOperand::createToken (" (" , FirstS));
606635 SMLoc S = getLoc ();
@@ -702,7 +731,7 @@ bool XtensaAsmParser::ParseInstructionWithSR(ParseInstructionInfo &Info,
702731 if (RegNo == 0 )
703732 RegNo = MatchRegisterAltName (RegName);
704733
705- if (RegNo == 0 )
734+ if (! Xtensa::checkRegister ( RegNo, getSTI (). getFeatureBits ()) )
706735 return Error (NameLoc, " invalid register name" );
707736
708737 // Parse operand
0 commit comments