add a new Push2 opcode for targets (like cellspu) which have
authorChris Lattner <sabre@nondot.org>
Mon, 22 Feb 2010 23:55:39 +0000 (23:55 +0000)
committerChris Lattner <sabre@nondot.org>
Mon, 22 Feb 2010 23:55:39 +0000 (23:55 +0000)
ridiculously ginormous patterns and need more than one byte
of displacement for encodings.  This fixes CellSPU/fdiv.ll.
SPU is still doing something else ridiculous though.

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

include/llvm/CodeGen/DAGISelHeader.h
utils/TableGen/DAGISelMatcherEmitter.cpp

index 0ebb9f10f6dd275c23757b11e762ae2178d57a8e..29d66f5995496476ce6878d1cf902b7039343bab 100644 (file)
@@ -201,7 +201,7 @@ GetInt8(const unsigned char *MatcherTable, unsigned &Idx) {
 }
 
 enum BuiltinOpcodes {
-  OPC_Push,
+  OPC_Push, OPC_Push2,
   OPC_RecordNode,
   OPC_RecordMemRef,
   OPC_CaptureFlagInput,
@@ -359,6 +359,19 @@ SDNode *SelectCodeCommon(SDNode *NodeToMatch, const unsigned char *MatcherTable,
       MatchScopes.push_back(NewEntry);
       continue;
     }
+    case OPC_Push2: {
+      unsigned NumToSkip = GetInt2(MatcherTable, MatcherIndex);
+      MatchScope NewEntry;
+      NewEntry.FailIndex = MatcherIndex+NumToSkip;
+      NewEntry.NodeStackSize = NodeStack.size();
+      NewEntry.NumRecordedNodes = RecordedNodes.size();
+      NewEntry.NumMatchedMemRefs = MatchedMemRefs.size();
+      NewEntry.InputChain = InputChain;
+      NewEntry.InputFlag = InputFlag;
+      NewEntry.HasChainNodesMatched = !ChainNodesMatched.empty();
+      MatchScopes.push_back(NewEntry);
+      continue;
+    }
     case OPC_RecordNode:
       // Remember this node, it may end up being an operand in the pattern.
       RecordedNodes.push_back(N);
index 82d852e379f3d7b5a2ff981a829f3ec5dfe21596..33e37fae94957dca2b2501548e93cf3f721ea714 100644 (file)
@@ -350,16 +350,29 @@ EmitMatcherList(const MatcherNode *N, unsigned Indent, unsigned CurrentIdx,
         NextSize = EmitMatcherList(cast<PushMatcherNode>(N)->getNext(),
                                    Indent+1, CurrentIdx+2, FOS);
       }
-      
+
+      // In the unlikely event that we have something too big to emit with a
+      // one byte offset, regenerate it with a two-byte one.
       if (NextSize > 255) {
-        errs() <<
-          "Tblgen internal error: can't handle predicate this complex yet\n";
-        // FIXME: exit(1);
+        TmpBuf.clear();
+        raw_svector_ostream OS(TmpBuf);
+        formatted_raw_ostream FOS(OS);
+        NextSize = EmitMatcherList(cast<PushMatcherNode>(N)->getNext(),
+                                   Indent+1, CurrentIdx+3, FOS);
+        if (NextSize > 65535) {
+          errs() <<
+            "Tblgen internal error: can't handle pattern this complex yet\n";
+          exit(1);
+        }
       }
       
       OS << "/*" << CurrentIdx << "*/";
       OS.PadToColumn(Indent*2);
-      OS << "OPC_Push, " << NextSize << ",\n";
+      
+      if (NextSize < 256)
+        OS << "OPC_Push, " << NextSize << ",\n";
+      else
+        OS << "OPC_Push2, " << (NextSize&255) << ", " << (NextSize>>8) << ",\n";
       OS << TmpBuf.str();
       
       Size += 2+NextSize;