summaryrefslogtreecommitdiffstats
path: root/clang/lib/CodeGen/CGBuiltin.cpp
diff options
context:
space:
mode:
authorKevin Qin <Kevin.Qin@arm.com>2013-12-10 06:49:01 +0000
committerKevin Qin <Kevin.Qin@arm.com>2013-12-10 06:49:01 +0000
commitfb79d7f8433f94544d4a5c12ae9bb21e2ba0b7b8 (patch)
treeb86a14a13d0ab80fc17206ca68054091078a3947 /clang/lib/CodeGen/CGBuiltin.cpp
parent04396d1e69f71a37b6aaf2f2d240007b24998127 (diff)
downloadbcm5719-llvm-fb79d7f8433f94544d4a5c12ae9bb21e2ba0b7b8.tar.gz
bcm5719-llvm-fb79d7f8433f94544d4a5c12ae9bb21e2ba0b7b8.zip
[AArch64 NEON] Support poly128_t and implement relevant intrinsic.
llvm-svn: 196888
Diffstat (limited to 'clang/lib/CodeGen/CGBuiltin.cpp')
-rw-r--r--clang/lib/CodeGen/CGBuiltin.cpp30
1 files changed, 30 insertions, 0 deletions
diff --git a/clang/lib/CodeGen/CGBuiltin.cpp b/clang/lib/CodeGen/CGBuiltin.cpp
index 108c0f08877..8bf50a0adb9 100644
--- a/clang/lib/CodeGen/CGBuiltin.cpp
+++ b/clang/lib/CodeGen/CGBuiltin.cpp
@@ -1624,6 +1624,11 @@ static llvm::VectorType *GetNeonType(CodeGenFunction *CGF,
case NeonTypeFlags::Int64:
case NeonTypeFlags::Poly64:
return llvm::VectorType::get(CGF->Int64Ty, V1Ty ? 1 : (1 << IsQuad));
+ case NeonTypeFlags::Poly128:
+ // FIXME: i128 and f128 doesn't get fully support in Clang and llvm.
+ // There is a lot of i128 and f128 API missing.
+ // so we use v16i8 to represent poly128 and get pattern matched.
+ return llvm::VectorType::get(CGF->Int8Ty, 16);
case NeonTypeFlags::Float32:
return llvm::VectorType::get(CGF->FloatTy, V1Ty ? 1 : (2 << IsQuad));
case NeonTypeFlags::Float64:
@@ -2555,6 +2560,9 @@ static Value *EmitAArch64ScalarBuiltinExpr(CodeGenFunction &CGF,
case AArch64::BI__builtin_neon_vcvtd_n_u64_f64:
Int = Intrinsic::aarch64_neon_vcvtd_n_u64_f64;
s = "fcvtzu"; OverloadInt = false; break;
+ case AArch64::BI__builtin_neon_vmull_p64:
+ Int = Intrinsic::aarch64_neon_vmull_p64;
+ s = "vmull"; OverloadInt = false; break;
}
if (!Int)
@@ -2908,6 +2916,28 @@ Value *CodeGenFunction::EmitAArch64BuiltinExpr(unsigned BuiltinID,
SmallVector<Value *, 4> Ops;
llvm::Value *Align = 0; // Alignment for load/store
+
+ if (BuiltinID == AArch64::BI__builtin_neon_vldrq_p128) {
+ Value *Op = EmitScalarExpr(E->getArg(0));
+ unsigned addressSpace =
+ cast<llvm::PointerType>(Op->getType())->getAddressSpace();
+ llvm::Type *Ty = llvm::Type::getFP128PtrTy(getLLVMContext(), addressSpace);
+ Op = Builder.CreateBitCast(Op, Ty);
+ Op = Builder.CreateLoad(Op);
+ Ty = llvm::Type::getIntNTy(getLLVMContext(), 128);
+ return Builder.CreateBitCast(Op, Ty);
+ }
+ if (BuiltinID == AArch64::BI__builtin_neon_vstrq_p128) {
+ Value *Op0 = EmitScalarExpr(E->getArg(0));
+ unsigned addressSpace =
+ cast<llvm::PointerType>(Op0->getType())->getAddressSpace();
+ llvm::Type *PTy = llvm::Type::getFP128PtrTy(getLLVMContext(), addressSpace);
+ Op0 = Builder.CreateBitCast(Op0, PTy);
+ Value *Op1 = EmitScalarExpr(E->getArg(1));
+ llvm::Type *Ty = llvm::Type::getFP128Ty(getLLVMContext());
+ Op1 = Builder.CreateBitCast(Op1, Ty);
+ return Builder.CreateStore(Op1, Op0);
+ }
for (unsigned i = 0, e = E->getNumArgs() - 1; i != e; i++) {
if (i == 0) {
switch (BuiltinID) {
OpenPOWER on IntegriCloud