@@ -91,6 +91,8 @@ class SparcAsmParser : public MCTargetAsmParser {
91
91
92
92
ParseStatus parseASITag (OperandVector &Operands);
93
93
94
+ ParseStatus parsePrefetchTag (OperandVector &Operands);
95
+
94
96
template <TailRelocKind Kind>
95
97
ParseStatus parseTailRelocSym (OperandVector &Operands);
96
98
@@ -209,7 +211,8 @@ class SparcOperand : public MCParsedAsmOperand {
209
211
k_Immediate,
210
212
k_MemoryReg,
211
213
k_MemoryImm,
212
- k_ASITag
214
+ k_ASITag,
215
+ k_PrefetchTag,
213
216
} Kind;
214
217
215
218
SMLoc StartLoc, EndLoc;
@@ -240,6 +243,7 @@ class SparcOperand : public MCParsedAsmOperand {
240
243
struct ImmOp Imm;
241
244
struct MemOp Mem;
242
245
unsigned ASI;
246
+ unsigned Prefetch;
243
247
};
244
248
245
249
public:
@@ -253,6 +257,7 @@ class SparcOperand : public MCParsedAsmOperand {
253
257
bool isMEMri () const { return Kind == k_MemoryImm; }
254
258
bool isMembarTag () const { return Kind == k_Immediate; }
255
259
bool isASITag () const { return Kind == k_ASITag; }
260
+ bool isPrefetchTag () const { return Kind == k_PrefetchTag; }
256
261
bool isTailRelocSym () const { return Kind == k_Immediate; }
257
262
258
263
bool isCallTarget () const {
@@ -337,6 +342,11 @@ class SparcOperand : public MCParsedAsmOperand {
337
342
return ASI;
338
343
}
339
344
345
+ unsigned getPrefetchTag () const {
346
+ assert ((Kind == k_PrefetchTag) && " Invalid access!" );
347
+ return Prefetch;
348
+ }
349
+
340
350
// / getStartLoc - Get the location of the first token of this operand.
341
351
SMLoc getStartLoc () const override {
342
352
return StartLoc;
@@ -360,6 +370,9 @@ class SparcOperand : public MCParsedAsmOperand {
360
370
case k_ASITag:
361
371
OS << " ASI tag: " << getASITag () << " \n " ;
362
372
break ;
373
+ case k_PrefetchTag:
374
+ OS << " Prefetch tag: " << getPrefetchTag () << " \n " ;
375
+ break ;
363
376
}
364
377
}
365
378
@@ -416,6 +429,11 @@ class SparcOperand : public MCParsedAsmOperand {
416
429
Inst.addOperand (MCOperand::createImm (getASITag ()));
417
430
}
418
431
432
+ void addPrefetchTagOperands (MCInst &Inst, unsigned N) const {
433
+ assert (N == 1 && " Invalid number of operands!" );
434
+ Inst.addOperand (MCOperand::createImm (getPrefetchTag ()));
435
+ }
436
+
419
437
void addMembarTagOperands (MCInst &Inst, unsigned N) const {
420
438
assert (N == 1 && " Invalid number of operands!" );
421
439
const MCExpr *Expr = getImm ();
@@ -469,6 +487,15 @@ class SparcOperand : public MCParsedAsmOperand {
469
487
return Op;
470
488
}
471
489
490
+ static std::unique_ptr<SparcOperand> CreatePrefetchTag (unsigned Val, SMLoc S,
491
+ SMLoc E) {
492
+ auto Op = std::make_unique<SparcOperand>(k_PrefetchTag);
493
+ Op->Prefetch = Val;
494
+ Op->StartLoc = S;
495
+ Op->EndLoc = E;
496
+ return Op;
497
+ }
498
+
472
499
static bool MorphToIntPairReg (SparcOperand &Op) {
473
500
unsigned Reg = Op.getReg ();
474
501
assert (Op.Reg .Kind == rk_IntReg);
@@ -1088,6 +1115,44 @@ ParseStatus SparcAsmParser::parseASITag(OperandVector &Operands) {
1088
1115
return ParseStatus::Success;
1089
1116
}
1090
1117
1118
+ ParseStatus SparcAsmParser::parsePrefetchTag (OperandVector &Operands) {
1119
+ SMLoc S = Parser.getTok ().getLoc ();
1120
+ SMLoc E = Parser.getTok ().getEndLoc ();
1121
+ int64_t PrefetchVal = 0 ;
1122
+
1123
+ switch (getLexer ().getKind ()) {
1124
+ case AsmToken::LParen:
1125
+ case AsmToken::Integer:
1126
+ case AsmToken::Identifier:
1127
+ case AsmToken::Plus:
1128
+ case AsmToken::Minus:
1129
+ case AsmToken::Tilde:
1130
+ if (getParser ().parseAbsoluteExpression (PrefetchVal) ||
1131
+ !isUInt<5 >(PrefetchVal))
1132
+ return Error (S, " invalid prefetch number, must be between 0 and 31" );
1133
+ break ;
1134
+ case AsmToken::Hash: {
1135
+ SMLoc TagStart = getLexer ().peekTok (false ).getLoc ();
1136
+ Parser.Lex (); // Eat the '#'.
1137
+ const StringRef PrefetchName = Parser.getTok ().getString ();
1138
+ const SparcPrefetchTag::PrefetchTag *PrefetchTag =
1139
+ SparcPrefetchTag::lookupPrefetchTagByName (PrefetchName);
1140
+ Parser.Lex (); // Eat the identifier token.
1141
+
1142
+ if (!PrefetchTag)
1143
+ return Error (TagStart, " unknown prefetch tag" );
1144
+
1145
+ PrefetchVal = PrefetchTag->Encoding ;
1146
+ break ;
1147
+ }
1148
+ default :
1149
+ return ParseStatus::NoMatch;
1150
+ }
1151
+
1152
+ Operands.push_back (SparcOperand::CreatePrefetchTag (PrefetchVal, S, E));
1153
+ return ParseStatus::Success;
1154
+ }
1155
+
1091
1156
ParseStatus SparcAsmParser::parseCallTarget (OperandVector &Operands) {
1092
1157
SMLoc S = Parser.getTok ().getLoc ();
1093
1158
SMLoc E = SMLoc::getFromPointer (S.getPointer () - 1 );
0 commit comments