diff options
author | Sander de Smalen <sander.desmalen@arm.com> | 2020-05-12 11:01:18 +0100 |
---|---|---|
committer | Sander de Smalen <sander.desmalen@arm.com> | 2020-05-12 11:02:32 +0100 |
commit | d6936be2ef8ce5d5d85b8a6cdd1477cd79688c3a (patch) | |
tree | 2deaf2f5aa718885cf38a45b80a545a84aefd8e3 /clang/lib | |
parent | 9682d0d5dcc50d4583709bcb2e63f1ad630fe9a0 (diff) | |
download | llvm-d6936be2ef8ce5d5d85b8a6cdd1477cd79688c3a.zip llvm-d6936be2ef8ce5d5d85b8a6cdd1477cd79688c3a.tar.gz llvm-d6936be2ef8ce5d5d85b8a6cdd1477cd79688c3a.tar.bz2 |
[SveEmitter] Add builtins for svdup and svindex
Reviewed By: efriedma
Differential Revision: https://reviews.llvm.org/D79357
Diffstat (limited to 'clang/lib')
-rw-r--r-- | clang/lib/CodeGen/CGBuiltin.cpp | 20 | ||||
-rw-r--r-- | clang/lib/CodeGen/CodeGenFunction.h | 1 |
2 files changed, 18 insertions, 3 deletions
diff --git a/clang/lib/CodeGen/CGBuiltin.cpp b/clang/lib/CodeGen/CGBuiltin.cpp index 541dac7..47620c1 100644 --- a/clang/lib/CodeGen/CGBuiltin.cpp +++ b/clang/lib/CodeGen/CGBuiltin.cpp @@ -7909,12 +7909,15 @@ Value *CodeGenFunction::EmitSVEMaskedStore(const CallExpr *E, // Limit the usage of scalable llvm IR generated by the ACLE by using the // sve dup.x intrinsic instead of IRBuilder::CreateVectorSplat. -Value *CodeGenFunction::EmitSVEDupX(Value* Scalar) { - auto F = CGM.getIntrinsic(Intrinsic::aarch64_sve_dup_x, - getSVEVectorForElementType(Scalar->getType())); +Value *CodeGenFunction::EmitSVEDupX(Value *Scalar, llvm::Type *Ty) { + auto F = CGM.getIntrinsic(Intrinsic::aarch64_sve_dup_x, Ty); return Builder.CreateCall(F, Scalar); } +Value *CodeGenFunction::EmitSVEDupX(Value* Scalar) { + return EmitSVEDupX(Scalar, getSVEVectorForElementType(Scalar->getType())); +} + Value *CodeGenFunction::EmitSVEReinterpret(Value *Val, llvm::Type *Ty) { // FIXME: For big endian this needs an additional REV, or needs a separate // intrinsic that is code-generated as a no-op, because the LLVM bitcast @@ -8109,6 +8112,17 @@ Value *CodeGenFunction::EmitAArch64SVEBuiltinExpr(unsigned BuiltinID, case SVE::BI__builtin_sve_svpmullb_n_u64: return EmitSVEPMull(TypeFlags, Ops, Intrinsic::aarch64_sve_pmullb_pair); + case SVE::BI__builtin_sve_svdup_n_b8: + case SVE::BI__builtin_sve_svdup_n_b16: + case SVE::BI__builtin_sve_svdup_n_b32: + case SVE::BI__builtin_sve_svdup_n_b64: { + Value *CmpNE = + Builder.CreateICmpNE(Ops[0], Constant::getNullValue(Ops[0]->getType())); + llvm::ScalableVectorType *OverloadedTy = getSVEType(TypeFlags); + Value *Dup = EmitSVEDupX(CmpNE, OverloadedTy); + return EmitSVEPredicateCast(Dup, cast<llvm::ScalableVectorType>(Ty)); + } + case SVE::BI__builtin_sve_svdupq_n_b8: case SVE::BI__builtin_sve_svdupq_n_b16: case SVE::BI__builtin_sve_svdupq_n_b32: diff --git a/clang/lib/CodeGen/CodeGenFunction.h b/clang/lib/CodeGen/CodeGenFunction.h index 61b5111..e9b005c 100644 --- a/clang/lib/CodeGen/CodeGenFunction.h +++ b/clang/lib/CodeGen/CodeGenFunction.h @@ -3920,6 +3920,7 @@ public: llvm::ScalableVectorType *getSVEPredType(SVETypeFlags TypeFlags); llvm::Value *EmitSVEAllTruePred(SVETypeFlags TypeFlags); llvm::Value *EmitSVEDupX(llvm::Value *Scalar); + llvm::Value *EmitSVEDupX(llvm::Value *Scalar, llvm::Type *Ty); llvm::Value *EmitSVEReinterpret(llvm::Value *Val, llvm::Type *Ty); llvm::Value *EmitSVEPMull(SVETypeFlags TypeFlags, llvm::SmallVectorImpl<llvm::Value *> &Ops, |