Skip to content

Commit f7ab79f

Browse files
authored
[AMDGPU] Allow lit() on operands which do not accept modifiers (llvm#69527)
1 parent f350532 commit f7ab79f

File tree

2 files changed

+41
-7
lines changed

2 files changed

+41
-7
lines changed

llvm/lib/Target/AMDGPU/AsmParser/AMDGPUAsmParser.cpp

Lines changed: 31 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -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

29062908
ParseStatus 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

29923016
ParseStatus 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

30023026
bool
30033027
AMDGPUAsmParser::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
}

llvm/test/MC/AMDGPU/literals.s

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -925,3 +925,13 @@ v_sqrt_f32 v2, lit(123.0
925925
// NOSICI: :[[@LINE+2]]:{{[0-9]+}}: error: expected immediate with lit modifier
926926
// NOGFX89: :[[@LINE+1]]:{{[0-9]+}}: error: expected immediate with lit modifier
927927
v_sqrt_f32 v2, lit(v1)
928+
929+
// Make sure lit() is accepted on operands without modifiers.
930+
931+
// SICI: v_madak_f32 v4, 0x7e8, v8, 0x7e8 ; encoding: [0xff,0x10,0x08,0x42,0xe8,0x07,0x00,0x00]
932+
// GFX89: v_madak_f32 v4, 0x7e8, v8, 0x7e8 ; encoding: [0xff,0x10,0x08,0x30,0xe8,0x07,0x00,0x00]
933+
v_madak_f32 v4, lit(0x7e8), v8, lit(0x7e8)
934+
935+
// NOSICI: :[[@LINE+2]]:{{[0-9]+}}: error: not a valid operand.
936+
// NOGFX89: :[[@LINE+1]]:{{[0-9]+}}: error: not a valid operand.
937+
v_madak_f32 v4, lit(lit(0x7e8)), v8, lit(0x7e8)

0 commit comments

Comments
 (0)