@@ -1577,9 +1577,11 @@ class AMDGPUAsmParser : public MCTargetAsmParser {
15771577 bool isNamedOperandModifier (const AsmToken &Token, const AsmToken &NextToken) const ;
15781578 bool isOpcodeModifierWithVal (const AsmToken &Token, const AsmToken &NextToken) const ;
15791579 bool parseSP3NegModifier ();
1580- ParseStatus parseImm (OperandVector &Operands, bool HasSP3AbsModifier = false );
1580+ ParseStatus parseImm (OperandVector &Operands, bool HasSP3AbsModifier = false ,
1581+ bool HasLit = false );
15811582 ParseStatus parseReg (OperandVector &Operands);
1582- ParseStatus parseRegOrImm (OperandVector &Operands, bool HasSP3AbsMod = false );
1583+ ParseStatus parseRegOrImm (OperandVector &Operands, bool HasSP3AbsMod = false ,
1584+ bool HasLit = false );
15831585 ParseStatus parseRegOrImmWithFPInputMods (OperandVector &Operands,
15841586 bool AllowImm = true );
15851587 ParseStatus parseRegOrImmWithIntInputMods (OperandVector &Operands,
@@ -2904,13 +2906,26 @@ AMDGPUAsmParser::parseRegister(bool RestoreOnFailure) {
29042906}
29052907
29062908ParseStatus AMDGPUAsmParser::parseImm (OperandVector &Operands,
2907- bool HasSP3AbsModifier) {
2909+ bool HasSP3AbsModifier, bool HasLit ) {
29082910 // TODO: add syntactic sugar for 1/(2*PI)
29092911
29102912 if (isRegister ())
29112913 return ParseStatus::NoMatch;
29122914 assert (!isModifier ());
29132915
2916+ if (!HasLit) {
2917+ HasLit = trySkipId (" lit" );
2918+ if (HasLit) {
2919+ if (!skipToken (AsmToken::LParen, " expected left paren after lit" ))
2920+ return ParseStatus::Failure;
2921+ ParseStatus S = parseImm (Operands, HasSP3AbsModifier, HasLit);
2922+ if (S.isSuccess () &&
2923+ !skipToken (AsmToken::RParen, " expected closing parentheses" ))
2924+ return ParseStatus::Failure;
2925+ return S;
2926+ }
2927+ }
2928+
29142929 const auto & Tok = getToken ();
29152930 const auto & NextTok = peekToken ();
29162931 bool IsReal = Tok.is (AsmToken::Real);
@@ -2923,6 +2938,9 @@ ParseStatus AMDGPUAsmParser::parseImm(OperandVector &Operands,
29232938 Negate = true ;
29242939 }
29252940
2941+ AMDGPUOperand::Modifiers Mods;
2942+ Mods.Lit = HasLit;
2943+
29262944 if (IsReal) {
29272945 // Floating-point expressions are not supported.
29282946 // Can only allow floating-point literals with an
@@ -2941,6 +2959,8 @@ ParseStatus AMDGPUAsmParser::parseImm(OperandVector &Operands,
29412959 Operands.push_back (
29422960 AMDGPUOperand::CreateImm (this , RealVal.bitcastToAPInt ().getZExtValue (), S,
29432961 AMDGPUOperand::ImmTyNone, true ));
2962+ AMDGPUOperand &Op = static_cast <AMDGPUOperand &>(*Operands.back ());
2963+ Op.setModifiers (Mods);
29442964
29452965 return ParseStatus::Success;
29462966
@@ -2967,7 +2987,11 @@ ParseStatus AMDGPUAsmParser::parseImm(OperandVector &Operands,
29672987
29682988 if (Expr->evaluateAsAbsolute (IntVal)) {
29692989 Operands.push_back (AMDGPUOperand::CreateImm (this , IntVal, S));
2990+ AMDGPUOperand &Op = static_cast <AMDGPUOperand &>(*Operands.back ());
2991+ Op.setModifiers (Mods);
29702992 } else {
2993+ if (HasLit)
2994+ return ParseStatus::NoMatch;
29712995 Operands.push_back (AMDGPUOperand::CreateExpr (this , Expr, S));
29722996 }
29732997
@@ -2990,20 +3014,20 @@ ParseStatus AMDGPUAsmParser::parseReg(OperandVector &Operands) {
29903014}
29913015
29923016ParseStatus AMDGPUAsmParser::parseRegOrImm (OperandVector &Operands,
2993- bool HasSP3AbsMod) {
3017+ bool HasSP3AbsMod, bool HasLit ) {
29943018 ParseStatus Res = parseReg (Operands);
29953019 if (!Res.isNoMatch ())
29963020 return Res;
29973021 if (isModifier ())
29983022 return ParseStatus::NoMatch;
2999- return parseImm (Operands, HasSP3AbsMod);
3023+ return parseImm (Operands, HasSP3AbsMod, HasLit );
30003024}
30013025
30023026bool
30033027AMDGPUAsmParser::isNamedOperandModifier (const AsmToken &Token, const AsmToken &NextToken) const {
30043028 if (Token.is (AsmToken::Identifier) && NextToken.is (AsmToken::LParen)) {
30053029 const auto &str = Token.getString ();
3006- return str == " abs" || str == " neg" || str == " sext" || str == " lit " ;
3030+ return str == " abs" || str == " neg" || str == " sext" ;
30073031 }
30083032 return false ;
30093033}
@@ -3123,7 +3147,7 @@ AMDGPUAsmParser::parseRegOrImmWithFPInputMods(OperandVector &Operands,
31233147
31243148 ParseStatus Res;
31253149 if (AllowImm) {
3126- Res = parseRegOrImm (Operands, SP3Abs);
3150+ Res = parseRegOrImm (Operands, SP3Abs, Lit );
31273151 } else {
31283152 Res = parseReg (Operands);
31293153 }
0 commit comments