@@ -55,6 +55,8 @@ class AMDGPUAsmParser;
55
55
56
56
enum RegisterKind { IS_UNKNOWN, IS_VGPR, IS_SGPR, IS_AGPR, IS_TTMP, IS_SPECIAL };
57
57
58
+ enum class LitModifier { None, Lit, Lit64 };
59
+
58
60
// ===----------------------------------------------------------------------===//
59
61
// Operand
60
62
// ===----------------------------------------------------------------------===//
@@ -80,8 +82,7 @@ class AMDGPUOperand : public MCParsedAsmOperand {
80
82
bool Abs = false ;
81
83
bool Neg = false ;
82
84
bool Sext = false ;
83
- bool Lit = false ;
84
- bool Lit64 = false ;
85
+ LitModifier Lit = LitModifier::None;
85
86
86
87
bool hasFPModifiers () const { return Abs || Neg; }
87
88
bool hasIntModifiers () const { return Sext; }
@@ -1675,10 +1676,10 @@ class AMDGPUAsmParser : public MCTargetAsmParser {
1675
1676
bool isOpcodeModifierWithVal (const AsmToken &Token, const AsmToken &NextToken) const ;
1676
1677
bool parseSP3NegModifier ();
1677
1678
ParseStatus parseImm (OperandVector &Operands, bool HasSP3AbsModifier = false ,
1678
- bool HasLit = false , bool HasLit64 = false );
1679
+ LitModifier Lit = LitModifier::None );
1679
1680
ParseStatus parseReg (OperandVector &Operands);
1680
1681
ParseStatus parseRegOrImm (OperandVector &Operands, bool HasSP3AbsMod = false ,
1681
- bool HasLit = false , bool HasLit64 = false );
1682
+ LitModifier Lit = LitModifier::None );
1682
1683
ParseStatus parseRegOrImmWithFPInputMods (OperandVector &Operands,
1683
1684
bool AllowImm = true );
1684
1685
ParseStatus parseRegOrImmWithIntInputMods (OperandVector &Operands,
@@ -2437,7 +2438,8 @@ void AMDGPUOperand::addLiteralImmOperand(MCInst &Inst, int64_t Val, bool ApplyMo
2437
2438
// truncated to uint32_t), if the target doesn't support 64-bit literals, or
2438
2439
// the lit modifier is explicitly used, we need to truncate it to the 32
2439
2440
// LSBs.
2440
- if (!AsmParser->has64BitLiterals () || getModifiers ().Lit )
2441
+ if (!AsmParser->has64BitLiterals () ||
2442
+ getModifiers ().Lit == LitModifier::Lit)
2441
2443
Val = Lo_32 (Val);
2442
2444
2443
2445
Inst.addOperand (MCOperand::createImm (Val));
@@ -2461,8 +2463,9 @@ void AMDGPUOperand::addLiteralImmOperand(MCInst &Inst, int64_t Val, bool ApplyMo
2461
2463
// 1) explicitly forced by using lit modifier;
2462
2464
// 2) the value is a valid 32-bit representation (signed or unsigned),
2463
2465
// meanwhile not forced by lit64 modifier.
2464
- if (getModifiers ().Lit ||
2465
- (!getModifiers ().Lit64 && (isInt<32 >(Val) || isUInt<32 >(Val))))
2466
+ if (getModifiers ().Lit == LitModifier::Lit ||
2467
+ (getModifiers ().Lit != LitModifier::Lit64 &&
2468
+ (isInt<32 >(Val) || isUInt<32 >(Val))))
2466
2469
Val = static_cast <uint64_t >(Val) << 32 ;
2467
2470
}
2468
2471
@@ -2484,7 +2487,8 @@ void AMDGPUOperand::addLiteralImmOperand(MCInst &Inst, int64_t Val, bool ApplyMo
2484
2487
return ;
2485
2488
2486
2489
case AMDGPU::OPERAND_KIMM64:
2487
- if ((isInt<32 >(Val) || isUInt<32 >(Val)) && !getModifiers ().Lit64 )
2490
+ if ((isInt<32 >(Val) || isUInt<32 >(Val)) &&
2491
+ getModifiers ().Lit != LitModifier::Lit64)
2488
2492
Val <<= 32 ;
2489
2493
2490
2494
Inst.addOperand (MCOperand::createImm (Val));
@@ -3167,20 +3171,22 @@ AMDGPUAsmParser::parseRegister(bool RestoreOnFailure) {
3167
3171
}
3168
3172
3169
3173
ParseStatus AMDGPUAsmParser::parseImm (OperandVector &Operands,
3170
- bool HasSP3AbsModifier, bool HasLit,
3171
- bool HasLit64) {
3174
+ bool HasSP3AbsModifier, LitModifier Lit) {
3172
3175
// TODO: add syntactic sugar for 1/(2*PI)
3173
3176
3174
3177
if (isRegister () || isModifier ())
3175
3178
return ParseStatus::NoMatch;
3176
3179
3177
- if (!HasLit && !HasLit64) {
3178
- HasLit64 = trySkipId (" lit64" );
3179
- HasLit = !HasLit64 && trySkipId (" lit" );
3180
- if (HasLit || HasLit64) {
3180
+ if (Lit == LitModifier::None) {
3181
+ if (trySkipId (" lit" ))
3182
+ Lit = LitModifier::Lit;
3183
+ else if (trySkipId (" lit64" ))
3184
+ Lit = LitModifier::Lit64;
3185
+
3186
+ if (Lit != LitModifier::None) {
3181
3187
if (!skipToken (AsmToken::LParen, " expected left paren after lit" ))
3182
3188
return ParseStatus::Failure;
3183
- ParseStatus S = parseImm (Operands, HasSP3AbsModifier, HasLit, HasLit64 );
3189
+ ParseStatus S = parseImm (Operands, HasSP3AbsModifier, Lit );
3184
3190
if (S.isSuccess () &&
3185
3191
!skipToken (AsmToken::RParen, " expected closing parentheses" ))
3186
3192
return ParseStatus::Failure;
@@ -3201,8 +3207,7 @@ ParseStatus AMDGPUAsmParser::parseImm(OperandVector &Operands,
3201
3207
}
3202
3208
3203
3209
AMDGPUOperand::Modifiers Mods;
3204
- Mods.Lit = HasLit;
3205
- Mods.Lit64 = HasLit64;
3210
+ Mods.Lit = Lit;
3206
3211
3207
3212
if (IsReal) {
3208
3213
// Floating-point expressions are not supported.
@@ -3253,7 +3258,7 @@ ParseStatus AMDGPUAsmParser::parseImm(OperandVector &Operands,
3253
3258
AMDGPUOperand &Op = static_cast <AMDGPUOperand &>(*Operands.back ());
3254
3259
Op.setModifiers (Mods);
3255
3260
} else {
3256
- if (HasLit || HasLit64 )
3261
+ if (Lit != LitModifier::None )
3257
3262
return ParseStatus::NoMatch;
3258
3263
Operands.push_back (AMDGPUOperand::CreateExpr (this , Expr, S));
3259
3264
}
@@ -3277,14 +3282,13 @@ ParseStatus AMDGPUAsmParser::parseReg(OperandVector &Operands) {
3277
3282
}
3278
3283
3279
3284
ParseStatus AMDGPUAsmParser::parseRegOrImm (OperandVector &Operands,
3280
- bool HasSP3AbsMod, bool HasLit,
3281
- bool HasLit64) {
3285
+ bool HasSP3AbsMod, LitModifier Lit) {
3282
3286
ParseStatus Res = parseReg (Operands);
3283
3287
if (!Res.isNoMatch ())
3284
3288
return Res;
3285
3289
if (isModifier ())
3286
3290
return ParseStatus::NoMatch;
3287
- return parseImm (Operands, HasSP3AbsMod, HasLit, HasLit64 );
3291
+ return parseImm (Operands, HasSP3AbsMod, Lit );
3288
3292
}
3289
3293
3290
3294
bool
@@ -3380,7 +3384,6 @@ AMDGPUAsmParser::parseRegOrImmWithFPInputMods(OperandVector &Operands,
3380
3384
bool AllowImm) {
3381
3385
bool Neg, SP3Neg;
3382
3386
bool Abs, SP3Abs;
3383
- bool Lit64, Lit;
3384
3387
SMLoc Loc;
3385
3388
3386
3389
// Disable ambiguous constructs like '--1' etc. Should use neg(-1) instead.
@@ -3400,35 +3403,36 @@ AMDGPUAsmParser::parseRegOrImmWithFPInputMods(OperandVector &Operands,
3400
3403
if (Abs && !skipToken (AsmToken::LParen, " expected left paren after abs" ))
3401
3404
return ParseStatus::Failure;
3402
3405
3403
- Lit64 = trySkipId (" lit64" );
3404
- if (Lit64) {
3406
+ LitModifier Lit = LitModifier::None;
3407
+ if (trySkipId (" lit" )) {
3408
+ Lit = LitModifier::Lit;
3409
+ if (!skipToken (AsmToken::LParen, " expected left paren after lit" ))
3410
+ return ParseStatus::Failure;
3411
+ } else if (trySkipId (" lit64" )) {
3412
+ Lit = LitModifier::Lit64;
3405
3413
if (!skipToken (AsmToken::LParen, " expected left paren after lit64" ))
3406
3414
return ParseStatus::Failure;
3407
3415
if (!has64BitLiterals ())
3408
3416
return Error (Loc, " lit64 is not supported on this GPU" );
3409
3417
}
3410
3418
3411
- Lit = !Lit64 && trySkipId (" lit" );
3412
- if (Lit && !skipToken (AsmToken::LParen, " expected left paren after lit" ))
3413
- return ParseStatus::Failure;
3414
-
3415
3419
Loc = getLoc ();
3416
3420
SP3Abs = trySkipToken (AsmToken::Pipe);
3417
3421
if (Abs && SP3Abs)
3418
3422
return Error (Loc, " expected register or immediate" );
3419
3423
3420
3424
ParseStatus Res;
3421
3425
if (AllowImm) {
3422
- Res = parseRegOrImm (Operands, SP3Abs, Lit, Lit64 );
3426
+ Res = parseRegOrImm (Operands, SP3Abs, Lit);
3423
3427
} else {
3424
3428
Res = parseReg (Operands);
3425
3429
}
3426
3430
if (!Res.isSuccess ())
3427
- return (SP3Neg || Neg || SP3Abs || Abs || Lit || Lit64 )
3431
+ return (SP3Neg || Neg || SP3Abs || Abs || Lit != LitModifier::None )
3428
3432
? ParseStatus::Failure
3429
3433
: Res;
3430
3434
3431
- if (( Lit || Lit64) && !Operands.back ()->isImm ())
3435
+ if (Lit != LitModifier::None && !Operands.back ()->isImm ())
3432
3436
Error (Loc, " expected immediate with lit modifier" );
3433
3437
3434
3438
if (SP3Abs && !skipToken (AsmToken::Pipe, " expected vertical bar" ))
@@ -3437,17 +3441,16 @@ AMDGPUAsmParser::parseRegOrImmWithFPInputMods(OperandVector &Operands,
3437
3441
return ParseStatus::Failure;
3438
3442
if (Neg && !skipToken (AsmToken::RParen, " expected closing parentheses" ))
3439
3443
return ParseStatus::Failure;
3440
- if (( Lit || Lit64) &&
3444
+ if (Lit != LitModifier::None &&
3441
3445
!skipToken (AsmToken::RParen, " expected closing parentheses" ))
3442
3446
return ParseStatus::Failure;
3443
3447
3444
3448
AMDGPUOperand::Modifiers Mods;
3445
3449
Mods.Abs = Abs || SP3Abs;
3446
3450
Mods.Neg = Neg || SP3Neg;
3447
3451
Mods.Lit = Lit;
3448
- Mods.Lit64 = Lit64;
3449
3452
3450
- if (Mods.hasFPModifiers () || Lit || Lit64 ) {
3453
+ if (Mods.hasFPModifiers () || Lit != LitModifier::None ) {
3451
3454
AMDGPUOperand &Op = static_cast <AMDGPUOperand &>(*Operands.back ());
3452
3455
if (Op.isExpr ())
3453
3456
return Error (Op.getStartLoc (), " expected an absolute expression" );
0 commit comments