add a new Push2 opcode for targets (like cellspu) which have

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
This commit is contained in:
Chris Lattner
2010-02-22 23:55:39 +00:00
parent c6feeb7fa9
commit 3e22f2d489
2 changed files with 32 additions and 6 deletions
+14 -1
View 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);