diff options
author | Hao Liu <Hao.Liu@arm.com> | 2013-12-03 06:07:13 +0000 |
---|---|---|
committer | Hao Liu <Hao.Liu@arm.com> | 2013-12-03 06:07:13 +0000 |
commit | a5246fde9054fce345ccbc33a68bca25ba1d99d1 (patch) | |
tree | 832d754456b7c7b42f280e8b4f28985c5da7b018 /clang/lib | |
parent | dca64f4a2088e27228febc572163db841e88d81a (diff) | |
download | bcm5719-llvm-a5246fde9054fce345ccbc33a68bca25ba1d99d1.tar.gz bcm5719-llvm-a5246fde9054fce345ccbc33a68bca25ba1d99d1.zip |
[AArch64]Add missing floating point convert, round and misc intrinsics.
E.g. int64x1_t vcvt_s64_f64(float64x1_t a) -> FCVTZS Dd, Dn
llvm-svn: 196211
Diffstat (limited to 'clang/lib')
-rw-r--r-- | clang/lib/CodeGen/CGBuiltin.cpp | 29 |
1 files changed, 22 insertions, 7 deletions
diff --git a/clang/lib/CodeGen/CGBuiltin.cpp b/clang/lib/CodeGen/CGBuiltin.cpp index d15cd771dd1..97252cbfdbe 100644 --- a/clang/lib/CodeGen/CGBuiltin.cpp +++ b/clang/lib/CodeGen/CGBuiltin.cpp @@ -2952,6 +2952,7 @@ Value *CodeGenFunction::EmitAArch64BuiltinExpr(unsigned BuiltinID, // Determine the type of this overloaded NEON intrinsic. NeonTypeFlags Type(Result.getZExtValue()); bool usgn = Type.isUnsigned(); + bool quad = Type.isQuad(); llvm::VectorType *VTy = GetNeonType(this, Type); llvm::Type *Ty = VTy; @@ -3212,9 +3213,10 @@ Value *CodeGenFunction::EmitAArch64BuiltinExpr(unsigned BuiltinID, return EmitARMBuiltinExpr(ARM::BI__builtin_neon_vcvt_n_f32_v, E); case AArch64::BI__builtin_neon_vcvtq_n_f32_v: return EmitARMBuiltinExpr(ARM::BI__builtin_neon_vcvtq_n_f32_v, E); + case AArch64::BI__builtin_neon_vcvt_n_f64_v: case AArch64::BI__builtin_neon_vcvtq_n_f64_v: { llvm::Type *FloatTy = - GetNeonType(this, NeonTypeFlags(NeonTypeFlags::Float64, false, true)); + GetNeonType(this, NeonTypeFlags(NeonTypeFlags::Float64, false, quad)); llvm::Type *Tys[2] = { FloatTy, Ty }; Int = usgn ? Intrinsic::arm_neon_vcvtfxu2fp : Intrinsic::arm_neon_vcvtfxs2fp; @@ -3229,10 +3231,12 @@ Value *CodeGenFunction::EmitAArch64BuiltinExpr(unsigned BuiltinID, return EmitARMBuiltinExpr(ARM::BI__builtin_neon_vcvt_n_u32_v, E); case AArch64::BI__builtin_neon_vcvtq_n_u32_v: return EmitARMBuiltinExpr(ARM::BI__builtin_neon_vcvtq_n_u32_v, E); + case AArch64::BI__builtin_neon_vcvt_n_s64_v: + case AArch64::BI__builtin_neon_vcvt_n_u64_v: case AArch64::BI__builtin_neon_vcvtq_n_s64_v: case AArch64::BI__builtin_neon_vcvtq_n_u64_v: { llvm::Type *FloatTy = - GetNeonType(this, NeonTypeFlags(NeonTypeFlags::Float64, false, true)); + GetNeonType(this, NeonTypeFlags(NeonTypeFlags::Float64, false, quad)); llvm::Type *Tys[2] = { Ty, FloatTy }; Int = usgn ? Intrinsic::arm_neon_vcvtfp2fxu : Intrinsic::arm_neon_vcvtfp2fxs; @@ -3477,7 +3481,7 @@ Value *CodeGenFunction::EmitAArch64BuiltinExpr(unsigned BuiltinID, Quad = true; Ops[0] = Builder.CreateBitCast(Ops[0], DoubleTy); llvm::Type *VTy = GetNeonType(this, - NeonTypeFlags(NeonTypeFlags::Float64, false, Quad ? true : false)); + NeonTypeFlags(NeonTypeFlags::Float64, false, Quad)); Ops[1] = Builder.CreateBitCast(Ops[1], VTy); Ops[1] = Builder.CreateExtractElement(Ops[1], Ops[2], "extract"); Value *Result = Builder.CreateFMul(Ops[0], Ops[1]); @@ -3671,15 +3675,16 @@ Value *CodeGenFunction::EmitAArch64BuiltinExpr(unsigned BuiltinID, Int = Intrinsic::aarch64_neon_fcvtxn; return EmitNeonCall(CGM.getIntrinsic(Int, Tys), Ops, "vcvtx_f32_f64"); } - case AArch64::BI__builtin_neon_vcvt_f64_v: { + case AArch64::BI__builtin_neon_vcvt_f64_f32: { llvm::Type *OpTy = GetNeonType(this, NeonTypeFlags(NeonTypeFlags::Float32, false, false)); Ops[0] = Builder.CreateBitCast(Ops[0], OpTy); return Builder.CreateFPExt(Ops[0], Ty, "vcvt"); } + case AArch64::BI__builtin_neon_vcvt_f64_v: case AArch64::BI__builtin_neon_vcvtq_f64_v: { Ops[0] = Builder.CreateBitCast(Ops[0], Ty); - Ty = GetNeonType(this, NeonTypeFlags(NeonTypeFlags::Float64, false, true)); + Ty = GetNeonType(this, NeonTypeFlags(NeonTypeFlags::Float64, false, quad)); return usgn ? Builder.CreateUIToFP(Ops[0], Ty, "vcvt") : Builder.CreateSIToFP(Ops[0], Ty, "vcvt"); } @@ -3723,10 +3728,12 @@ Value *CodeGenFunction::EmitAArch64BuiltinExpr(unsigned BuiltinID, case AArch64::BI__builtin_neon_vcvtq_s32_v: case AArch64::BI__builtin_neon_vcvtq_u32_v: return EmitARMBuiltinExpr(ARM::BI__builtin_neon_vcvtq_u32_v, E); + case AArch64::BI__builtin_neon_vcvt_s64_v: + case AArch64::BI__builtin_neon_vcvt_u64_v: case AArch64::BI__builtin_neon_vcvtq_s64_v: case AArch64::BI__builtin_neon_vcvtq_u64_v: { llvm::Type *DoubleTy = - GetNeonType(this, NeonTypeFlags(NeonTypeFlags::Float64, false, true)); + GetNeonType(this, NeonTypeFlags(NeonTypeFlags::Float64, false, quad)); Ops[0] = Builder.CreateBitCast(Ops[0], DoubleTy); return usgn ? Builder.CreateFPToUI(Ops[0], Ty, "vcvt") : Builder.CreateFPToSI(Ops[0], Ty, "vcvt"); @@ -3738,6 +3745,7 @@ Value *CodeGenFunction::EmitAArch64BuiltinExpr(unsigned BuiltinID, Int = Intrinsic::aarch64_neon_fcvtns; return EmitNeonCall(CGM.getIntrinsic(Int, Tys), Ops, "vcvtns_f32"); } + case AArch64::BI__builtin_neon_vcvtn_s64_v: case AArch64::BI__builtin_neon_vcvtnq_s64_v: { llvm::Type *OpTy = llvm::VectorType::get(DoubleTy, VTy->getNumElements()); llvm::Type *Tys[2] = { Ty, OpTy }; @@ -3751,6 +3759,7 @@ Value *CodeGenFunction::EmitAArch64BuiltinExpr(unsigned BuiltinID, Int = Intrinsic::aarch64_neon_fcvtnu; return EmitNeonCall(CGM.getIntrinsic(Int, Tys), Ops, "vcvtnu_f32"); } + case AArch64::BI__builtin_neon_vcvtn_u64_v: case AArch64::BI__builtin_neon_vcvtnq_u64_v: { llvm::Type *OpTy = llvm::VectorType::get(DoubleTy, VTy->getNumElements()); llvm::Type *Tys[2] = { Ty, OpTy }; @@ -3764,6 +3773,7 @@ Value *CodeGenFunction::EmitAArch64BuiltinExpr(unsigned BuiltinID, Int = Intrinsic::aarch64_neon_fcvtps; return EmitNeonCall(CGM.getIntrinsic(Int, Tys), Ops, "vcvtps_f32"); } + case AArch64::BI__builtin_neon_vcvtp_s64_v: case AArch64::BI__builtin_neon_vcvtpq_s64_v: { llvm::Type *OpTy = llvm::VectorType::get(DoubleTy, VTy->getNumElements()); llvm::Type *Tys[2] = { Ty, OpTy }; @@ -3777,6 +3787,7 @@ Value *CodeGenFunction::EmitAArch64BuiltinExpr(unsigned BuiltinID, Int = Intrinsic::aarch64_neon_fcvtpu; return EmitNeonCall(CGM.getIntrinsic(Int, Tys), Ops, "vcvtpu_f32"); } + case AArch64::BI__builtin_neon_vcvtp_u64_v: case AArch64::BI__builtin_neon_vcvtpq_u64_v: { llvm::Type *OpTy = llvm::VectorType::get(DoubleTy, VTy->getNumElements()); llvm::Type *Tys[2] = { Ty, OpTy }; @@ -3790,6 +3801,7 @@ Value *CodeGenFunction::EmitAArch64BuiltinExpr(unsigned BuiltinID, Int = Intrinsic::aarch64_neon_fcvtms; return EmitNeonCall(CGM.getIntrinsic(Int, Tys), Ops, "vcvtms_f32"); } + case AArch64::BI__builtin_neon_vcvtm_s64_v: case AArch64::BI__builtin_neon_vcvtmq_s64_v: { llvm::Type *OpTy = llvm::VectorType::get(DoubleTy, VTy->getNumElements()); llvm::Type *Tys[2] = { Ty, OpTy }; @@ -3803,6 +3815,7 @@ Value *CodeGenFunction::EmitAArch64BuiltinExpr(unsigned BuiltinID, Int = Intrinsic::aarch64_neon_fcvtmu; return EmitNeonCall(CGM.getIntrinsic(Int, Tys), Ops, "vcvtmu_f32"); } + case AArch64::BI__builtin_neon_vcvtm_u64_v: case AArch64::BI__builtin_neon_vcvtmq_u64_v: { llvm::Type *OpTy = llvm::VectorType::get(DoubleTy, VTy->getNumElements()); llvm::Type *Tys[2] = { Ty, OpTy }; @@ -3816,6 +3829,7 @@ Value *CodeGenFunction::EmitAArch64BuiltinExpr(unsigned BuiltinID, Int = Intrinsic::aarch64_neon_fcvtas; return EmitNeonCall(CGM.getIntrinsic(Int, Tys), Ops, "vcvtas_f32"); } + case AArch64::BI__builtin_neon_vcvta_s64_v: case AArch64::BI__builtin_neon_vcvtaq_s64_v: { llvm::Type *OpTy = llvm::VectorType::get(DoubleTy, VTy->getNumElements()); llvm::Type *Tys[2] = { Ty, OpTy }; @@ -3829,6 +3843,7 @@ Value *CodeGenFunction::EmitAArch64BuiltinExpr(unsigned BuiltinID, Int = Intrinsic::aarch64_neon_fcvtau; return EmitNeonCall(CGM.getIntrinsic(Int, Tys), Ops, "vcvtau_f32"); } + case AArch64::BI__builtin_neon_vcvta_u64_v: case AArch64::BI__builtin_neon_vcvtaq_u64_v: { llvm::Type *OpTy = llvm::VectorType::get(DoubleTy, VTy->getNumElements()); llvm::Type *Tys[2] = { Ty, OpTy }; @@ -3843,7 +3858,7 @@ Value *CodeGenFunction::EmitAArch64BuiltinExpr(unsigned BuiltinID, return EmitARMBuiltinExpr(ARM::BI__builtin_neon_vrsqrte_v, E); case AArch64::BI__builtin_neon_vsqrt_v: case AArch64::BI__builtin_neon_vsqrtq_v: { - Int = Intrinsic::aarch64_neon_fsqrt; + Int = Intrinsic::sqrt; return EmitNeonCall(CGM.getIntrinsic(Int, Ty), Ops, "vsqrt"); } case AArch64::BI__builtin_neon_vcvt_f32_v: |