Allow multiclass def names to contain "#NAME"" where TableGen replaces

#NAME# with the name of the defm instantiating the multiclass.  This is
useful for AVX instruction naming where a "V" prefix is standard
throughout the ISA.  For example:

multiclass SSE_AVX_Inst<...> {
   def SS : Instr<...>;
   def SD : Instr<...>;
   def PS : Instr<...>;
   def PD : Instr<...>;

   def V#NAME#SS : Instr<...>;
   def V#NAME#SD : Instr<...>;
   def V#NAME#PS : Instr<...>;
   def V#NAME#PD : Instr<...>;
}

defm ADD : SSE_AVX_Inst<...>;

Results in 

ADDSS
ADDSD
ADDPS
ADDPD

VADDSS
VADDSD
VADDPS
VADDPD


git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@70979 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
David Greene
2009-05-05 16:28:25 +00:00
parent f868156820
commit 065f259ff5
3 changed files with 39 additions and 6 deletions
+15 -3
View File
@@ -98,7 +98,7 @@ tgtok::TokKind TGLexer::LexToken() {
switch (CurChar) {
default:
// Handle letters: [a-zA-Z_]
if (isalpha(CurChar) || CurChar == '_')
if (isalpha(CurChar) || CurChar == '_' || CurChar == '#')
return LexIdentifier();
// Unknown character, emit an error.
@@ -220,8 +220,20 @@ tgtok::TokKind TGLexer::LexIdentifier() {
const char *IdentStart = TokStart;
// Match the rest of the identifier regex: [0-9a-zA-Z_]*
while (isalpha(*CurPtr) || isdigit(*CurPtr) || *CurPtr == '_')
++CurPtr;
while (isalpha(*CurPtr) || isdigit(*CurPtr) || *CurPtr == '_'
|| *CurPtr == '#') {
// If this contains a '#', make sure it's value
if (*CurPtr == '#') {
if (strncmp(CurPtr, "#NAME#", 6) != 0) {
return tgtok::Error;
}
CurPtr += 6;
}
else {
++CurPtr;
}
}
// Check to see if this identifier is a keyword.
unsigned Len = CurPtr-IdentStart;