aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorChris Lattner <sabre@nondot.org>2010-02-28 22:14:32 +0000
committerChris Lattner <sabre@nondot.org>2010-02-28 22:14:32 +0000
commit5310654dc56c64b726bba7da82d568137ec81bbc (patch)
treea38406fd7ba32ae30c984fc1b20fe18c0704a14b
parentaa6d70802844ee17fc38ab99850faf4d02a8b76a (diff)
downloadexternal_llvm-5310654dc56c64b726bba7da82d568137ec81bbc.zip
external_llvm-5310654dc56c64b726bba7da82d568137ec81bbc.tar.gz
external_llvm-5310654dc56c64b726bba7da82d568137ec81bbc.tar.bz2
change a few opcodes to use VBRs instead of embedding
immediate sizes into the opcode. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@97423 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r--include/llvm/CodeGen/DAGISelHeader.h106
-rw-r--r--include/llvm/CodeGen/SelectionDAGISel.h7
-rw-r--r--utils/TableGen/DAGISelMatcherEmitter.cpp75
3 files changed, 45 insertions, 143 deletions
diff --git a/include/llvm/CodeGen/DAGISelHeader.h b/include/llvm/CodeGen/DAGISelHeader.h
index f30e41b..4183580 100644
--- a/include/llvm/CodeGen/DAGISelHeader.h
+++ b/include/llvm/CodeGen/DAGISelHeader.h
@@ -167,11 +167,6 @@ bool CheckOrImmediate(SDValue V, int64_t Val) {
return true;
}
-void EmitInteger(int64_t Val, MVT::SimpleValueType VT,
- SmallVectorImpl<SDValue> &RecordedNodes) {
- RecordedNodes.push_back(CurDAG->getTargetConstant(Val, VT));
-}
-
// These functions are marked always inline so that Idx doesn't get pinned to
// the stack.
ALWAYS_INLINE static int8_t
@@ -186,28 +181,14 @@ GetInt2(const unsigned char *MatcherTable, unsigned &Idx) {
return Val;
}
-ALWAYS_INLINE static int32_t
-GetInt4(const unsigned char *MatcherTable, unsigned &Idx) {
- int32_t Val = (uint16_t)GetInt2(MatcherTable, Idx);
- Val |= int32_t(GetInt2(MatcherTable, Idx)) << 16;
- return Val;
-}
-
-ALWAYS_INLINE static int64_t
-GetInt8(const unsigned char *MatcherTable, unsigned &Idx) {
- int64_t Val = (uint32_t)GetInt4(MatcherTable, Idx);
- Val |= int64_t(GetInt4(MatcherTable, Idx)) << 32;
- return Val;
-}
-
/// GetVBR - decode a vbr encoding whose top bit is set.
-ALWAYS_INLINE static unsigned
-GetVBR(unsigned Val, const unsigned char *MatcherTable, unsigned &Idx) {
+ALWAYS_INLINE static uint64_t
+GetVBR(uint64_t Val, const unsigned char *MatcherTable, unsigned &Idx) {
assert(Val >= 128 && "Not a VBR");
Val &= 127; // Remove first vbr bit.
unsigned Shift = 7;
- unsigned NextBits;
+ uint64_t NextBits;
do {
NextBits = GetInt1(MatcherTable, Idx);
Val |= (NextBits&127) << Shift;
@@ -501,44 +482,27 @@ SDNode *SelectCodeCommon(SDNode *NodeToMatch, const unsigned char *MatcherTable,
}
continue;
}
- case OPC_CheckInteger1:
- if (CheckInteger(N, GetInt1(MatcherTable, MatcherIndex))) break;
- continue;
- case OPC_CheckInteger2:
- if (CheckInteger(N, GetInt2(MatcherTable, MatcherIndex))) break;
- continue;
- case OPC_CheckInteger4:
- if (CheckInteger(N, GetInt4(MatcherTable, MatcherIndex))) break;
- continue;
- case OPC_CheckInteger8:
- if (CheckInteger(N, GetInt8(MatcherTable, MatcherIndex))) break;
- continue;
-
- case OPC_CheckAndImm1:
- if (CheckAndImmediate(N, GetInt1(MatcherTable, MatcherIndex))) break;
- continue;
- case OPC_CheckAndImm2:
- if (CheckAndImmediate(N, GetInt2(MatcherTable, MatcherIndex))) break;
- continue;
- case OPC_CheckAndImm4:
- if (CheckAndImmediate(N, GetInt4(MatcherTable, MatcherIndex))) break;
- continue;
- case OPC_CheckAndImm8:
- if (CheckAndImmediate(N, GetInt8(MatcherTable, MatcherIndex))) break;
- continue;
-
- case OPC_CheckOrImm1:
- if (CheckOrImmediate(N, GetInt1(MatcherTable, MatcherIndex))) break;
- continue;
- case OPC_CheckOrImm2:
- if (CheckOrImmediate(N, GetInt2(MatcherTable, MatcherIndex))) break;
- continue;
- case OPC_CheckOrImm4:
- if (CheckOrImmediate(N, GetInt4(MatcherTable, MatcherIndex))) break;
+ case OPC_CheckInteger: {
+ int64_t Val = MatcherTable[MatcherIndex++];
+ if (Val & 128)
+ Val = GetVBR(Val, MatcherTable, MatcherIndex);
+ if (CheckInteger(N, Val)) break;
+ continue;
+ }
+ case OPC_CheckAndImm: {
+ int64_t Val = MatcherTable[MatcherIndex++];
+ if (Val & 128)
+ Val = GetVBR(Val, MatcherTable, MatcherIndex);
+ if (CheckAndImmediate(N, Val)) break;
continue;
- case OPC_CheckOrImm8:
- if (CheckOrImmediate(N, GetInt8(MatcherTable, MatcherIndex))) break;
+ }
+ case OPC_CheckOrImm: {
+ int64_t Val = MatcherTable[MatcherIndex++];
+ if (Val & 128)
+ Val = GetVBR(Val, MatcherTable, MatcherIndex);
+ if (CheckOrImmediate(N, Val)) break;
continue;
+ }
case OPC_CheckFoldableChainNode: {
assert(NodeStack.size() != 1 && "No parent node");
@@ -581,31 +545,15 @@ SDNode *SelectCodeCommon(SDNode *NodeToMatch, const unsigned char *MatcherTable,
continue;
}
- case OPC_EmitInteger1: {
- MVT::SimpleValueType VT =
- (MVT::SimpleValueType)MatcherTable[MatcherIndex++];
- EmitInteger(GetInt1(MatcherTable, MatcherIndex), VT, RecordedNodes);
- continue;
- }
- case OPC_EmitInteger2: {
+ case OPC_EmitInteger: {
MVT::SimpleValueType VT =
(MVT::SimpleValueType)MatcherTable[MatcherIndex++];
- EmitInteger(GetInt2(MatcherTable, MatcherIndex), VT, RecordedNodes);
+ int64_t Val = MatcherTable[MatcherIndex++];
+ if (Val & 128)
+ Val = GetVBR(Val, MatcherTable, MatcherIndex);
+ RecordedNodes.push_back(CurDAG->getTargetConstant(Val, VT));
continue;
}
- case OPC_EmitInteger4: {
- MVT::SimpleValueType VT =
- (MVT::SimpleValueType)MatcherTable[MatcherIndex++];
- EmitInteger(GetInt4(MatcherTable, MatcherIndex), VT, RecordedNodes);
- continue;
- }
- case OPC_EmitInteger8: {
- MVT::SimpleValueType VT =
- (MVT::SimpleValueType)MatcherTable[MatcherIndex++];
- EmitInteger(GetInt8(MatcherTable, MatcherIndex), VT, RecordedNodes);
- continue;
- }
-
case OPC_EmitRegister: {
MVT::SimpleValueType VT =
(MVT::SimpleValueType)MatcherTable[MatcherIndex++];
diff --git a/include/llvm/CodeGen/SelectionDAGISel.h b/include/llvm/CodeGen/SelectionDAGISel.h
index 4e2b4d5..8da16bf 100644
--- a/include/llvm/CodeGen/SelectionDAGISel.h
+++ b/include/llvm/CodeGen/SelectionDAGISel.h
@@ -117,16 +117,15 @@ public:
OPC_CheckChild0Type, OPC_CheckChild1Type, OPC_CheckChild2Type,
OPC_CheckChild3Type, OPC_CheckChild4Type, OPC_CheckChild5Type,
OPC_CheckChild6Type, OPC_CheckChild7Type,
- OPC_CheckInteger1, OPC_CheckInteger2, OPC_CheckInteger4, OPC_CheckInteger8,
+ OPC_CheckInteger,
OPC_CheckCondCode,
OPC_CheckValueType,
OPC_CheckComplexPat,
- OPC_CheckAndImm1, OPC_CheckAndImm2, OPC_CheckAndImm4, OPC_CheckAndImm8,
- OPC_CheckOrImm1, OPC_CheckOrImm2, OPC_CheckOrImm4, OPC_CheckOrImm8,
+ OPC_CheckAndImm, OPC_CheckOrImm,
OPC_CheckFoldableChainNode,
OPC_CheckChainCompatible,
- OPC_EmitInteger1, OPC_EmitInteger2, OPC_EmitInteger4, OPC_EmitInteger8,
+ OPC_EmitInteger,
OPC_EmitRegister,
OPC_EmitConvertToTarget,
OPC_EmitMergeInputChains,
diff --git a/utils/TableGen/DAGISelMatcherEmitter.cpp b/utils/TableGen/DAGISelMatcherEmitter.cpp
index c6addd8..c25243d 100644
--- a/utils/TableGen/DAGISelMatcherEmitter.cpp
+++ b/utils/TableGen/DAGISelMatcherEmitter.cpp
@@ -24,46 +24,6 @@ enum {
CommentIndent = 30
};
-/// ClassifyInt - Classify an integer by size, return '1','2','4','8' if this
-/// fits in 1, 2, 4, or 8 sign extended bytes.
-static char ClassifyInt(int64_t Val) {
- if (Val == int8_t(Val)) return '1';
- if (Val == int16_t(Val)) return '2';
- if (Val == int32_t(Val)) return '4';
- return '8';
-}
-
-/// EmitInt - Emit the specified integer, returning the number of bytes emitted.
-static unsigned EmitInt(int64_t Val, formatted_raw_ostream &OS) {
- unsigned BytesEmitted = 1;
- OS << (int)(unsigned char)Val << ", ";
- if (Val == int8_t(Val)) {
- OS << '\n';
- return BytesEmitted;
- }
-
- OS << (int)(unsigned char)(Val >> 8) << ", ";
- ++BytesEmitted;
-
- if (Val != int16_t(Val)) {
- OS << (int)(unsigned char)(Val >> 16) << ", "
- << (int)(unsigned char)(Val >> 24) << ", ";
- BytesEmitted += 2;
-
- if (Val != int32_t(Val)) {
- OS << (int)(unsigned char)(Val >> 32) << ", "
- << (int)(unsigned char)(Val >> 40) << ", "
- << (int)(unsigned char)(Val >> 48) << ", "
- << (int)(unsigned char)(Val >> 56) << ", ";
- BytesEmitted += 4;
- }
- }
-
- OS.PadToColumn(CommentIndent) << "// " << Val << " aka 0x";
- OS.write_hex(Val) << '\n';
- return BytesEmitted;
-}
-
namespace {
class MatcherTableEmitter {
StringMap<unsigned> NodePredicateMap, PatternPredicateMap;
@@ -142,13 +102,13 @@ static unsigned GetVBRSize(unsigned Val) {
/// EmitVBRValue - Emit the specified value as a VBR, returning the number of
/// bytes emitted.
-static unsigned EmitVBRValue(unsigned Val, raw_ostream &OS) {
+static uint64_t EmitVBRValue(uint64_t Val, raw_ostream &OS) {
if (Val <= 127) {
OS << Val << ", ";
return 1;
}
- unsigned InVal = Val;
+ uint64_t InVal = Val;
unsigned NumBytes = 0;
while (Val >= 128) {
OS << (Val&127) << "|128,";
@@ -291,11 +251,9 @@ EmitMatcher(const Matcher *N, unsigned Indent, unsigned CurrentIdx,
<< getEnumName(cast<CheckChildTypeMatcher>(N)->getType()) << ",\n";
return 2;
- case Matcher::CheckInteger: {
- int64_t Val = cast<CheckIntegerMatcher>(N)->getValue();
- OS << "OPC_CheckInteger" << ClassifyInt(Val) << ", ";
- return EmitInt(Val, OS)+1;
- }
+ case Matcher::CheckInteger:
+ OS << "OPC_CheckInteger, ";
+ return 1+EmitVBRValue(cast<CheckIntegerMatcher>(N)->getValue(), OS);
case Matcher::CheckCondCode:
OS << "OPC_CheckCondCode, ISD::"
<< cast<CheckCondCodeMatcher>(N)->getCondCodeName() << ",\n";
@@ -318,17 +276,14 @@ EmitMatcher(const Matcher *N, unsigned Indent, unsigned CurrentIdx,
return 2;
}
- case Matcher::CheckAndImm: {
- int64_t Val = cast<CheckAndImmMatcher>(N)->getValue();
- OS << "OPC_CheckAndImm" << ClassifyInt(Val) << ", ";
- return EmitInt(Val, OS)+1;
- }
+ case Matcher::CheckAndImm:
+ OS << "OPC_CheckAndImm, ";
+ return 1+EmitVBRValue(cast<CheckAndImmMatcher>(N)->getValue(), OS);
- case Matcher::CheckOrImm: {
- int64_t Val = cast<CheckOrImmMatcher>(N)->getValue();
- OS << "OPC_CheckOrImm" << ClassifyInt(Val) << ", ";
- return EmitInt(Val, OS)+1;
- }
+ case Matcher::CheckOrImm:
+ OS << "OPC_CheckOrImm, ";
+ return 1+EmitVBRValue(cast<CheckOrImmMatcher>(N)->getValue(), OS);
+
case Matcher::CheckFoldableChainNode:
OS << "OPC_CheckFoldableChainNode,\n";
return 1;
@@ -339,14 +294,14 @@ EmitMatcher(const Matcher *N, unsigned Indent, unsigned CurrentIdx,
case Matcher::EmitInteger: {
int64_t Val = cast<EmitIntegerMatcher>(N)->getValue();
- OS << "OPC_EmitInteger" << ClassifyInt(Val) << ", "
+ OS << "OPC_EmitInteger, "
<< getEnumName(cast<EmitIntegerMatcher>(N)->getVT()) << ", ";
- return EmitInt(Val, OS)+2;
+ return 2+EmitVBRValue(Val, OS);
}
case Matcher::EmitStringInteger: {
const std::string &Val = cast<EmitStringIntegerMatcher>(N)->getValue();
// These should always fit into one byte.
- OS << "OPC_EmitInteger1, "
+ OS << "OPC_EmitInteger, "
<< getEnumName(cast<EmitStringIntegerMatcher>(N)->getVT()) << ", "
<< Val << ",\n";
return 3;