From 3e22f2d489d6d1cff5123ae606cdea10d2c631f6 Mon Sep 17 00:00:00 2001 From: Chris Lattner Date: Mon, 22 Feb 2010 23:55:39 +0000 Subject: [PATCH] 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 --- include/llvm/CodeGen/DAGISelHeader.h | 15 ++++++++++++++- utils/TableGen/DAGISelMatcherEmitter.cpp | 23 ++++++++++++++++++----- 2 files changed, 32 insertions(+), 6 deletions(-) diff --git a/include/llvm/CodeGen/DAGISelHeader.h b/include/llvm/CodeGen/DAGISelHeader.h index 0ebb9f10f6d..29d66f59954 100644 --- a/include/llvm/CodeGen/DAGISelHeader.h +++ b/include/llvm/CodeGen/DAGISelHeader.h @@ -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); diff --git a/utils/TableGen/DAGISelMatcherEmitter.cpp b/utils/TableGen/DAGISelMatcherEmitter.cpp index 82d852e379f..33e37fae949 100644 --- a/utils/TableGen/DAGISelMatcherEmitter.cpp +++ b/utils/TableGen/DAGISelMatcherEmitter.cpp @@ -350,16 +350,29 @@ EmitMatcherList(const MatcherNode *N, unsigned Indent, unsigned CurrentIdx, NextSize = EmitMatcherList(cast(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(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;