diff options
-rw-r--r-- | CodeGen/CGBuiltin.cpp | 6 | ||||
-rw-r--r-- | CodeGen/CGExprScalar.cpp | 34 | ||||
-rw-r--r-- | CodeGen/CodeGenFunction.h | 3 |
3 files changed, 42 insertions, 1 deletions
diff --git a/CodeGen/CGBuiltin.cpp b/CodeGen/CGBuiltin.cpp index 4225f26e75..efcae98156 100644 --- a/CodeGen/CGBuiltin.cpp +++ b/CodeGen/CGBuiltin.cpp @@ -293,6 +293,12 @@ Value *CodeGenFunction::EmitX86BuiltinExpr(unsigned BuiltinID, (i & 0x30) >> 4, (i & 0xc0) >> 6, "pshufd"); } + case X86::BI__builtin_ia32_vec_init_v4hi: + case X86::BI__builtin_ia32_vec_init_v8qi: + case X86::BI__builtin_ia32_vec_init_v2si: + return EmitVector(&Ops[0], Ops.size()); + case X86::BI__builtin_ia32_vec_ext_v2si: + return Builder.CreateExtractElement(Ops[0], Ops[1], "result"); } } diff --git a/CodeGen/CGExprScalar.cpp b/CodeGen/CGExprScalar.cpp index 5ef7496a66..b51d4a788f 100644 --- a/CodeGen/CGExprScalar.cpp +++ b/CodeGen/CGExprScalar.cpp @@ -1099,3 +1099,37 @@ Value *CodeGenFunction::EmitShuffleVector(Value* V1, Value *V2, ...) { return Builder.CreateShuffleVector(V1, V2, Mask, Name); } +llvm::Value *CodeGenFunction::EmitVector(llvm::Value * const *Vals, + unsigned NumVals) +{ + bool AllConstElements = true; + + for (unsigned i = 0; i < NumVals; i++) { + if (!isa<llvm::Constant>(Vals[i])) { + AllConstElements = false; + break; + } + } + + assert(!(NumVals & NumVals - 1) && + "Number of elements must be power of two!"); + + if (AllConstElements) { + llvm::SmallVector<llvm::Constant*, 16> Constants; + + for (unsigned i = 0, e = NumVals; i != e; ++i) + Constants.push_back(cast<llvm::Constant>(Vals[i])); + + return llvm::ConstantVector::get(&Constants[0], Constants.size()); + } + + llvm::Value *Vec + = llvm::UndefValue::get(llvm::VectorType::get(Vals[0]->getType(), NumVals)); + + for (unsigned i = 0, e = NumVals ; i != e; ++i) { + llvm::Value *Idx = llvm::ConstantInt::get(llvm::Type::Int32Ty, i); + Vec = Builder.CreateInsertElement(Vec, Vals[i], Idx, "tmp"); + } + + return Vec; +} diff --git a/CodeGen/CodeGenFunction.h b/CodeGen/CodeGenFunction.h index d50db7da2c..3b51d43de9 100644 --- a/CodeGen/CodeGenFunction.h +++ b/CodeGen/CodeGenFunction.h @@ -392,7 +392,8 @@ public: llvm::Value *EmitPPCBuiltinExpr(unsigned BuiltinID, const CallExpr *E); llvm::Value *EmitShuffleVector(llvm::Value* V1, llvm::Value *V2, ...); - + llvm::Value *EmitVector(llvm::Value * const *Vals, unsigned NumVals); + llvm::Value *EmitObjCStringLiteral(const ObjCStringLiteral *E); //===--------------------------------------------------------------------===// |