[llvm-branch-commits] [SPARC][IAS] Rework ASI tag matching in prep for `ParseForAllFeatures` (PR #96020)
via llvm-branch-commits
llvm-branch-commits at lists.llvm.org
Tue Jun 18 21:32:29 PDT 2024
llvmbot wrote:
<!--LLVM PR SUMMARY COMMENT-->
@llvm/pr-subscribers-backend-sparc
Author: Koakuma (koachan)
<details>
<summary>Changes</summary>
This changes the ASI tag matching at `parseASITag` to use a similar
implementation to `parsePrefetchTag`. This introduces a slight regression
to error messages, but is needed so we can enable `ParseForAllFeatures`
in `MatchOperandParserImpl` in a future patch.
---
Full diff: https://github.com/llvm/llvm-project/pull/96020.diff
3 Files Affected:
- (modified) llvm/lib/Target/Sparc/AsmParser/SparcAsmParser.cpp (+23-13)
- (modified) llvm/test/MC/Sparc/sparc-mem-asi-instructions.s (+2-2)
- (modified) llvm/test/MC/Sparc/sparcv9-instructions.s (+2-2)
``````````diff
diff --git a/llvm/lib/Target/Sparc/AsmParser/SparcAsmParser.cpp b/llvm/lib/Target/Sparc/AsmParser/SparcAsmParser.cpp
index f0a3a4e88b30c..3d8637bb8c359 100644
--- a/llvm/lib/Target/Sparc/AsmParser/SparcAsmParser.cpp
+++ b/llvm/lib/Target/Sparc/AsmParser/SparcAsmParser.cpp
@@ -1085,13 +1085,24 @@ ParseStatus SparcAsmParser::parseASITag(OperandVector &Operands) {
SMLoc E = Parser.getTok().getEndLoc();
int64_t ASIVal = 0;
- if (is64Bit() && (getLexer().getKind() == AsmToken::Hash)) {
+ switch (getLexer().getKind()) {
+ case AsmToken::LParen:
+ case AsmToken::Integer:
+ case AsmToken::Identifier:
+ case AsmToken::Plus:
+ case AsmToken::Minus:
+ case AsmToken::Tilde:
+ if (getParser().parseAbsoluteExpression(ASIVal) || !isUInt<8>(ASIVal))
+ return Error(S, "invalid ASI number, must be between 0 and 255");
+ break;
+ case AsmToken::Hash: {
// For now we only support named tags for 64-bit/V9 systems.
// TODO: add support for 32-bit/V8 systems.
SMLoc TagStart = getLexer().peekTok(false).getLoc();
Parser.Lex(); // Eat the '#'.
- auto ASIName = Parser.getTok().getString();
- auto ASITag = SparcASITag::lookupASITagByName(ASIName);
+ const StringRef ASIName = Parser.getTok().getString();
+ const SparcASITag::ASITag *ASITag =
+ SparcASITag::lookupASITagByName(ASIName);
if (!ASITag)
ASITag = SparcASITag::lookupASITagByAltName(ASIName);
Parser.Lex(); // Eat the identifier token.
@@ -1100,15 +1111,10 @@ ParseStatus SparcAsmParser::parseASITag(OperandVector &Operands) {
return Error(TagStart, "unknown ASI tag");
ASIVal = ASITag->Encoding;
- } else if (!getParser().parseAbsoluteExpression(ASIVal)) {
- if (!isUInt<8>(ASIVal))
- return Error(S, "invalid ASI number, must be between 0 and 255");
- } else {
- return Error(
- S, is64Bit()
- ? "malformed ASI tag, must be %asi, a constant integer "
- "expression, or a named tag"
- : "malformed ASI tag, must be a constant integer expression");
+ break;
+ }
+ default:
+ return ParseStatus::NoMatch;
}
Operands.push_back(SparcOperand::CreateASITag(ASIVal, S, E));
@@ -1230,8 +1236,12 @@ ParseStatus SparcAsmParser::parseOperand(OperandVector &Operands,
// Parse an optional address-space identifier after the address.
// This will be either an immediate constant expression, or, on 64-bit
// processors, the %asi register.
- if (is64Bit() && getLexer().is(AsmToken::Percent)) {
+ if (getLexer().is(AsmToken::Percent)) {
SMLoc S = Parser.getTok().getLoc();
+ if (!is64Bit())
+ return Error(
+ S, "malformed ASI tag, must be a constant integer expression");
+
Parser.Lex(); // Eat the %.
const AsmToken Tok = Parser.getTok();
if (Tok.is(AsmToken::Identifier) && Tok.getString() == "asi") {
diff --git a/llvm/test/MC/Sparc/sparc-mem-asi-instructions.s b/llvm/test/MC/Sparc/sparc-mem-asi-instructions.s
index 39abe7b99cb40..8b8503caf4ba0 100644
--- a/llvm/test/MC/Sparc/sparc-mem-asi-instructions.s
+++ b/llvm/test/MC/Sparc/sparc-mem-asi-instructions.s
@@ -1,9 +1,9 @@
! RUN: not llvm-mc %s -triple=sparc -show-encoding 2>&1 | FileCheck %s --check-prefix=V8
! RUN: not llvm-mc %s -triple=sparcv9 -show-encoding 2>&1 | FileCheck %s --check-prefix=V9
-! V8: error: malformed ASI tag, must be a constant integer expression
+! V8: error: expected absolute expression
! V8-NEXT: lduba [%i0] asi, %o2
-! V9: error: malformed ASI tag, must be %asi, a constant integer expression, or a named tag
+! V9: error: unexpected token
! V9-NEXT: lduba [%i0] asi, %o2
lduba [%i0] asi, %o2
diff --git a/llvm/test/MC/Sparc/sparcv9-instructions.s b/llvm/test/MC/Sparc/sparcv9-instructions.s
index 1b11171b7074d..a7761c10c509b 100644
--- a/llvm/test/MC/Sparc/sparcv9-instructions.s
+++ b/llvm/test/MC/Sparc/sparcv9-instructions.s
@@ -657,12 +657,12 @@
! V9: prefetcha [%i1+3968] %asi, #one_read ! encoding: [0xc3,0xee,0x6f,0x80]
prefetcha [ %i1 + 0xf80 ] %asi, #one_read
- ! V8: error: malformed ASI tag, must be a constant integer expression
+ ! V8: error: invalid operand for instruction
! V8-NEXT: prefetcha [ %i1 + %i2 ] #ASI_SNF, 1
! V9: prefetcha [%i1+%i2] #ASI_SNF, #one_read ! encoding: [0xc3,0xee,0x50,0x7a]
prefetcha [ %i1 + %i2 ] #ASI_SNF, 1
- ! V8: error: malformed ASI tag, must be a constant integer expression
+ ! V8: error: unexpected token
! V8-NEXT: prefetcha [ %i1 + %i2 ] #ASI_SNF, #one_read
! V9: prefetcha [%i1+%i2] #ASI_SNF, #one_read ! encoding: [0xc3,0xee,0x50,0x7a]
prefetcha [ %i1 + %i2 ] #ASI_SNF, #one_read
``````````
</details>
https://github.com/llvm/llvm-project/pull/96020
More information about the llvm-branch-commits
mailing list