@@ -31,6 +31,10 @@ using namespace llvm;
3131static cl::opt<bool > HexagonAutoHVX (" hexagon-autohvx" , cl::init(false ),
3232 cl::Hidden, cl::desc(" Enable loop vectorizer for HVX" ));
3333
34+ cl::opt<bool > HexagonAllowScatterGatherHVX (" hexagon-allow-scatter-gather-hvx" ,
35+ cl::init (false ), cl::Hidden,
36+ cl::desc(" Allow auto-generation of HVX scatter-gather" ));
37+
3438static cl::opt<bool > EnableV68FloatAutoHVX (
3539 " force-hvx-float" , cl::Hidden,
3640 cl::desc (" Enable auto-vectorization of floatint point types on v68." ));
@@ -354,6 +358,61 @@ bool HexagonTTIImpl::isLegalMaskedLoad(Type *DataType, Align /*Alignment*/,
354358 return HexagonMaskedVMem && ST.isTypeForHVX (DataType);
355359}
356360
361+ bool HexagonTTIImpl::isLegalMaskedGather (Type *Ty, Align Alignment) const {
362+ // For now assume we can not deal with all HVX datatypes.
363+ if (!Ty->isVectorTy () || !ST.isTypeForHVX (Ty) ||
364+ !HexagonAllowScatterGatherHVX)
365+ return false ;
366+ // This must be in sync with HexagonVectorCombine pass.
367+ switch (Ty->getScalarSizeInBits ()) {
368+ case 8 :
369+ return (getTypeNumElements (Ty) == 128 );
370+ case 16 :
371+ if (getTypeNumElements (Ty) == 64 || getTypeNumElements (Ty) == 32 )
372+ return (Alignment >= 2 );
373+ break ;
374+ case 32 :
375+ if (getTypeNumElements (Ty) == 32 )
376+ return (Alignment >= 4 );
377+ break ;
378+ default :
379+ break ;
380+ }
381+ return false ;
382+ }
383+
384+ bool HexagonTTIImpl::isLegalMaskedScatter (Type *Ty, Align Alignment) const {
385+ if (!Ty->isVectorTy () || !ST.isTypeForHVX (Ty) ||
386+ !HexagonAllowScatterGatherHVX)
387+ return false ;
388+ // This must be in sync with HexagonVectorCombine pass.
389+ switch (Ty->getScalarSizeInBits ()) {
390+ case 8 :
391+ return (getTypeNumElements (Ty) == 128 );
392+ case 16 :
393+ if (getTypeNumElements (Ty) == 64 )
394+ return (Alignment >= 2 );
395+ break ;
396+ case 32 :
397+ if (getTypeNumElements (Ty) == 32 )
398+ return (Alignment >= 4 );
399+ break ;
400+ default :
401+ break ;
402+ }
403+ return false ;
404+ }
405+
406+ bool HexagonTTIImpl::forceScalarizeMaskedGather (VectorType *VTy,
407+ Align Alignment) const {
408+ return !isLegalMaskedGather (VTy, Alignment);
409+ }
410+
411+ bool HexagonTTIImpl::forceScalarizeMaskedScatter (VectorType *VTy,
412+ Align Alignment) const {
413+ return !isLegalMaskedScatter (VTy, Alignment);
414+ }
415+
357416// / --- Vector TTI end ---
358417
359418unsigned HexagonTTIImpl::getPrefetchDistance () const {
0 commit comments