зеркало из https://github.com/microsoft/clang-1.git
Add a variant of GCC-style vector types for ARM NEON.
NEON vector types need to be mangled in a special way to comply with ARM's ABI, similar to some of the AltiVec-specific vector types. This patch is mostly just renaming a bunch of "AltiVecSpecific" things, since they will no longer be specific to AltiVec. Besides that, it just adds the new "NeonVector" enum. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@118724 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Родитель
a66d3bb056
Коммит
e86d78cf47
|
@ -596,7 +596,7 @@ public:
|
|||
/// getVectorType - Return the unique reference to a vector type of
|
||||
/// the specified element type and size. VectorType must be a built-in type.
|
||||
QualType getVectorType(QualType VectorType, unsigned NumElts,
|
||||
VectorType::AltiVecSpecific AltiVecSpec);
|
||||
VectorType::VectorKind VecKind);
|
||||
|
||||
/// getExtVectorType - Return the unique reference to an extended vector type
|
||||
/// of the specified element type and size. VectorType must be a built-in
|
||||
|
|
|
@ -929,9 +929,9 @@ protected:
|
|||
|
||||
unsigned : NumTypeBits;
|
||||
|
||||
/// AltiVecSpec - AltiVec-specific vector information, used
|
||||
/// to differentiate things like 'pixel'.
|
||||
unsigned AltiVecSpec : 2;
|
||||
/// VecKind - The kind of vector, either a generic vector type or some
|
||||
/// target-specific vector type such as for AltiVec or Neon.
|
||||
unsigned VecKind : 2;
|
||||
|
||||
/// NumElements - The number of elements in the vector.
|
||||
unsigned NumElements : 30 - NumTypeBits;
|
||||
|
@ -1913,29 +1913,30 @@ public:
|
|||
/// client is responsible for converting the size into the number of elements.
|
||||
class VectorType : public Type, public llvm::FoldingSetNode {
|
||||
public:
|
||||
enum AltiVecSpecific {
|
||||
NotAltiVec, // is not AltiVec vector
|
||||
AltiVec, // is AltiVec vector
|
||||
Pixel, // is AltiVec 'vector Pixel'
|
||||
Bool // is AltiVec 'vector bool ...'
|
||||
enum VectorKind {
|
||||
GenericVector, // not a target-specific vector type
|
||||
AltiVecVector, // is AltiVec vector
|
||||
AltiVecPixel, // is AltiVec 'vector Pixel'
|
||||
AltiVecBool, // is AltiVec 'vector bool ...'
|
||||
NeonVector // is ARM Neon vector
|
||||
};
|
||||
protected:
|
||||
/// ElementType - The element type of the vector.
|
||||
QualType ElementType;
|
||||
|
||||
VectorType(QualType vecType, unsigned nElements, QualType canonType,
|
||||
AltiVecSpecific altiVecSpec) :
|
||||
VectorKind vecKind) :
|
||||
Type(Vector, canonType, vecType->isDependentType(),
|
||||
vecType->isVariablyModifiedType()), ElementType(vecType) {
|
||||
VectorTypeBits.AltiVecSpec = altiVecSpec;
|
||||
VectorTypeBits.VecKind = vecKind;
|
||||
VectorTypeBits.NumElements = nElements;
|
||||
}
|
||||
|
||||
VectorType(TypeClass tc, QualType vecType, unsigned nElements,
|
||||
QualType canonType, AltiVecSpecific altiVecSpec)
|
||||
QualType canonType, VectorKind vecKind)
|
||||
: Type(tc, canonType, vecType->isDependentType(),
|
||||
vecType->isVariablyModifiedType()), ElementType(vecType) {
|
||||
VectorTypeBits.AltiVecSpec = altiVecSpec;
|
||||
VectorTypeBits.VecKind = vecKind;
|
||||
VectorTypeBits.NumElements = nElements;
|
||||
}
|
||||
friend class ASTContext; // ASTContext creates these.
|
||||
|
@ -1950,21 +1951,21 @@ public:
|
|||
bool isSugared() const { return false; }
|
||||
QualType desugar() const { return QualType(this, 0); }
|
||||
|
||||
AltiVecSpecific getAltiVecSpecific() const {
|
||||
return AltiVecSpecific(VectorTypeBits.AltiVecSpec);
|
||||
VectorKind getVectorKind() const {
|
||||
return VectorKind(VectorTypeBits.VecKind);
|
||||
}
|
||||
|
||||
void Profile(llvm::FoldingSetNodeID &ID) {
|
||||
Profile(ID, getElementType(), getNumElements(),
|
||||
getTypeClass(), getAltiVecSpecific());
|
||||
getTypeClass(), getVectorKind());
|
||||
}
|
||||
static void Profile(llvm::FoldingSetNodeID &ID, QualType ElementType,
|
||||
unsigned NumElements, TypeClass TypeClass,
|
||||
AltiVecSpecific AltiVecSpec) {
|
||||
VectorKind VecKind) {
|
||||
ID.AddPointer(ElementType.getAsOpaquePtr());
|
||||
ID.AddInteger(NumElements);
|
||||
ID.AddInteger(TypeClass);
|
||||
ID.AddInteger(AltiVecSpec);
|
||||
ID.AddInteger(VecKind);
|
||||
}
|
||||
|
||||
static bool classof(const Type *T) {
|
||||
|
@ -1980,7 +1981,7 @@ public:
|
|||
/// points, colors, and textures (modeled after OpenGL Shading Language).
|
||||
class ExtVectorType : public VectorType {
|
||||
ExtVectorType(QualType vecType, unsigned nElements, QualType canonType) :
|
||||
VectorType(ExtVector, vecType, nElements, canonType, NotAltiVec) {}
|
||||
VectorType(ExtVector, vecType, nElements, canonType, GenericVector) {}
|
||||
friend class ASTContext; // ASTContext creates these.
|
||||
public:
|
||||
static int getPointAccessorIdx(char c) {
|
||||
|
|
|
@ -1602,7 +1602,7 @@ QualType ASTContext::getIncompleteArrayType(QualType EltTy,
|
|||
/// getVectorType - Return the unique reference to a vector type of
|
||||
/// the specified element type and size. VectorType must be a built-in type.
|
||||
QualType ASTContext::getVectorType(QualType vecType, unsigned NumElts,
|
||||
VectorType::AltiVecSpecific AltiVecSpec) {
|
||||
VectorType::VectorKind VecKind) {
|
||||
BuiltinType *BaseType;
|
||||
|
||||
BaseType = dyn_cast<BuiltinType>(getCanonicalType(vecType).getTypePtr());
|
||||
|
@ -1610,7 +1610,7 @@ QualType ASTContext::getVectorType(QualType vecType, unsigned NumElts,
|
|||
|
||||
// Check if we've already instantiated a vector of this type.
|
||||
llvm::FoldingSetNodeID ID;
|
||||
VectorType::Profile(ID, vecType, NumElts, Type::Vector, AltiVecSpec);
|
||||
VectorType::Profile(ID, vecType, NumElts, Type::Vector, VecKind);
|
||||
|
||||
void *InsertPos = 0;
|
||||
if (VectorType *VTP = VectorTypes.FindNodeOrInsertPos(ID, InsertPos))
|
||||
|
@ -1621,14 +1621,14 @@ QualType ASTContext::getVectorType(QualType vecType, unsigned NumElts,
|
|||
QualType Canonical;
|
||||
if (!vecType.isCanonical()) {
|
||||
Canonical = getVectorType(getCanonicalType(vecType), NumElts,
|
||||
VectorType::NotAltiVec);
|
||||
VectorType::GenericVector);
|
||||
|
||||
// Get the new insert position for the node we care about.
|
||||
VectorType *NewIP = VectorTypes.FindNodeOrInsertPos(ID, InsertPos);
|
||||
assert(NewIP == 0 && "Shouldn't be in the map!"); NewIP = NewIP;
|
||||
}
|
||||
VectorType *New = new (*this, TypeAlignment)
|
||||
VectorType(vecType, NumElts, Canonical, AltiVecSpec);
|
||||
VectorType(vecType, NumElts, Canonical, VecKind);
|
||||
VectorTypes.InsertNode(New, InsertPos);
|
||||
Types.push_back(New);
|
||||
return QualType(New, 0);
|
||||
|
@ -1645,7 +1645,7 @@ QualType ASTContext::getExtVectorType(QualType vecType, unsigned NumElts) {
|
|||
// Check if we've already instantiated a vector of this type.
|
||||
llvm::FoldingSetNodeID ID;
|
||||
VectorType::Profile(ID, vecType, NumElts, Type::ExtVector,
|
||||
VectorType::NotAltiVec);
|
||||
VectorType::GenericVector);
|
||||
void *InsertPos = 0;
|
||||
if (VectorType *VTP = VectorTypes.FindNodeOrInsertPos(ID, InsertPos))
|
||||
return QualType(VTP, 0);
|
||||
|
@ -4287,10 +4287,10 @@ bool ASTContext::areCompatibleVectorTypes(QualType FirstVec,
|
|||
// AltiVec vectors types are identical to equivalent GCC vector types
|
||||
const VectorType *First = FirstVec->getAs<VectorType>();
|
||||
const VectorType *Second = SecondVec->getAs<VectorType>();
|
||||
if ((((First->getAltiVecSpecific() == VectorType::AltiVec) &&
|
||||
(Second->getAltiVecSpecific() == VectorType::NotAltiVec)) ||
|
||||
((First->getAltiVecSpecific() == VectorType::NotAltiVec) &&
|
||||
(Second->getAltiVecSpecific() == VectorType::AltiVec))) &&
|
||||
if ((((First->getVectorKind() == VectorType::AltiVecVector) &&
|
||||
(Second->getVectorKind() == VectorType::GenericVector)) ||
|
||||
((First->getVectorKind() == VectorType::GenericVector) &&
|
||||
(Second->getVectorKind() == VectorType::AltiVecVector))) &&
|
||||
hasSameType(First->getElementType(), Second->getElementType()) &&
|
||||
(First->getNumElements() == Second->getNumElements()))
|
||||
return true;
|
||||
|
@ -5243,7 +5243,7 @@ QualType ASTContext::getCorrespondingUnsignedType(QualType T) {
|
|||
// Turn <4 x signed int> -> <4 x unsigned int>
|
||||
if (const VectorType *VTy = T->getAs<VectorType>())
|
||||
return getVectorType(getCorrespondingUnsignedType(VTy->getElementType()),
|
||||
VTy->getNumElements(), VTy->getAltiVecSpecific());
|
||||
VTy->getNumElements(), VTy->getVectorKind());
|
||||
|
||||
// For enums, we return the unsigned version of the base type.
|
||||
if (const EnumType *ETy = T->getAs<EnumType>())
|
||||
|
@ -5422,7 +5422,7 @@ static QualType DecodeTypeFromStr(const char *&Str, ASTContext &Context,
|
|||
|
||||
// TODO: No way to make AltiVec vectors in builtins yet.
|
||||
Type = Context.getVectorType(ElementType, NumElements,
|
||||
VectorType::NotAltiVec);
|
||||
VectorType::GenericVector);
|
||||
break;
|
||||
}
|
||||
case 'X': {
|
||||
|
|
|
@ -441,7 +441,7 @@ static bool IsStructurallyEquivalent(StructuralEquivalenceContext &Context,
|
|||
return false;
|
||||
if (Vec1->getNumElements() != Vec2->getNumElements())
|
||||
return false;
|
||||
if (Vec1->getAltiVecSpecific() != Vec2->getAltiVecSpecific())
|
||||
if (Vec1->getVectorKind() != Vec2->getVectorKind())
|
||||
return false;
|
||||
break;
|
||||
}
|
||||
|
@ -1190,7 +1190,7 @@ QualType ASTNodeImporter::VisitVectorType(VectorType *T) {
|
|||
|
||||
return Importer.getToContext().getVectorType(ToElementType,
|
||||
T->getNumElements(),
|
||||
T->getAltiVecSpecific());
|
||||
T->getVectorKind());
|
||||
}
|
||||
|
||||
QualType ASTNodeImporter::VisitExtVectorType(ExtVectorType *T) {
|
||||
|
|
|
@ -251,12 +251,12 @@ void TypePrinter::PrintDependentSizedExtVector(
|
|||
}
|
||||
|
||||
void TypePrinter::PrintVector(const VectorType *T, std::string &S) {
|
||||
if (T->getAltiVecSpecific() != VectorType::NotAltiVec) {
|
||||
if (T->getAltiVecSpecific() == VectorType::Pixel)
|
||||
if (T->getVectorKind() != VectorType::GenericVector) {
|
||||
if (T->getVectorKind() == VectorType::AltiVecPixel)
|
||||
S = "__vector __pixel " + S;
|
||||
else {
|
||||
Print(T->getElementType(), S);
|
||||
S = ((T->getAltiVecSpecific() == VectorType::Bool)
|
||||
S = ((T->getVectorKind() == VectorType::AltiVecBool)
|
||||
? "__vector __bool " : "__vector ") + S;
|
||||
}
|
||||
} else {
|
||||
|
|
|
@ -1411,9 +1411,9 @@ void CXXNameMangler::mangleType(const ComplexType *T) {
|
|||
// ::= p # AltiVec vector pixel
|
||||
void CXXNameMangler::mangleType(const VectorType *T) {
|
||||
Out << "Dv" << T->getNumElements() << '_';
|
||||
if (T->getAltiVecSpecific() == VectorType::Pixel)
|
||||
if (T->getVectorKind() == VectorType::AltiVecPixel)
|
||||
Out << 'p';
|
||||
else if (T->getAltiVecSpecific() == VectorType::Bool)
|
||||
else if (T->getVectorKind() == VectorType::AltiVecBool)
|
||||
Out << 'b';
|
||||
else
|
||||
mangleType(T->getElementType());
|
||||
|
|
|
@ -811,7 +811,7 @@ ExprResult Sema::SemaBuiltinShuffleVector(CallExpr *TheCall) {
|
|||
} else if (numElements != numResElements) {
|
||||
QualType eltType = LHSType->getAs<VectorType>()->getElementType();
|
||||
resType = Context.getVectorType(eltType, numResElements,
|
||||
VectorType::NotAltiVec);
|
||||
VectorType::GenericVector);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -914,7 +914,7 @@ void InitListChecker::CheckVectorType(const InitializedEntity &Entity,
|
|||
VecType = SemaRef.Context.getExtVectorType(elementType, numIElts);
|
||||
else
|
||||
VecType = SemaRef.Context.getVectorType(elementType, numIElts,
|
||||
IVT->getAltiVecSpecific());
|
||||
IVT->getVectorKind());
|
||||
CheckSubElementType(ElementEntity, IList, VecType, Index,
|
||||
StructuredList, StructuredIndex);
|
||||
numEltsInit += numIElts;
|
||||
|
|
|
@ -388,12 +388,12 @@ static QualType ConvertDeclSpecToType(Sema &TheSema,
|
|||
} else if (DS.isTypeAltiVecVector()) {
|
||||
unsigned typeSize = static_cast<unsigned>(Context.getTypeSize(Result));
|
||||
assert(typeSize > 0 && "type size for vector must be greater than 0 bits");
|
||||
VectorType::AltiVecSpecific AltiVecSpec = VectorType::AltiVec;
|
||||
VectorType::VectorKind VecKind = VectorType::AltiVecVector;
|
||||
if (DS.isTypeAltiVecPixel())
|
||||
AltiVecSpec = VectorType::Pixel;
|
||||
VecKind = VectorType::AltiVecPixel;
|
||||
else if (DS.isTypeAltiVecBool())
|
||||
AltiVecSpec = VectorType::Bool;
|
||||
Result = Context.getVectorType(Result, 128/typeSize, AltiVecSpec);
|
||||
VecKind = VectorType::AltiVecBool;
|
||||
Result = Context.getVectorType(Result, 128/typeSize, VecKind);
|
||||
}
|
||||
|
||||
// FIXME: Imaginary.
|
||||
|
@ -2044,7 +2044,7 @@ static void HandleVectorSizeAttr(QualType& CurType, const AttributeList &Attr,
|
|||
// Success! Instantiate the vector type, the number of elements is > 0, and
|
||||
// not required to be a power of 2, unlike GCC.
|
||||
CurType = S.Context.getVectorType(CurType, vectorSize/typeSize,
|
||||
VectorType::NotAltiVec);
|
||||
VectorType::GenericVector);
|
||||
}
|
||||
|
||||
void ProcessTypeAttributeList(Sema &S, QualType &Result,
|
||||
|
|
|
@ -440,7 +440,7 @@ public:
|
|||
/// By default, performs semantic analysis when building the vector type.
|
||||
/// Subclasses may override this routine to provide different behavior.
|
||||
QualType RebuildVectorType(QualType ElementType, unsigned NumElements,
|
||||
VectorType::AltiVecSpecific AltiVecSpec);
|
||||
VectorType::VectorKind VecKind);
|
||||
|
||||
/// \brief Build a new extended vector type given the element type and
|
||||
/// number of elements.
|
||||
|
@ -2841,7 +2841,7 @@ QualType TreeTransform<Derived>::TransformVectorType(TypeLocBuilder &TLB,
|
|||
if (getDerived().AlwaysRebuild() ||
|
||||
ElementType != T->getElementType()) {
|
||||
Result = getDerived().RebuildVectorType(ElementType, T->getNumElements(),
|
||||
T->getAltiVecSpecific());
|
||||
T->getVectorKind());
|
||||
if (Result.isNull())
|
||||
return QualType();
|
||||
}
|
||||
|
@ -6458,10 +6458,10 @@ TreeTransform<Derived>::RebuildDependentSizedArrayType(QualType ElementType,
|
|||
|
||||
template<typename Derived>
|
||||
QualType TreeTransform<Derived>::RebuildVectorType(QualType ElementType,
|
||||
unsigned NumElements,
|
||||
VectorType::AltiVecSpecific AltiVecSpec) {
|
||||
unsigned NumElements,
|
||||
VectorType::VectorKind VecKind) {
|
||||
// FIXME: semantic checking!
|
||||
return SemaRef.Context.getVectorType(ElementType, NumElements, AltiVecSpec);
|
||||
return SemaRef.Context.getVectorType(ElementType, NumElements, VecKind);
|
||||
}
|
||||
|
||||
template<typename Derived>
|
||||
|
|
|
@ -2783,9 +2783,9 @@ QualType ASTReader::ReadTypeRecord(unsigned Index) {
|
|||
|
||||
QualType ElementType = GetType(Record[0]);
|
||||
unsigned NumElements = Record[1];
|
||||
unsigned AltiVecSpec = Record[2];
|
||||
unsigned VecKind = Record[2];
|
||||
return Context->getVectorType(ElementType, NumElements,
|
||||
(VectorType::AltiVecSpecific)AltiVecSpec);
|
||||
(VectorType::VectorKind)VecKind);
|
||||
}
|
||||
|
||||
case TYPE_EXT_VECTOR: {
|
||||
|
|
|
@ -143,7 +143,7 @@ void ASTTypeWriter::VisitVariableArrayType(const VariableArrayType *T) {
|
|||
void ASTTypeWriter::VisitVectorType(const VectorType *T) {
|
||||
Writer.AddTypeRef(T->getElementType(), Record);
|
||||
Record.push_back(T->getNumElements());
|
||||
Record.push_back(T->getAltiVecSpecific());
|
||||
Record.push_back(T->getVectorKind());
|
||||
Code = TYPE_VECTOR;
|
||||
}
|
||||
|
||||
|
|
Загрузка…
Ссылка в новой задаче