diff options
| author | Tim Northover <tnorthover@apple.com> | 2014-02-04 14:55:52 +0000 |
|---|---|---|
| committer | Tim Northover <tnorthover@apple.com> | 2014-02-04 14:55:52 +0000 |
| commit | 7ffb2c5523ad37c49644bb6edbd9220b4120136f (patch) | |
| tree | 2e6f502fbf1ca6839b5af792c544eba0198e7fb4 /clang/lib/CodeGen/CGBuiltin.cpp | |
| parent | fdbdb4b6d5f8dffde01f0208efc7b19e6b879060 (diff) | |
| download | bcm5719-llvm-7ffb2c5523ad37c49644bb6edbd9220b4120136f.tar.gz bcm5719-llvm-7ffb2c5523ad37c49644bb6edbd9220b4120136f.zip | |
ARM & AArch64: combine implementation of vcaXYZ intrinsics
Now that the back-end intrinsics are more regular, there's no need for the
special handling these got in the front-end, so they can be moved to
EmitCommonNeonBuiltinExpr.
llvm-svn: 200769
Diffstat (limited to 'clang/lib/CodeGen/CGBuiltin.cpp')
| -rw-r--r-- | clang/lib/CodeGen/CGBuiltin.cpp | 104 |
1 files changed, 24 insertions, 80 deletions
diff --git a/clang/lib/CodeGen/CGBuiltin.cpp b/clang/lib/CodeGen/CGBuiltin.cpp index f5c76607f15..01b3c9a37ce 100644 --- a/clang/lib/CodeGen/CGBuiltin.cpp +++ b/clang/lib/CodeGen/CGBuiltin.cpp @@ -1815,6 +1815,30 @@ Value *CodeGenFunction::EmitCommonNeonBuiltinExpr(unsigned BuiltinID, case NEON::BI__builtin_neon_vbslq_v: return EmitNeonCall(CGM.getIntrinsic(Intrinsic::arm_neon_vbsl, Ty), Ops, "vbsl"); + case NEON::BI__builtin_neon_vcale_v: + case NEON::BI__builtin_neon_vcaleq_v: + std::swap(Ops[0], Ops[1]); + case NEON::BI__builtin_neon_vcage_v: + case NEON::BI__builtin_neon_vcageq_v: { + llvm::Type *VecFlt = llvm::VectorType::get( + VTy->getScalarSizeInBits() == 32 ? FloatTy : DoubleTy, + VTy->getNumElements()); + llvm::Type *Tys[] = { VTy, VecFlt }; + Function *F = CGM.getIntrinsic(Intrinsic::arm_neon_vacge, Tys); + return EmitNeonCall(F, Ops, "vcage"); + } + case NEON::BI__builtin_neon_vcalt_v: + case NEON::BI__builtin_neon_vcaltq_v: + std::swap(Ops[0], Ops[1]); + case NEON::BI__builtin_neon_vcagt_v: + case NEON::BI__builtin_neon_vcagtq_v: { + llvm::Type *VecFlt = llvm::VectorType::get( + VTy->getScalarSizeInBits() == 32 ? FloatTy : DoubleTy, + VTy->getNumElements()); + llvm::Type *Tys[] = { VTy, VecFlt }; + Function *F = CGM.getIntrinsic(Intrinsic::arm_neon_vacgt, Tys); + return EmitNeonCall(F, Ops, "vcagt"); + } case NEON::BI__builtin_neon_vcls_v: case NEON::BI__builtin_neon_vclsq_v: { Function *F = CGM.getIntrinsic(Intrinsic::arm_neon_vcls, Ty); @@ -3578,62 +3602,6 @@ Value *CodeGenFunction::EmitAArch64BuiltinExpr(unsigned BuiltinID, // AArch64 builtins mapping to legacy ARM v7 builtins. // FIXME: the mapped builtins listed correspond to what has been tested // in aarch64-neon-intrinsics.c so far. - case NEON::BI__builtin_neon_vcale_v: - if (VTy->getVectorNumElements() == 1) { - std::swap(Ops[0], Ops[1]); - } else { - return EmitARMBuiltinExpr(NEON::BI__builtin_neon_vcale_v, E); - } - case NEON::BI__builtin_neon_vcage_v: - if (VTy->getVectorNumElements() == 1) { - // Determine the types of this overloaded AArch64 intrinsic - SmallVector<llvm::Type *, 3> Tys; - Tys.push_back(VTy); - VTy = llvm::VectorType::get(DoubleTy, 1); - Tys.push_back(VTy); - Tys.push_back(VTy); - Function *F = CGM.getIntrinsic(Intrinsic::aarch64_neon_vcage, Tys); - return EmitNeonCall(F, Ops, "vcage"); - } - return EmitARMBuiltinExpr(NEON::BI__builtin_neon_vcage_v, E); - case NEON::BI__builtin_neon_vcaleq_v: - std::swap(Ops[0], Ops[1]); - case NEON::BI__builtin_neon_vcageq_v: { - Function *F; - if (VTy->getElementType()->isIntegerTy(64)) - F = CGM.getIntrinsic(Intrinsic::aarch64_neon_vacgeq); - else - F = CGM.getIntrinsic(Intrinsic::arm_neon_vacgeq); - return EmitNeonCall(F, Ops, "vcage"); - } - case NEON::BI__builtin_neon_vcalt_v: - if (VTy->getVectorNumElements() == 1) { - std::swap(Ops[0], Ops[1]); - } else { - return EmitARMBuiltinExpr(NEON::BI__builtin_neon_vcalt_v, E); - } - case NEON::BI__builtin_neon_vcagt_v: - if (VTy->getVectorNumElements() == 1) { - // Determine the types of this overloaded AArch64 intrinsic - SmallVector<llvm::Type *, 3> Tys; - Tys.push_back(VTy); - VTy = llvm::VectorType::get(DoubleTy, 1); - Tys.push_back(VTy); - Tys.push_back(VTy); - Function *F = CGM.getIntrinsic(Intrinsic::aarch64_neon_vcagt, Tys); - return EmitNeonCall(F, Ops, "vcagt"); - } - return EmitARMBuiltinExpr(NEON::BI__builtin_neon_vcagt_v, E); - case NEON::BI__builtin_neon_vcaltq_v: - std::swap(Ops[0], Ops[1]); - case NEON::BI__builtin_neon_vcagtq_v: { - Function *F; - if (VTy->getElementType()->isIntegerTy(64)) - F = CGM.getIntrinsic(Intrinsic::aarch64_neon_vacgtq); - else - F = CGM.getIntrinsic(Intrinsic::arm_neon_vacgtq); - return EmitNeonCall(F, Ops, "vcagt"); - } // Shift by immediate case NEON::BI__builtin_neon_vrshr_n_v: @@ -4551,30 +4519,6 @@ Value *CodeGenFunction::EmitARMBuiltinExpr(unsigned BuiltinID, case NEON::BI__builtin_neon_vabsq_v: return EmitNeonCall(CGM.getIntrinsic(Intrinsic::arm_neon_vabs, Ty), Ops, "vabs"); - case NEON::BI__builtin_neon_vcale_v: - std::swap(Ops[0], Ops[1]); - case NEON::BI__builtin_neon_vcage_v: { - Function *F = CGM.getIntrinsic(Intrinsic::arm_neon_vacged); - return EmitNeonCall(F, Ops, "vcage"); - } - case NEON::BI__builtin_neon_vcaleq_v: - std::swap(Ops[0], Ops[1]); - case NEON::BI__builtin_neon_vcageq_v: { - Function *F = CGM.getIntrinsic(Intrinsic::arm_neon_vacgeq); - return EmitNeonCall(F, Ops, "vcage"); - } - case NEON::BI__builtin_neon_vcalt_v: - std::swap(Ops[0], Ops[1]); - case NEON::BI__builtin_neon_vcagt_v: { - Function *F = CGM.getIntrinsic(Intrinsic::arm_neon_vacgtd); - return EmitNeonCall(F, Ops, "vcagt"); - } - case NEON::BI__builtin_neon_vcaltq_v: - std::swap(Ops[0], Ops[1]); - case NEON::BI__builtin_neon_vcagtq_v: { - Function *F = CGM.getIntrinsic(Intrinsic::arm_neon_vacgtq); - return EmitNeonCall(F, Ops, "vcagt"); - } case NEON::BI__builtin_neon_vld1q_lane_v: // Handle 64-bit integer elements as a special case. Use shuffles of // one-element vectors to avoid poor code for i64 in the backend. |

