We now support all MMX intrinsics. SSE intrinsics are next.

llvm-svn: 45062
This commit is contained in:
Anders Carlsson 2007-12-15 21:23:30 +00:00
parent 60a288ab19
commit f5f6544edc
3 changed files with 42 additions and 1 deletions

View File

@ -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");
}
}

View File

@ -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;
}

View File

@ -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);
//===--------------------------------------------------------------------===//