@@ -722,6 +722,134 @@ define i32 @fsh_orconst_rotate(i32 %a) {
722
722
ret i32 %t2
723
723
}
724
724
725
+ define i32 @fsh_rotate_5 (i8 %x , i32 %y ) {
726
+ ; CHECK-LABEL: @fsh_rotate_5(
727
+ ; CHECK-NEXT: [[T1:%.*]] = zext i8 [[X:%.*]] to i32
728
+ ; CHECK-NEXT: [[OR1:%.*]] = or i32 [[T1]], [[Y:%.*]]
729
+ ; CHECK-NEXT: [[OR2:%.*]] = call i32 @llvm.fshl.i32(i32 [[OR1]], i32 [[Y]], i32 5)
730
+ ; CHECK-NEXT: ret i32 [[OR2]]
731
+ ;
732
+
733
+ %t1 = zext i8 %x to i32
734
+ %or1 = or i32 %t1 , %y
735
+ %shr = lshr i32 %or1 , 27
736
+ %shl = shl i32 %or1 , 5
737
+ %or2 = or i32 %shr , %shl
738
+ ret i32 %or2
739
+ }
740
+
741
+ define i32 @fsh_rotate_18 (i8 %x , i32 %y ) {
742
+ ; CHECK-LABEL: @fsh_rotate_18(
743
+ ; CHECK-NEXT: [[T1:%.*]] = zext i8 [[X:%.*]] to i32
744
+ ; CHECK-NEXT: [[OR1:%.*]] = or i32 [[T1]], [[Y:%.*]]
745
+ ; CHECK-NEXT: [[OR2:%.*]] = call i32 @llvm.fshl.i32(i32 [[OR1]], i32 [[Y]], i32 18)
746
+ ; CHECK-NEXT: ret i32 [[OR2]]
747
+ ;
748
+
749
+ %t1 = zext i8 %x to i32
750
+ %or1 = or i32 %t1 , %y
751
+ %shr = lshr i32 %or1 , 14
752
+ %shl = shl i32 %or1 , 18
753
+ %or2 = or i32 %shr , %shl
754
+ ret i32 %or2
755
+ }
756
+
757
+ define i32 @fsh_load_rotate_12 (ptr %data ) {
758
+ ; CHECK-LABEL: @fsh_load_rotate_12(
759
+ ; CHECK-NEXT: entry:
760
+ ; CHECK-NEXT: [[TMP0:%.*]] = load i8, ptr [[DATA:%.*]], align 1
761
+ ; CHECK-NEXT: [[CONV:%.*]] = zext i8 [[TMP0]] to i32
762
+ ; CHECK-NEXT: [[SHL:%.*]] = shl nuw i32 [[CONV]], 24
763
+ ; CHECK-NEXT: [[ARRAYIDX1:%.*]] = getelementptr inbounds i8, ptr [[DATA]], i64 1
764
+ ; CHECK-NEXT: [[TMP1:%.*]] = load i8, ptr [[ARRAYIDX1]], align 1
765
+ ; CHECK-NEXT: [[CONV2:%.*]] = zext i8 [[TMP1]] to i32
766
+ ; CHECK-NEXT: [[SHL3:%.*]] = shl nuw nsw i32 [[CONV2]], 16
767
+ ; CHECK-NEXT: [[OR:%.*]] = or i32 [[SHL3]], [[SHL]]
768
+ ; CHECK-NEXT: [[ARRAYIDX4:%.*]] = getelementptr inbounds i8, ptr [[DATA]], i64 2
769
+ ; CHECK-NEXT: [[TMP2:%.*]] = load i8, ptr [[ARRAYIDX4]], align 1
770
+ ; CHECK-NEXT: [[CONV5:%.*]] = zext i8 [[TMP2]] to i32
771
+ ; CHECK-NEXT: [[SHL6:%.*]] = shl nuw nsw i32 [[CONV5]], 8
772
+ ; CHECK-NEXT: [[ARRAYIDX8:%.*]] = getelementptr inbounds i8, ptr [[DATA]], i64 3
773
+ ; CHECK-NEXT: [[TMP3:%.*]] = load i8, ptr [[ARRAYIDX8]], align 1
774
+ ; CHECK-NEXT: [[CONV9:%.*]] = zext i8 [[TMP3]] to i32
775
+ ; CHECK-NEXT: [[TMP4:%.*]] = or i32 [[SHL6]], [[CONV9]]
776
+ ; CHECK-NEXT: [[OR10:%.*]] = or i32 [[TMP4]], [[SHL3]]
777
+ ; CHECK-NEXT: [[OR15:%.*]] = call i32 @llvm.fshl.i32(i32 [[OR10]], i32 [[OR]], i32 12)
778
+ ; CHECK-NEXT: ret i32 [[OR15]]
779
+ ;
780
+
781
+ entry:
782
+ %0 = load i8 , ptr %data
783
+ %conv = zext i8 %0 to i32
784
+ %shl = shl nuw i32 %conv , 24
785
+ %arrayidx1 = getelementptr inbounds i8 , ptr %data , i64 1
786
+ %1 = load i8 , ptr %arrayidx1
787
+ %conv2 = zext i8 %1 to i32
788
+ %shl3 = shl nuw nsw i32 %conv2 , 16
789
+ %or = or i32 %shl3 , %shl
790
+ %arrayidx4 = getelementptr inbounds i8 , ptr %data , i64 2
791
+ %2 = load i8 , ptr %arrayidx4
792
+ %conv5 = zext i8 %2 to i32
793
+ %shl6 = shl nuw nsw i32 %conv5 , 8
794
+ %or7 = or i32 %or , %shl6
795
+ %arrayidx8 = getelementptr inbounds i8 , ptr %data , i64 3
796
+ %3 = load i8 , ptr %arrayidx8
797
+ %conv9 = zext i8 %3 to i32
798
+ %or10 = or i32 %or7 , %conv9
799
+ %shr = lshr i32 %or10 , 20
800
+ %shl7 = shl i32 %or10 , 12
801
+ %or15 = or i32 %shr , %shl7
802
+ ret i32 %or15
803
+ }
804
+
805
+ define i32 @fsh_load_rotate_25 (ptr %data ) {
806
+ ; CHECK-LABEL: @fsh_load_rotate_25(
807
+ ; CHECK-NEXT: entry:
808
+ ; CHECK-NEXT: [[TMP0:%.*]] = load i8, ptr [[DATA:%.*]], align 1
809
+ ; CHECK-NEXT: [[CONV:%.*]] = zext i8 [[TMP0]] to i32
810
+ ; CHECK-NEXT: [[SHL:%.*]] = shl nuw i32 [[CONV]], 24
811
+ ; CHECK-NEXT: [[ARRAYIDX1:%.*]] = getelementptr inbounds i8, ptr [[DATA]], i64 1
812
+ ; CHECK-NEXT: [[TMP1:%.*]] = load i8, ptr [[ARRAYIDX1]], align 1
813
+ ; CHECK-NEXT: [[CONV2:%.*]] = zext i8 [[TMP1]] to i32
814
+ ; CHECK-NEXT: [[SHL3:%.*]] = shl nuw nsw i32 [[CONV2]], 16
815
+ ; CHECK-NEXT: [[OR:%.*]] = or i32 [[SHL3]], [[SHL]]
816
+ ; CHECK-NEXT: [[ARRAYIDX4:%.*]] = getelementptr inbounds i8, ptr [[DATA]], i64 2
817
+ ; CHECK-NEXT: [[TMP2:%.*]] = load i8, ptr [[ARRAYIDX4]], align 1
818
+ ; CHECK-NEXT: [[CONV5:%.*]] = zext i8 [[TMP2]] to i32
819
+ ; CHECK-NEXT: [[SHL6:%.*]] = shl nuw nsw i32 [[CONV5]], 8
820
+ ; CHECK-NEXT: [[OR7:%.*]] = or i32 [[OR]], [[SHL6]]
821
+ ; CHECK-NEXT: [[ARRAYIDX8:%.*]] = getelementptr inbounds i8, ptr [[DATA]], i64 3
822
+ ; CHECK-NEXT: [[TMP3:%.*]] = load i8, ptr [[ARRAYIDX8]], align 1
823
+ ; CHECK-NEXT: [[CONV9:%.*]] = zext i8 [[TMP3]] to i32
824
+ ; CHECK-NEXT: [[OR10:%.*]] = or i32 [[OR7]], [[CONV9]]
825
+ ; CHECK-NEXT: [[OR15:%.*]] = call i32 @llvm.fshl.i32(i32 [[CONV9]], i32 [[OR10]], i32 25)
826
+ ; CHECK-NEXT: ret i32 [[OR15]]
827
+ ;
828
+
829
+ entry:
830
+ %0 = load i8 , ptr %data
831
+ %conv = zext i8 %0 to i32
832
+ %shl = shl nuw i32 %conv , 24
833
+ %arrayidx1 = getelementptr inbounds i8 , ptr %data , i64 1
834
+ %1 = load i8 , ptr %arrayidx1
835
+ %conv2 = zext i8 %1 to i32
836
+ %shl3 = shl nuw nsw i32 %conv2 , 16
837
+ %or = or i32 %shl3 , %shl
838
+ %arrayidx4 = getelementptr inbounds i8 , ptr %data , i64 2
839
+ %2 = load i8 , ptr %arrayidx4
840
+ %conv5 = zext i8 %2 to i32
841
+ %shl6 = shl nuw nsw i32 %conv5 , 8
842
+ %or7 = or i32 %or , %shl6
843
+ %arrayidx8 = getelementptr inbounds i8 , ptr %data , i64 3
844
+ %3 = load i8 , ptr %arrayidx8
845
+ %conv9 = zext i8 %3 to i32
846
+ %or10 = or i32 %or7 , %conv9
847
+ %shr = lshr i32 %or10 , 7
848
+ %shl7 = shl i32 %or10 , 25
849
+ %or15 = or i32 %shr , %shl7
850
+ ret i32 %or15
851
+ }
852
+
725
853
define <2 x i31 > @fshr_mask_args_same_vector (<2 x i31 > %a ) {
726
854
; CHECK-LABEL: @fshr_mask_args_same_vector(
727
855
; CHECK-NEXT: [[T3:%.*]] = shl <2 x i31> [[A:%.*]], <i31 10, i31 10>
0 commit comments