Add CK_VectorSplat and use it for casting non-pointer scalars to ExtVectors.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@84245 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Anders Carlsson 2009-10-16 05:23:41 +00:00
Родитель c351632d48
Коммит 16a8904f3f
4 изменённых файлов: 28 добавлений и 11 удалений

Просмотреть файл

@ -1402,7 +1402,12 @@ public:
CK_PointerToIntegral, CK_PointerToIntegral,
/// CK_ToVoid - Cast to void. /// CK_ToVoid - Cast to void.
CK_ToVoid CK_ToVoid,
/// CK_VectorSplat - Casting from an integer/floating type to an extended
/// vector type with the same element type as the src type. Splats the
/// src expression into the destionation expression.
CK_VectorSplat
}; };
private: private:

Просмотреть файл

@ -428,6 +428,8 @@ const char *CastExpr::getCastKindName() const {
return "PointerToIntegral"; return "PointerToIntegral";
case CastExpr::CK_ToVoid: case CastExpr::CK_ToVoid:
return "ToVoid"; return "ToVoid";
case CastExpr::CK_VectorSplat:
return "VectorSplat";
} }
assert(0 && "Unhandled cast kind!"); assert(0 && "Unhandled cast kind!");

Просмотреть файл

@ -3669,7 +3669,8 @@ public:
// We allow casting between vectors and integer datatypes of the same size, // We allow casting between vectors and integer datatypes of the same size,
// or vectors and the element type of that vector. // or vectors and the element type of that vector.
// returns true if the cast is invalid // returns true if the cast is invalid
bool CheckExtVectorCast(SourceRange R, QualType VectorTy, QualType Ty); bool CheckExtVectorCast(SourceRange R, QualType VectorTy, Expr *&CastExpr,
CastExpr::CastKind &Kind);
/// CXXCheckCStyleCast - Check constraints of a C-style or function-style /// CXXCheckCStyleCast - Check constraints of a C-style or function-style
/// cast under C++ semantics. /// cast under C++ semantics.

Просмотреть файл

@ -3205,10 +3205,8 @@ bool Sema::CheckCastTypes(SourceRange TyR, QualType castType, Expr *&castExpr,
<< castExpr->getType() << castExpr->getSourceRange(); << castExpr->getType() << castExpr->getSourceRange();
} }
if (castType->isExtVectorType()) { if (castType->isExtVectorType())
// FIXME: Set the cast kind. return CheckExtVectorCast(TyR, castType, castExpr, Kind);
return CheckExtVectorCast(TyR, castType, castExpr->getType());
}
if (castType->isVectorType()) if (castType->isVectorType())
return CheckVectorCast(TyR, castType, castExpr->getType(), Kind); return CheckVectorCast(TyR, castType, castExpr->getType(), Kind);
@ -3218,6 +3216,9 @@ bool Sema::CheckCastTypes(SourceRange TyR, QualType castType, Expr *&castExpr,
if (getLangOptions().ObjC1 && isa<ObjCSuperExpr>(castExpr)) if (getLangOptions().ObjC1 && isa<ObjCSuperExpr>(castExpr))
return Diag(castExpr->getLocStart(), diag::err_illegal_super_cast) << TyR; return Diag(castExpr->getLocStart(), diag::err_illegal_super_cast) << TyR;
if (isa<ObjCSelectorExpr>(castExpr))
return Diag(castExpr->getLocStart(), diag::err_cast_selector_expr);
if (!castType->isArithmeticType()) { if (!castType->isArithmeticType()) {
QualType castExprType = castExpr->getType(); QualType castExprType = castExpr->getType();
if (!castExprType->isIntegralType() && castExprType->isArithmeticType()) if (!castExprType->isIntegralType() && castExprType->isArithmeticType())
@ -3230,8 +3231,7 @@ bool Sema::CheckCastTypes(SourceRange TyR, QualType castType, Expr *&castExpr,
diag::err_cast_pointer_to_non_pointer_int) diag::err_cast_pointer_to_non_pointer_int)
<< castType << castExpr->getSourceRange(); << castType << castExpr->getSourceRange();
} }
if (isa<ObjCSelectorExpr>(castExpr))
return Diag(castExpr->getLocStart(), diag::err_cast_selector_expr);
return false; return false;
} }
@ -3255,15 +3255,19 @@ bool Sema::CheckVectorCast(SourceRange R, QualType VectorTy, QualType Ty,
return false; return false;
} }
bool Sema::CheckExtVectorCast(SourceRange R, QualType DestTy, QualType SrcTy) { bool Sema::CheckExtVectorCast(SourceRange R, QualType DestTy, Expr *&CastExpr,
CastExpr::CastKind &Kind) {
assert(DestTy->isExtVectorType() && "Not an extended vector type!"); assert(DestTy->isExtVectorType() && "Not an extended vector type!");
QualType SrcTy = CastExpr->getType();
// If SrcTy is a VectorType, the total size must match to explicitly cast to // If SrcTy is a VectorType, the total size must match to explicitly cast to
// an ExtVectorType. // an ExtVectorType.
if (SrcTy->isVectorType()) { if (SrcTy->isVectorType()) {
if (Context.getTypeSize(DestTy) != Context.getTypeSize(SrcTy)) if (Context.getTypeSize(DestTy) != Context.getTypeSize(SrcTy))
return Diag(R.getBegin(),diag::err_invalid_conversion_between_ext_vectors) return Diag(R.getBegin(),diag::err_invalid_conversion_between_ext_vectors)
<< DestTy << SrcTy << R; << DestTy << SrcTy << R;
Kind = CastExpr::CK_BitCast;
return false; return false;
} }
@ -3274,6 +3278,11 @@ bool Sema::CheckExtVectorCast(SourceRange R, QualType DestTy, QualType SrcTy) {
return Diag(R.getBegin(), return Diag(R.getBegin(),
diag::err_invalid_conversion_between_vector_and_scalar) diag::err_invalid_conversion_between_vector_and_scalar)
<< DestTy << SrcTy << R; << DestTy << SrcTy << R;
// FIXME: Pass a cast kind to the implicit cast expr.
ImpCastExprToType(CastExpr, DestTy->getAs<ExtVectorType>()->getElementType());
Kind = CastExpr::CK_VectorSplat;
return false; return false;
} }