@@ -657,6 +657,166 @@ inline bool isLSC2D(const Function *F) {
657
657
return isLSC2D (getGenXIntrinsicID (F));
658
658
}
659
659
660
+
661
+ // Dependency from visa_igc_common_header.
662
+ // Converts vector size into LSC-appropriate code.
663
+ inline LSCVectorSize getLSCVectorSize (unsigned N) {
664
+ switch (N) {
665
+ case 0 :
666
+ return LSCVectorSize::N0;
667
+ case 1 :
668
+ return LSCVectorSize::N1;
669
+ case 2 :
670
+ return LSCVectorSize::N2;
671
+ case 3 :
672
+ return LSCVectorSize::N3;
673
+ case 4 :
674
+ return LSCVectorSize::N4;
675
+ case 8 :
676
+ return LSCVectorSize::N8;
677
+ case 16 :
678
+ return LSCVectorSize::N16;
679
+ case 32 :
680
+ return LSCVectorSize::N32;
681
+ case 64 :
682
+ return LSCVectorSize::N64;
683
+ }
684
+ llvm_unreachable (" Unknown vector size" );
685
+ }
686
+ // Gets encoded vector size for LSC instruction.
687
+ inline uint8_t getEncodedLSCVectorSize (unsigned N) {
688
+ return static_cast <uint8_t >(getLSCVectorSize (N));
689
+ }
690
+
691
+ // Functions in this namespace return argument index for LSC instruction.
692
+ namespace LSCArgIdx {
693
+ constexpr int Invalid = -1 ;
694
+ // Returns VectorSize index.
695
+ inline int getLSCVectorSize (LSCCategory Cat) {
696
+ switch (Cat) {
697
+ case LSCCategory::Load:
698
+ case LSCCategory::Prefetch:
699
+ case LSCCategory::Store:
700
+ case LSCCategory::Atomic:
701
+ return 7 ;
702
+ case LSCCategory::LegacyAtomic:
703
+ return 8 ;
704
+ case LSCCategory::Prefetch2D:
705
+ case LSCCategory::Load2D:
706
+ case LSCCategory::Store2D:
707
+ case LSCCategory::Fence:
708
+ case LSCCategory::NotLSC:
709
+ default :
710
+ llvm_unreachable (" no such argument" );
711
+ return Invalid;
712
+ }
713
+ }
714
+ // Returns VectorSize index.
715
+ inline int getLSCVectorSize (unsigned IID) {
716
+ return LSCArgIdx::getLSCVectorSize (getLSCCategory (IID));
717
+ }
718
+
719
+ // Returns DataSize index.
720
+ inline int getLSCDataSize (LSCCategory Cat) {
721
+ switch (Cat) {
722
+ case LSCCategory::Load:
723
+ case LSCCategory::Prefetch:
724
+ case LSCCategory::Store:
725
+ case LSCCategory::LegacyAtomic:
726
+ case LSCCategory::Atomic:
727
+ return 6 ;
728
+ case LSCCategory::Load2D:
729
+ case LSCCategory::Prefetch2D:
730
+ case LSCCategory::Store2D:
731
+ return 3 ;
732
+ case LSCCategory::Fence:
733
+ case LSCCategory::NotLSC:
734
+ default :
735
+ llvm_unreachable (" no such argument" );
736
+ return Invalid;
737
+ }
738
+ }
739
+ // Returns DataSize index.
740
+ inline int getLSCDataSize (unsigned IID) {
741
+ return LSCArgIdx::getLSCDataSize (getLSCCategory (IID));
742
+ }
743
+
744
+ // Returns immediate offset index.
745
+ inline int getLSCImmOffset (LSCCategory Cat) {
746
+ switch (Cat) {
747
+ case LSCCategory::Load:
748
+ case LSCCategory::Prefetch:
749
+ case LSCCategory::Store:
750
+ case LSCCategory::LegacyAtomic:
751
+ case LSCCategory::Atomic:
752
+ return 5 ;
753
+ case LSCCategory::Prefetch2D:
754
+ case LSCCategory::Load2D:
755
+ case LSCCategory::Store2D:
756
+ case LSCCategory::Fence:
757
+ case LSCCategory::NotLSC:
758
+ default :
759
+ llvm_unreachable (" no such argument" );
760
+ return Invalid;
761
+ }
762
+ }
763
+ // Returns immediate offset index.
764
+ inline int getLSCImmOffset (unsigned IID) {
765
+ return LSCArgIdx::getLSCImmOffset (getLSCCategory (IID));
766
+ }
767
+
768
+ // Returns data order index.
769
+ inline int getLSCDataOrder (LSCCategory Cat) {
770
+ switch (Cat) {
771
+ case LSCCategory::Load:
772
+ case LSCCategory::Prefetch:
773
+ case LSCCategory::Store:
774
+ case LSCCategory::Atomic:
775
+ return 8 ;
776
+ case LSCCategory::LegacyAtomic:
777
+ return 7 ;
778
+ case LSCCategory::Load2D:
779
+ case LSCCategory::Prefetch2D:
780
+ case LSCCategory::Store2D:
781
+ return 4 ;
782
+ case LSCCategory::Fence:
783
+ case LSCCategory::NotLSC:
784
+ default :
785
+ llvm_unreachable (" no such argument" );
786
+ return Invalid;
787
+ }
788
+ }
789
+ // Returns data order index.
790
+ inline int getLSCDataOrder (unsigned IID) {
791
+ return LSCArgIdx::getLSCDataOrder (getLSCCategory (IID));
792
+ }
793
+
794
+ // Returns width index.
795
+ inline int getLSCWidth (LSCCategory Cat) {
796
+ switch (Cat) {
797
+ case LSCCategory::Load:
798
+ case LSCCategory::Prefetch:
799
+ case LSCCategory::Store:
800
+ case LSCCategory::Fence:
801
+ case LSCCategory::LegacyAtomic:
802
+ case LSCCategory::Atomic:
803
+ case LSCCategory::Prefetch2D:
804
+ return 0 ;
805
+ case LSCCategory::Load2D:
806
+ case LSCCategory::Store2D:
807
+ case LSCCategory::NotLSC:
808
+ default :
809
+ llvm_unreachable (" no such argument" );
810
+ return Invalid;
811
+ }
812
+ }
813
+ // Returns width index.
814
+ inline int getLSCWidth (unsigned IID) {
815
+ return LSCArgIdx::getLSCWidth (getLSCCategory (IID));
816
+ }
817
+
818
+ } // namespace LSCArgIdx
819
+
660
820
inline unsigned getLSCNumVectorElements (LSCVectorSize VS) {
661
821
switch (VS) {
662
822
case LSCVectorSize::N0:
0 commit comments