From 5310654dc56c64b726bba7da82d568137ec81bbc Mon Sep 17 00:00:00 2001 From: Chris Lattner Date: Sun, 28 Feb 2010 22:14:32 +0000 Subject: [PATCH] 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 --- include/llvm/CodeGen/DAGISelHeader.h | 106 ++++++----------------- include/llvm/CodeGen/SelectionDAGISel.h | 7 +- utils/TableGen/DAGISelMatcherEmitter.cpp | 75 ++++------------ 3 files changed, 45 insertions(+), 143 deletions(-) diff --git a/include/llvm/CodeGen/DAGISelHeader.h b/include/llvm/CodeGen/DAGISelHeader.h index f30e41bcbe6..41835808c86 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 &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 4e2b4d594ea..8da16bf6cc5 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 c6addd8b0db..c25243d9eb4 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 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(N)->getType()) << ",\n"; return 2; - case Matcher::CheckInteger: { - int64_t Val = cast(N)->getValue(); - OS << "OPC_CheckInteger" << ClassifyInt(Val) << ", "; - return EmitInt(Val, OS)+1; - } + case Matcher::CheckInteger: + OS << "OPC_CheckInteger, "; + return 1+EmitVBRValue(cast(N)->getValue(), OS); case Matcher::CheckCondCode: OS << "OPC_CheckCondCode, ISD::" << cast(N)->getCondCodeName() << ",\n"; @@ -318,17 +276,14 @@ EmitMatcher(const Matcher *N, unsigned Indent, unsigned CurrentIdx, return 2; } - case Matcher::CheckAndImm: { - int64_t Val = cast(N)->getValue(); - OS << "OPC_CheckAndImm" << ClassifyInt(Val) << ", "; - return EmitInt(Val, OS)+1; - } + case Matcher::CheckAndImm: + OS << "OPC_CheckAndImm, "; + return 1+EmitVBRValue(cast(N)->getValue(), OS); - case Matcher::CheckOrImm: { - int64_t Val = cast(N)->getValue(); - OS << "OPC_CheckOrImm" << ClassifyInt(Val) << ", "; - return EmitInt(Val, OS)+1; - } + case Matcher::CheckOrImm: + OS << "OPC_CheckOrImm, "; + return 1+EmitVBRValue(cast(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(N)->getValue(); - OS << "OPC_EmitInteger" << ClassifyInt(Val) << ", " + OS << "OPC_EmitInteger, " << getEnumName(cast(N)->getVT()) << ", "; - return EmitInt(Val, OS)+2; + return 2+EmitVBRValue(Val, OS); } case Matcher::EmitStringInteger: { const std::string &Val = cast(N)->getValue(); // These should always fit into one byte. - OS << "OPC_EmitInteger1, " + OS << "OPC_EmitInteger, " << getEnumName(cast(N)->getVT()) << ", " << Val << ",\n"; return 3; -- 2.34.1