зеркало из https://github.com/microsoft/clang-1.git
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:
Родитель
c351632d48
Коммит
16a8904f3f
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Загрузка…
Ссылка в новой задаче