]> granicus.if.org Git - clang/commitdiff
OpenCL 1.0 Support:
authorNate Begeman <natebegeman@mac.com>
Fri, 26 Jun 2009 18:22:18 +0000 (18:22 +0000)
committerNate Begeman <natebegeman@mac.com>
Fri, 26 Jun 2009 18:22:18 +0000 (18:22 +0000)
Add support for scalar to vector and partially initialized vector constant initializers.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@74299 91177308-0d34-0410-b5e6-96231b3b80d8

lib/AST/ExprConstant.cpp
test/Sema/ext_vector_components.c

index 4815ae5c3b94390f73519ec5403314c3459f03c0..9d765924e02a2818ccb769ee64606001be0fcc07 100644 (file)
@@ -486,12 +486,28 @@ static bool EvaluateVector(const Expr* E, APValue& Result, EvalInfo &Info) {
 
 APValue VectorExprEvaluator::VisitCastExpr(const CastExpr* E) {
   const Expr* SE = E->getSubExpr();
+  QualType SETy = SE->getType();
+  APValue Result = APValue();
 
-  // Check for vector->vector bitcast.
-  if (SE->getType()->isVectorType())
+  // Check for vector->vector bitcast and scalar->vector splat.
+  if (SETy->isVectorType()) {
     return this->Visit(const_cast<Expr*>(SE));
+  } else if (SETy->isIntegerType()) {
+    APSInt IntResult;
+    if (EvaluateInteger(SE, IntResult, Info))
+      Result = APValue(IntResult);
+  } else if (SETy->isRealFloatingType()) {
+    APFloat F(0.0);
+    if (EvaluateFloat(SE, F, Info))
+      Result = APValue(F);
+  }
 
-  return APValue();
+  if (Result.isInt() || Result.isFloat()) {
+    unsigned NumElts = E->getType()->getAsVectorType()->getNumElements();
+    llvm::SmallVector<APValue, 4> Elts(NumElts, Result);
+    Result = APValue(&Elts[0], Elts.size());
+  }
+  return Result;
 }
 
 APValue 
index a5d270074ad0574229c9390da3010328ded7e185..48903024d3c61c0df39891b9ee09bae04a83feb2 100644 (file)
@@ -5,6 +5,8 @@ typedef __attribute__(( ext_vector_type(3) )) float float3;
 typedef __attribute__(( ext_vector_type(4) )) float float4;
 typedef __attribute__(( ext_vector_type(16) )) float float16;
 
+static float4 vec4_0 = (float4)0.5f;
+
 static void test() {
     float2 vec2, vec2_2;
     float3 vec3;