]> granicus.if.org Git - clang/commitdiff
Add EmitShuffleVector helper method.
authorAnders Carlsson <andersca@mac.com>
Mon, 10 Dec 2007 19:35:18 +0000 (19:35 +0000)
committerAnders Carlsson <andersca@mac.com>
Mon, 10 Dec 2007 19:35:18 +0000 (19:35 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@44806 91177308-0d34-0410-b5e6-96231b3b80d8

CodeGen/CGExprScalar.cpp
CodeGen/CodeGenFunction.h

index a7ca2da04e34835f2efdd8f5e49ffd6552fbdb35..cb0599ca938b117a9b7c8b0d6eebce1b5d1d1884 100644 (file)
@@ -1057,3 +1057,33 @@ Value *CodeGenFunction::EmitComplexToScalarConversion(ComplexPairTy Src,
   return ScalarExprEmitter(*this).EmitComplexToScalarConversion(Src, SrcTy,
                                                                 DstTy);
 }
+
+Value *CodeGenFunction::EmitShuffleVector(Value* V1, Value *V2, ...) {
+  assert(V1->getType() == V2->getType() &&
+         "Vector operands must be of the same type");
+  
+  unsigned NumElements = 
+    cast<llvm::VectorType>(V1->getType())->getNumElements();
+  
+  va_list va;
+  va_start(va, V2);
+  
+  llvm::SmallVector<llvm::Constant*, 16> Args;
+  
+  for (unsigned i = 0; i < NumElements; i++) {
+    int n = va_arg(va, int);
+    
+    assert(n >= 0 && n < (int)NumElements * 2 && 
+           "Vector shuffle index out of bounds!");
+    
+    Args.push_back(llvm::ConstantInt::get(llvm::Type::Int32Ty, n));
+  }
+  
+  const char *Name = va_arg(va, const char *);
+  va_end(va);
+  
+  llvm::Constant *Mask = llvm::ConstantVector::get(&Args[0], NumElements);
+  
+  return Builder.CreateShuffleVector(V1, V2, Mask, Name);
+}
+
index 6ae256d4380762e2faa9e1fd1f50976a066f0a1d..d50db7da2c0d39da79569126198598a7cb45d9da 100644 (file)
@@ -391,6 +391,8 @@ public:
   llvm::Value *EmitX86BuiltinExpr(unsigned BuiltinID, const CallExpr *E);
   llvm::Value *EmitPPCBuiltinExpr(unsigned BuiltinID, const CallExpr *E);
   
+  llvm::Value *EmitShuffleVector(llvm::Value* V1, llvm::Value *V2, ...);
+                                 
   llvm::Value *EmitObjCStringLiteral(const ObjCStringLiteral *E);
 
   //===--------------------------------------------------------------------===//