diff options
author | Anders Carlsson <andersca@mac.com> | 2007-12-10 19:35:18 +0000 |
---|---|---|
committer | Anders Carlsson <andersca@mac.com> | 2007-12-10 19:35:18 +0000 |
commit | cc23acae84c6d5c37b4805edbcd95ee5d821c400 (patch) | |
tree | a9b8fdb46a7b8f2e2e3aba0fe7079bd7df4e665e | |
parent | c099b9a94f52f9d2c9135cfcfbc32bc17401500b (diff) |
Add EmitShuffleVector helper method.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@44806 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r-- | CodeGen/CGExprScalar.cpp | 30 | ||||
-rw-r--r-- | CodeGen/CodeGenFunction.h | 2 |
2 files changed, 32 insertions, 0 deletions
diff --git a/CodeGen/CGExprScalar.cpp b/CodeGen/CGExprScalar.cpp index a7ca2da04e..cb0599ca93 100644 --- a/CodeGen/CGExprScalar.cpp +++ b/CodeGen/CGExprScalar.cpp @@ -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); +} + diff --git a/CodeGen/CodeGenFunction.h b/CodeGen/CodeGenFunction.h index 6ae256d438..d50db7da2c 100644 --- a/CodeGen/CodeGenFunction.h +++ b/CodeGen/CodeGenFunction.h @@ -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); //===--------------------------------------------------------------------===// |