+static Type *DecodeFixedType(unsigned &NextElt, ArrayRef<unsigned char> Infos,
+ ArrayRef<Type*> Tys, LLVMContext &Context) {
+ IIT_Info Info = IIT_Info(Infos[NextElt++]);
+ unsigned StructElts = 2;
+
+ switch (Info) {
+ case IIT_Done: return Type::getVoidTy(Context);
+ case IIT_I1: return Type::getInt1Ty(Context);
+ case IIT_I8: return Type::getInt8Ty(Context);
+ case IIT_I16: return Type::getInt16Ty(Context);
+ case IIT_I32: return Type::getInt32Ty(Context);
+ case IIT_I64: return Type::getInt64Ty(Context);
+ case IIT_F32: return Type::getFloatTy(Context);
+ case IIT_F64: return Type::getDoubleTy(Context);
+ case IIT_MMX: return Type::getX86_MMXTy(Context);
+ case IIT_METADATA: return Type::getMetadataTy(Context);
+ case IIT_EMPTYSTRUCT: return StructType::get(Context);
+ case IIT_V2:
+ return VectorType::get(DecodeFixedType(NextElt, Infos, Tys, Context), 2);
+ case IIT_V4:
+ return VectorType::get(DecodeFixedType(NextElt, Infos, Tys, Context), 4);
+ case IIT_V8:
+ return VectorType::get(DecodeFixedType(NextElt, Infos, Tys, Context), 8);
+ case IIT_V16:
+ return VectorType::get(DecodeFixedType(NextElt, Infos, Tys, Context), 16);
+ case IIT_V32:
+ return VectorType::get(DecodeFixedType(NextElt, Infos, Tys, Context), 32);
+ case IIT_PTR:
+ return PointerType::getUnqual(DecodeFixedType(NextElt, Infos, Tys,Context));
+ case IIT_ANYPTR: { // [ANYPTR addrspace, subtype]
+ unsigned AddrSpace = Infos[NextElt++];
+ Type *PtrTy = DecodeFixedType(NextElt, Infos, Tys,Context);
+ return PointerType::get(PtrTy, AddrSpace);
+ }
+ case IIT_ARG:
+ case IIT_EXTEND_VEC_ARG:
+ case IIT_TRUNC_VEC_ARG: {
+ unsigned ArgNo = NextElt == Infos.size() ? 0 : Infos[NextElt++];
+ assert(ArgNo < Tys.size() && "Not enough types specified!");
+ Type *T = Tys[ArgNo];
+
+ if (Info == IIT_EXTEND_VEC_ARG)
+ T = VectorType::getExtendedElementVectorType(cast<VectorType>(T));
+ if (Info == IIT_TRUNC_VEC_ARG)
+ T = VectorType::getTruncatedElementVectorType(cast<VectorType>(T));
+ return T;
+ }
+ case IIT_STRUCT5: ++StructElts; // FALL THROUGH.
+ case IIT_STRUCT4: ++StructElts; // FALL THROUGH.
+ case IIT_STRUCT3: ++StructElts; // FALL THROUGH.
+ case IIT_STRUCT2: {
+ Type *Elts[5];
+ for (unsigned i = 0; i != StructElts; ++i)
+ Elts[i] = DecodeFixedType(NextElt, Infos, Tys, Context);
+ return StructType::get(Context, ArrayRef<Type*>(Elts, StructElts));
+ }
+ }
+ llvm_unreachable("unhandled");