@@ -1577,9 +1577,11 @@ class AMDGPUAsmParser : public MCTargetAsmParser {
1577
1577
bool isNamedOperandModifier (const AsmToken &Token, const AsmToken &NextToken) const ;
1578
1578
bool isOpcodeModifierWithVal (const AsmToken &Token, const AsmToken &NextToken) const ;
1579
1579
bool parseSP3NegModifier ();
1580
- ParseStatus parseImm (OperandVector &Operands, bool HasSP3AbsModifier = false );
1580
+ ParseStatus parseImm (OperandVector &Operands, bool HasSP3AbsModifier = false ,
1581
+ bool HasLit = false );
1581
1582
ParseStatus parseReg (OperandVector &Operands);
1582
- ParseStatus parseRegOrImm (OperandVector &Operands, bool HasSP3AbsMod = false );
1583
+ ParseStatus parseRegOrImm (OperandVector &Operands, bool HasSP3AbsMod = false ,
1584
+ bool HasLit = false );
1583
1585
ParseStatus parseRegOrImmWithFPInputMods (OperandVector &Operands,
1584
1586
bool AllowImm = true );
1585
1587
ParseStatus parseRegOrImmWithIntInputMods (OperandVector &Operands,
@@ -2904,13 +2906,26 @@ AMDGPUAsmParser::parseRegister(bool RestoreOnFailure) {
2904
2906
}
2905
2907
2906
2908
ParseStatus AMDGPUAsmParser::parseImm (OperandVector &Operands,
2907
- bool HasSP3AbsModifier) {
2909
+ bool HasSP3AbsModifier, bool HasLit ) {
2908
2910
// TODO: add syntactic sugar for 1/(2*PI)
2909
2911
2910
2912
if (isRegister ())
2911
2913
return ParseStatus::NoMatch;
2912
2914
assert (!isModifier ());
2913
2915
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
+
2914
2929
const auto & Tok = getToken ();
2915
2930
const auto & NextTok = peekToken ();
2916
2931
bool IsReal = Tok.is (AsmToken::Real);
@@ -2923,6 +2938,9 @@ ParseStatus AMDGPUAsmParser::parseImm(OperandVector &Operands,
2923
2938
Negate = true ;
2924
2939
}
2925
2940
2941
+ AMDGPUOperand::Modifiers Mods;
2942
+ Mods.Lit = HasLit;
2943
+
2926
2944
if (IsReal) {
2927
2945
// Floating-point expressions are not supported.
2928
2946
// Can only allow floating-point literals with an
@@ -2941,6 +2959,8 @@ ParseStatus AMDGPUAsmParser::parseImm(OperandVector &Operands,
2941
2959
Operands.push_back (
2942
2960
AMDGPUOperand::CreateImm (this , RealVal.bitcastToAPInt ().getZExtValue (), S,
2943
2961
AMDGPUOperand::ImmTyNone, true ));
2962
+ AMDGPUOperand &Op = static_cast <AMDGPUOperand &>(*Operands.back ());
2963
+ Op.setModifiers (Mods);
2944
2964
2945
2965
return ParseStatus::Success;
2946
2966
@@ -2967,7 +2987,11 @@ ParseStatus AMDGPUAsmParser::parseImm(OperandVector &Operands,
2967
2987
2968
2988
if (Expr->evaluateAsAbsolute (IntVal)) {
2969
2989
Operands.push_back (AMDGPUOperand::CreateImm (this , IntVal, S));
2990
+ AMDGPUOperand &Op = static_cast <AMDGPUOperand &>(*Operands.back ());
2991
+ Op.setModifiers (Mods);
2970
2992
} else {
2993
+ if (HasLit)
2994
+ return ParseStatus::NoMatch;
2971
2995
Operands.push_back (AMDGPUOperand::CreateExpr (this , Expr, S));
2972
2996
}
2973
2997
@@ -2990,20 +3014,20 @@ ParseStatus AMDGPUAsmParser::parseReg(OperandVector &Operands) {
2990
3014
}
2991
3015
2992
3016
ParseStatus AMDGPUAsmParser::parseRegOrImm (OperandVector &Operands,
2993
- bool HasSP3AbsMod) {
3017
+ bool HasSP3AbsMod, bool HasLit ) {
2994
3018
ParseStatus Res = parseReg (Operands);
2995
3019
if (!Res.isNoMatch ())
2996
3020
return Res;
2997
3021
if (isModifier ())
2998
3022
return ParseStatus::NoMatch;
2999
- return parseImm (Operands, HasSP3AbsMod);
3023
+ return parseImm (Operands, HasSP3AbsMod, HasLit );
3000
3024
}
3001
3025
3002
3026
bool
3003
3027
AMDGPUAsmParser::isNamedOperandModifier (const AsmToken &Token, const AsmToken &NextToken) const {
3004
3028
if (Token.is (AsmToken::Identifier) && NextToken.is (AsmToken::LParen)) {
3005
3029
const auto &str = Token.getString ();
3006
- return str == " abs" || str == " neg" || str == " sext" || str == " lit " ;
3030
+ return str == " abs" || str == " neg" || str == " sext" ;
3007
3031
}
3008
3032
return false ;
3009
3033
}
@@ -3123,7 +3147,7 @@ AMDGPUAsmParser::parseRegOrImmWithFPInputMods(OperandVector &Operands,
3123
3147
3124
3148
ParseStatus Res;
3125
3149
if (AllowImm) {
3126
- Res = parseRegOrImm (Operands, SP3Abs);
3150
+ Res = parseRegOrImm (Operands, SP3Abs, Lit );
3127
3151
} else {
3128
3152
Res = parseReg (Operands);
3129
3153
}
0 commit comments