Resolve a terrible hack in tblgen: instead of hardcoding
authorChris Lattner <sabre@nondot.org>
Sat, 30 Oct 2010 19:38:20 +0000 (19:38 +0000)
committerChris Lattner <sabre@nondot.org>
Sat, 30 Oct 2010 19:38:20 +0000 (19:38 +0000)
"In32BitMode" and "In64BitMode" into tblgen, allow any
predicate that inherits from AssemblerPredicate.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@117831 91177308-0d34-0410-b5e6-96231b3b80d8

include/llvm/Target/Target.td
lib/Target/X86/X86InstrInfo.td
utils/TableGen/AsmMatcherEmitter.cpp

index 2af75561ffeede64a10808dd1cad016e7c5f134a..87faa6b7e24a1b061cce60662c196cf970110884 100644 (file)
@@ -251,6 +251,11 @@ class Instruction {
 /// selector matching code. Currently each predicate is just a string.
 class Predicate<string cond> {
   string CondString = cond;
+  
+  /// AssemblerMatcherPredicate - If this feature can be used by the assembler
+  /// matcher, this is true.  Targets should set this by inheriting their
+  /// feature from the AssemblerPredicate class in addition to Predicate.
+  bit AssemblerMatcherPredicate = 0;
 }
 
 /// NoHonorSignDependentRounding - This predicate is true if support for
@@ -529,6 +534,13 @@ class AsmParser {
 }
 def DefaultAsmParser : AsmParser;
 
+/// AssemblerPredicate - This is a Predicate that can be used when the assembler
+/// matches instructions and aliases.
+class AssemblerPredicate {
+  bit AssemblerMatcherPredicate = 1;
+}
+
+
 
 /// MnemonicAlias - This class allows targets to define assembler mnemonic
 /// aliases.  This should be used when all forms of one mnemonic are accepted
index c0f350adacf305ce8f60ab12cf70831d08e88107..3af3911ef3fe1d844c60becd1001ac3f993f91d5 100644 (file)
@@ -414,8 +414,8 @@ def HasFMA3      : Predicate<"Subtarget->hasFMA3()">;
 def HasFMA4      : Predicate<"Subtarget->hasFMA4()">;
 def FPStackf32   : Predicate<"!Subtarget->hasSSE1()">;
 def FPStackf64   : Predicate<"!Subtarget->hasSSE2()">;
-def In32BitMode  : Predicate<"!Subtarget->is64Bit()">;
-def In64BitMode  : Predicate<"Subtarget->is64Bit()">;
+def In32BitMode  : Predicate<"!Subtarget->is64Bit()">, AssemblerPredicate;
+def In64BitMode  : Predicate<"Subtarget->is64Bit()">, AssemblerPredicate;
 def IsWin64      : Predicate<"Subtarget->isTargetWin64()">;
 def NotWin64     : Predicate<"!Subtarget->isTargetWin64()">;
 def SmallCode    : Predicate<"TM.getCodeModel() == CodeModel::Small">;
index 474319d01169630e6af1b1470be06474106708aa..999c137109b098c856f5f2a2ccb100e07852ef8c 100644 (file)
@@ -963,27 +963,15 @@ void AsmMatcherInfo::BuildInfo(CodeGenTarget &Target) {
     }
 
     // Compute the require features.
-    ListInit *Predicates = CGI.TheDef->getValueAsListInit("Predicates");
-    for (unsigned i = 0, e = Predicates->getSize(); i != e; ++i) {
-      if (DefInit *Pred = dynamic_cast<DefInit*>(Predicates->getElement(i))) {
-        // Ignore OptForSize and OptForSpeed, they aren't really requirements,
-        // rather they are hints to isel.
-        //
-        // FIXME: Find better way to model this.
-        if (Pred->getDef()->getName() == "OptForSize" ||
-            Pred->getDef()->getName() == "OptForSpeed")
-          continue;
-
-        // FIXME: Total hack; for now, we just limit ourselves to In32BitMode
-        // and In64BitMode, because we aren't going to have the right feature
-        // masks for SSE and friends. We need to decide what we are going to do
-        // about CPU subtypes to implement this the right way.
-        if (Pred->getDef()->getName() != "In32BitMode" &&
-            Pred->getDef()->getName() != "In64BitMode")
-          continue;
-
-        II->RequiredFeatures.push_back(getSubtargetFeature(Pred->getDef()));
-      }
+    std::vector<Record*> Predicates =
+      CGI.TheDef->getValueAsListOfDefs("Predicates");
+    for (unsigned i = 0, e = Predicates.size(); i != e; ++i) {
+      Record *Pred = Predicates[i];
+      // Ignore predicates that are not intended for the assembler.
+      if (!Pred->getValueAsBit("AssemblerMatcherPredicate"))
+        continue;
+        
+      II->RequiredFeatures.push_back(getSubtargetFeature(Pred));
     }
 
     Instructions.push_back(II.take());
@@ -1523,14 +1511,10 @@ static std::string GetAliasRequiredFeatures(Record *R) {
   for (unsigned i = 0, e = ReqFeatures.size(); i != e; ++i) {
     Record *Pred = ReqFeatures[i];
   
-    // FIXME: Total hack; for now, we just limit ourselves to In32BitMode
-    // and In64BitMode, because we aren't going to have the right feature
-    // masks for SSE and friends. We need to decide what we are going to do
-    // about CPU subtypes to implement this the right way.
-    if (Pred->getName() != "In32BitMode" &&
-        Pred->getName() != "In64BitMode")
+    // Ignore predicates that are not intended for the assembler.
+    if (!Pred->getValueAsBit("AssemblerMatcherPredicate"))
       continue;
-
     if (NumFeatures)
       Result += '|';