@@ -73,6 +73,7 @@ class XtensaAsmParser : public MCTargetAsmParser {
73
73
SMLoc &EndLoc) override {
74
74
return ParseStatus::NoMatch;
75
75
}
76
+
76
77
ParseStatus parsePCRelTarget (OperandVector &Operands);
77
78
bool parseLiteralDirective (SMLoc L);
78
79
@@ -89,6 +90,10 @@ class XtensaAsmParser : public MCTargetAsmParser {
89
90
: MCTargetAsmParser(Options, STI, MII) {
90
91
setAvailableFeatures (ComputeAvailableFeatures (STI.getFeatureBits ()));
91
92
}
93
+
94
+ bool hasWindowed () const {
95
+ return getSTI ().getFeatureBits ()[Xtensa::FeatureWindowed];
96
+ };
92
97
};
93
98
94
99
// Return true if Expr is in the range [MinValue, MaxValue].
@@ -181,6 +186,11 @@ struct XtensaOperand : public MCParsedAsmOperand {
181
186
((cast<MCConstantExpr>(getImm ())->getValue () & 0x3 ) == 0 );
182
187
}
183
188
189
+ bool isentry_imm12 () const {
190
+ return isImm (0 , 32760 ) &&
191
+ ((cast<MCConstantExpr>(getImm ())->getValue () % 8 ) == 0 );
192
+ }
193
+
184
194
bool isUimm4 () const { return isImm (0 , 15 ); }
185
195
186
196
bool isUimm5 () const { return isImm (0 , 31 ); }
@@ -198,6 +208,11 @@ struct XtensaOperand : public MCParsedAsmOperand {
198
208
199
209
bool isImm32n_95 () const { return isImm (-32 , 95 ); }
200
210
211
+ bool isImm64n_4n () const {
212
+ return isImm (-64 , -4 ) &&
213
+ ((cast<MCConstantExpr>(getImm ())->getValue () & 0x3 ) == 0 );
214
+ }
215
+
201
216
bool isB4const () const {
202
217
if (Kind != Immediate)
203
218
return false ;
@@ -491,6 +506,12 @@ bool XtensaAsmParser::matchAndEmitInstruction(SMLoc IDLoc, unsigned &Opcode,
491
506
case Match_InvalidImm32n_95:
492
507
return Error (RefineErrorLoc (IDLoc, Operands, ErrorInfo),
493
508
" 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]" );
494
515
case Match_InvalidShimm1_31:
495
516
return Error (RefineErrorLoc (IDLoc, Operands, ErrorInfo),
496
517
" expected immediate in range [1, 31]" );
@@ -515,6 +536,10 @@ bool XtensaAsmParser::matchAndEmitInstruction(SMLoc IDLoc, unsigned &Opcode,
515
536
return Error (RefineErrorLoc (IDLoc, Operands, ErrorInfo),
516
537
" expected immediate in range [0, 60], first 2 bits "
517
538
" 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" );
518
543
}
519
544
520
545
report_fatal_error (" Unknown match type detected!" );
@@ -601,6 +626,10 @@ ParseStatus XtensaAsmParser::parseRegister(OperandVector &Operands,
601
626
getLexer ().UnLex (Buf[0 ]);
602
627
return ParseStatus::NoMatch;
603
628
}
629
+
630
+ if (!Xtensa::checkRegister (RegNo, getSTI ().getFeatureBits ()))
631
+ return ParseStatus::NoMatch;
632
+
604
633
if (HadParens)
605
634
Operands.push_back (XtensaOperand::createToken (" (" , FirstS));
606
635
SMLoc S = getLoc ();
@@ -702,7 +731,7 @@ bool XtensaAsmParser::ParseInstructionWithSR(ParseInstructionInfo &Info,
702
731
if (RegNo == 0 )
703
732
RegNo = MatchRegisterAltName (RegName);
704
733
705
- if (RegNo == 0 )
734
+ if (! Xtensa::checkRegister ( RegNo, getSTI (). getFeatureBits ()) )
706
735
return Error (NameLoc, " invalid register name" );
707
736
708
737
// Parse operand
0 commit comments