aboutsummaryrefslogtreecommitdiff
path: root/clang/lib/Sema/SemaHLSL.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'clang/lib/Sema/SemaHLSL.cpp')
-rw-r--r--clang/lib/Sema/SemaHLSL.cpp57
1 files changed, 45 insertions, 12 deletions
diff --git a/clang/lib/Sema/SemaHLSL.cpp b/clang/lib/Sema/SemaHLSL.cpp
index 94a490a..b9707f0 100644
--- a/clang/lib/Sema/SemaHLSL.cpp
+++ b/clang/lib/Sema/SemaHLSL.cpp
@@ -2802,6 +2802,23 @@ static bool CheckUnsignedIntRepresentation(Sema *S, SourceLocation Loc,
return false;
}
+static bool CheckExpectedBitWidth(Sema *S, CallExpr *TheCall,
+ unsigned ArgOrdinal, unsigned Width) {
+ QualType ArgTy = TheCall->getArg(0)->getType();
+ if (auto *VTy = ArgTy->getAs<VectorType>())
+ ArgTy = VTy->getElementType();
+ // ensure arg type has expected bit width
+ uint64_t ElementBitCount =
+ S->getASTContext().getTypeSizeInChars(ArgTy).getQuantity() * 8;
+ if (ElementBitCount != Width) {
+ S->Diag(TheCall->getArg(0)->getBeginLoc(),
+ diag::err_integer_incorrect_bit_count)
+ << Width << ElementBitCount;
+ return true;
+ }
+ return false;
+}
+
static void SetElementTypeAsReturnType(Sema *S, CallExpr *TheCall,
QualType ReturnType) {
auto *VecTyA = TheCall->getArg(0)->getType()->getAs<VectorType>();
@@ -2961,24 +2978,16 @@ bool SemaHLSL::CheckBuiltinFunctionCall(unsigned BuiltinID, CallExpr *TheCall) {
CheckUnsignedIntVecRepresentation))
return true;
- auto *VTy = TheCall->getArg(0)->getType()->getAs<VectorType>();
// ensure arg integers are 32-bits
- uint64_t ElementBitCount = getASTContext()
- .getTypeSizeInChars(VTy->getElementType())
- .getQuantity() *
- 8;
- if (ElementBitCount != 32) {
- SemaRef.Diag(TheCall->getBeginLoc(),
- diag::err_integer_incorrect_bit_count)
- << 32 << ElementBitCount;
+ if (CheckExpectedBitWidth(&SemaRef, TheCall, 0, 32))
return true;
- }
// ensure both args are vectors of total bit size of a multiple of 64
+ auto *VTy = TheCall->getArg(0)->getType()->getAs<VectorType>();
int NumElementsArg = VTy->getNumElements();
if (NumElementsArg != 2 && NumElementsArg != 4) {
SemaRef.Diag(TheCall->getBeginLoc(), diag::err_vector_incorrect_bit_count)
- << 1 /*a multiple of*/ << 64 << NumElementsArg * ElementBitCount;
+ << 1 /*a multiple of*/ << 64 << NumElementsArg * 32;
return true;
}
@@ -3295,7 +3304,7 @@ bool SemaHLSL::CheckBuiltinFunctionCall(unsigned BuiltinID, CallExpr *TheCall) {
break;
}
// Note these are llvm builtins that we want to catch invalid intrinsic
- // generation. Normal handling of these builitns will occur elsewhere.
+ // generation. Normal handling of these builtins will occur elsewhere.
case Builtin::BI__builtin_elementwise_bitreverse: {
// does not include a check for number of arguments
// because that is done previously
@@ -3405,6 +3414,30 @@ bool SemaHLSL::CheckBuiltinFunctionCall(unsigned BuiltinID, CallExpr *TheCall) {
}
break;
}
+ case Builtin::BI__builtin_hlsl_elementwise_f16tof32: {
+ if (SemaRef.checkArgCount(TheCall, 1))
+ return true;
+ if (CheckAllArgTypesAreCorrect(&SemaRef, TheCall,
+ CheckUnsignedIntRepresentation))
+ return true;
+ // ensure arg integers are 32 bits
+ if (CheckExpectedBitWidth(&SemaRef, TheCall, 0, 32))
+ return true;
+ // check it wasn't a bool type
+ QualType ArgTy = TheCall->getArg(0)->getType();
+ if (auto *VTy = ArgTy->getAs<VectorType>())
+ ArgTy = VTy->getElementType();
+ if (ArgTy->isBooleanType()) {
+ SemaRef.Diag(TheCall->getArg(0)->getBeginLoc(),
+ diag::err_builtin_invalid_arg_type)
+ << 1 << /* scalar or vector of */ 5 << /* unsigned int */ 3
+ << /* no fp */ 0 << TheCall->getArg(0)->getType();
+ return true;
+ }
+
+ SetElementTypeAsReturnType(&SemaRef, TheCall, getASTContext().FloatTy);
+ break;
+ }
}
return false;
}