aboutsummaryrefslogtreecommitdiffstats
path: root/utils/TableGen/DAGISelMatcherEmitter.cpp
diff options
context:
space:
mode:
authorChris Lattner <sabre@nondot.org>2010-02-22 23:55:39 +0000
committerChris Lattner <sabre@nondot.org>2010-02-22 23:55:39 +0000
commit3e22f2d489d6d1cff5123ae606cdea10d2c631f6 (patch)
tree8d40f080123488e67acce3d16802c6a4bb68273b /utils/TableGen/DAGISelMatcherEmitter.cpp
parentc6feeb7fa97eabe7701a6df9d5da69bd79fd8344 (diff)
downloadexternal_llvm-3e22f2d489d6d1cff5123ae606cdea10d2c631f6.zip
external_llvm-3e22f2d489d6d1cff5123ae606cdea10d2c631f6.tar.gz
external_llvm-3e22f2d489d6d1cff5123ae606cdea10d2c631f6.tar.bz2
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
Diffstat (limited to 'utils/TableGen/DAGISelMatcherEmitter.cpp')
-rw-r--r--utils/TableGen/DAGISelMatcherEmitter.cpp23
1 files changed, 18 insertions, 5 deletions
diff --git a/utils/TableGen/DAGISelMatcherEmitter.cpp b/utils/TableGen/DAGISelMatcherEmitter.cpp
index 82d852e..33e37fa 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<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;