diff options
author | Bill Wendling <isanbard@gmail.com> | 2010-10-09 08:47:25 +0000 |
---|---|---|
committer | Bill Wendling <isanbard@gmail.com> | 2010-10-09 08:47:25 +0000 |
commit | aa51e513850688b7963efc62abf1eface7037602 (patch) | |
tree | ba1aa25a6a637e7bb248e2fd936754c12257a996 | |
parent | 83a1c5c8996a68d9be4e54de27565ce037785df1 (diff) |
Add target implementations for the X86 builtins:
__builtin_ia32_vec_init_v8qi
__builtin_ia32_vec_init_v4hi
__builtin_ia32_vec_init_v2si
They are lowered to bitcasts. (These are all ready tested by the gcc testsuite.)
<rdar://problem/8529957>
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@116147 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r-- | lib/CodeGen/CGBuiltin.cpp | 33 | ||||
-rw-r--r-- | lib/CodeGen/CodeGenFunction.h | 1 |
2 files changed, 33 insertions, 1 deletions
diff --git a/lib/CodeGen/CGBuiltin.cpp b/lib/CodeGen/CGBuiltin.cpp index 7213ee3f56..6d669c2dd2 100644 --- a/lib/CodeGen/CGBuiltin.cpp +++ b/lib/CodeGen/CGBuiltin.cpp @@ -1888,9 +1888,35 @@ Value *CodeGenFunction::EmitARMBuiltinExpr(unsigned BuiltinID, } } +llvm::Value *CodeGenFunction:: +BuildVector(const llvm::SmallVectorImpl<llvm::Value*> &Ops) { + assert((Ops.size() & (Ops.size() - 1)) == 0 && + "Not a power-of-two sized vector!"); + bool AllConstants = true; + for (unsigned i = 0, e = Ops.size(); i != e && AllConstants; ++i) + AllConstants &= isa<Constant>(Ops[i]); + + // If this is a constant vector, create a ConstantVector. + if (AllConstants) { + std::vector<llvm::Constant*> CstOps; + for (unsigned i = 0, e = Ops.size(); i != e; ++i) + CstOps.push_back(cast<Constant>(Ops[i])); + return llvm::ConstantVector::get(CstOps); + } + + // Otherwise, insertelement the values to build the vector. + Value *Result = + llvm::UndefValue::get(llvm::VectorType::get(Ops[0]->getType(), Ops.size())); + + for (unsigned i = 0, e = Ops.size(); i != e; ++i) + Result = Builder.CreateInsertElement(Result, Ops[i], + llvm::ConstantInt::get(llvm::Type::getInt32Ty(VMContext), i)); + + return Result; +} + Value *CodeGenFunction::EmitX86BuiltinExpr(unsigned BuiltinID, const CallExpr *E) { - llvm::SmallVector<Value*, 4> Ops; // Find out if any arguments are required to be integer constant expressions. @@ -1971,6 +1997,11 @@ Value *CodeGenFunction::EmitX86BuiltinExpr(unsigned BuiltinID, llvm::Function *F = CGM.getIntrinsic(ID); return Builder.CreateCall(F, &Ops[0], &Ops[0] + Ops.size(), name); } + case X86::BI__builtin_ia32_vec_init_v8qi: + case X86::BI__builtin_ia32_vec_init_v4hi: + case X86::BI__builtin_ia32_vec_init_v2si: + return Builder.CreateBitCast(BuildVector(Ops), + llvm::Type::getX86_MMXTy(VMContext)); case X86::BI__builtin_ia32_pslldi: case X86::BI__builtin_ia32_psllqi: case X86::BI__builtin_ia32_psllwi: diff --git a/lib/CodeGen/CodeGenFunction.h b/lib/CodeGen/CodeGenFunction.h index 2c8b1eaebe..cb9274388e 100644 --- a/lib/CodeGen/CodeGenFunction.h +++ b/lib/CodeGen/CodeGenFunction.h @@ -1515,6 +1515,7 @@ public: llvm::Value *EmitNeonShiftVector(llvm::Value *V, const llvm::Type *Ty, bool negateForRightShift); + llvm::Value *BuildVector(const llvm::SmallVectorImpl<llvm::Value*> &Ops); llvm::Value *EmitX86BuiltinExpr(unsigned BuiltinID, const CallExpr *E); llvm::Value *EmitPPCBuiltinExpr(unsigned BuiltinID, const CallExpr *E); |