diff options
author | Chris Lattner <sabre@nondot.org> | 2012-05-27 16:39:08 +0000 |
---|---|---|
committer | Chris Lattner <sabre@nondot.org> | 2012-05-27 16:39:08 +0000 |
commit | b4654c1c490275370ca706eed2d85cc232b21155 (patch) | |
tree | fccc7c36ab13b6bf2e0a7258f3efc8df38a352b2 /utils/TableGen/IntrinsicEmitter.cpp | |
parent | e3f75f8797b9752bfe7923bff9a87a15a6fe3552 (diff) | |
download | llvm-b4654c1c490275370ca706eed2d85cc232b21155.tar.gz llvm-b4654c1c490275370ca706eed2d85cc232b21155.tar.bz2 llvm-b4654c1c490275370ca706eed2d85cc232b21155.tar.xz |
enhance the intrinsic info table to encode what *kind* of Any argument
it is (at the cost of 45 bytes of extra table space) so that the verifier can
start using it.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@157536 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'utils/TableGen/IntrinsicEmitter.cpp')
-rw-r--r-- | utils/TableGen/IntrinsicEmitter.cpp | 32 |
1 files changed, 20 insertions, 12 deletions
diff --git a/utils/TableGen/IntrinsicEmitter.cpp b/utils/TableGen/IntrinsicEmitter.cpp index 48287d64a5..6578a5b8be 100644 --- a/utils/TableGen/IntrinsicEmitter.cpp +++ b/utils/TableGen/IntrinsicEmitter.cpp @@ -372,33 +372,41 @@ static void EncodeFixedValueType(MVT::SimpleValueType VT, #pragma optimize("",off) // MSVC 2010 optimizer can't deal with this function. #endif -static void EncodeFixedType(Record *R, unsigned &NextArgNo, +static void EncodeFixedType(Record *R, std::vector<unsigned char> &ArgCodes, std::vector<unsigned char> &Sig) { if (R->isSubClassOf("LLVMMatchType")) { unsigned Number = R->getValueAsInt("Number"); - assert(Number < NextArgNo && "Invalid matching number!"); + assert(Number < ArgCodes.size() && "Invalid matching number!"); if (R->isSubClassOf("LLVMExtendedElementVectorType")) Sig.push_back(IIT_EXTEND_VEC_ARG); else if (R->isSubClassOf("LLVMTruncatedElementVectorType")) Sig.push_back(IIT_TRUNC_VEC_ARG); else Sig.push_back(IIT_ARG); - return Sig.push_back(Number); + return Sig.push_back((Number << 2) | ArgCodes[Number]); } MVT::SimpleValueType VT = getValueType(R->getValueAsDef("VT")); + unsigned Tmp = 0; switch (VT) { default: break; - case MVT::iAny: - case MVT::fAny: - case MVT::vAny: - case MVT::iPTRAny: + case MVT::iPTRAny: ++Tmp; // FALL THROUGH. + case MVT::vAny: ++Tmp; // FALL THROUGH. + case MVT::fAny: ++Tmp; // FALL THROUGH. + case MVT::iAny: { // If this is an "any" valuetype, then the type is the type of the next // type in the list specified to getIntrinsic(). Sig.push_back(IIT_ARG); - return Sig.push_back(NextArgNo++); + + // Figure out what arg # this is consuming, and remember what kind it was. + unsigned ArgNo = ArgCodes.size(); + ArgCodes.push_back(Tmp); + + // Encode what sort of argument it must be in the low 2 bits of the ArgNo. + return Sig.push_back((ArgNo << 2) | Tmp); + } case MVT::iPTR: { unsigned AddrSpace = 0; @@ -412,7 +420,7 @@ static void EncodeFixedType(Record *R, unsigned &NextArgNo, } else { Sig.push_back(IIT_PTR); } - return EncodeFixedType(R->getValueAsDef("ElTy"), NextArgNo, Sig); + return EncodeFixedType(R->getValueAsDef("ElTy"), ArgCodes, Sig); } } @@ -442,7 +450,7 @@ static void EncodeFixedType(Record *R, unsigned &NextArgNo, /// intrinsic into 32 bits, return it. If not, return ~0U. static void ComputeFixedEncoding(const CodeGenIntrinsic &Int, std::vector<unsigned char> &TypeSig) { - unsigned NextArgNo = 0; + std::vector<unsigned char> ArgCodes; if (Int.IS.RetVTs.empty()) TypeSig.push_back(IIT_Done); @@ -460,11 +468,11 @@ static void ComputeFixedEncoding(const CodeGenIntrinsic &Int, } for (unsigned i = 0, e = Int.IS.RetVTs.size(); i != e; ++i) - EncodeFixedType(Int.IS.RetTypeDefs[i], NextArgNo, TypeSig); + EncodeFixedType(Int.IS.RetTypeDefs[i], ArgCodes, TypeSig); } for (unsigned i = 0, e = Int.IS.ParamTypeDefs.size(); i != e; ++i) - EncodeFixedType(Int.IS.ParamTypeDefs[i], NextArgNo, TypeSig); + EncodeFixedType(Int.IS.ParamTypeDefs[i], ArgCodes, TypeSig); } void printIITEntry(raw_ostream &OS, unsigned char X) { |