@@ -5707,3 +5707,217 @@ define void @msub_vv_v2i64_2(ptr %x, <2 x i64> %y) {
5707
5707
store <2 x i64 > %c , ptr %x
5708
5708
ret void
5709
5709
}
5710
+
5711
+ define <8 x i8 > @vsub_if_uge_v8i8 (<8 x i8 > %va , <8 x i8 > %vb ) {
5712
+ ; CHECK-LABEL: vsub_if_uge_v8i8:
5713
+ ; CHECK: # %bb.0:
5714
+ ; CHECK-NEXT: vsetivli zero, 8, e8, mf2, ta, ma
5715
+ ; CHECK-NEXT: vmsltu.vv v0, v8, v9
5716
+ ; CHECK-NEXT: vsub.vv v9, v8, v9
5717
+ ; CHECK-NEXT: vmerge.vvm v8, v9, v8, v0
5718
+ ; CHECK-NEXT: ret
5719
+ %cmp = icmp ult <8 x i8 > %va , %vb
5720
+ %select = select <8 x i1 > %cmp , <8 x i8 > zeroinitializer , <8 x i8 > %vb
5721
+ %sub = sub nuw <8 x i8 > %va , %select
5722
+ ret <8 x i8 > %sub
5723
+ }
5724
+
5725
+ define <8 x i8 > @vsub_if_uge_swapped_v8i8 (<8 x i8 > %va , <8 x i8 > %vb ) {
5726
+ ; CHECK-LABEL: vsub_if_uge_swapped_v8i8:
5727
+ ; CHECK: # %bb.0:
5728
+ ; CHECK-NEXT: vsetivli zero, 8, e8, mf2, ta, mu
5729
+ ; CHECK-NEXT: vmsleu.vv v0, v9, v8
5730
+ ; CHECK-NEXT: vsub.vv v8, v8, v9, v0.t
5731
+ ; CHECK-NEXT: ret
5732
+ %cmp = icmp uge <8 x i8 > %va , %vb
5733
+ %select = select <8 x i1 > %cmp , <8 x i8 > %vb , <8 x i8 > zeroinitializer
5734
+ %sub = sub nuw <8 x i8 > %va , %select
5735
+ ret <8 x i8 > %sub
5736
+ }
5737
+
5738
+ define <8 x i16 > @vsub_if_uge_v8i16 (<8 x i16 > %va , <8 x i16 > %vb ) {
5739
+ ; CHECK-LABEL: vsub_if_uge_v8i16:
5740
+ ; CHECK: # %bb.0:
5741
+ ; CHECK-NEXT: vsetivli zero, 8, e16, m1, ta, ma
5742
+ ; CHECK-NEXT: vmsltu.vv v0, v8, v9
5743
+ ; CHECK-NEXT: vsub.vv v9, v8, v9
5744
+ ; CHECK-NEXT: vmerge.vvm v8, v9, v8, v0
5745
+ ; CHECK-NEXT: ret
5746
+ %cmp = icmp ult <8 x i16 > %va , %vb
5747
+ %select = select <8 x i1 > %cmp , <8 x i16 > zeroinitializer , <8 x i16 > %vb
5748
+ %sub = sub nuw <8 x i16 > %va , %select
5749
+ ret <8 x i16 > %sub
5750
+ }
5751
+
5752
+ define <8 x i16 > @vsub_if_uge_swapped_v8i16 (<8 x i16 > %va , <8 x i16 > %vb ) {
5753
+ ; CHECK-LABEL: vsub_if_uge_swapped_v8i16:
5754
+ ; CHECK: # %bb.0:
5755
+ ; CHECK-NEXT: vsetivli zero, 8, e16, m1, ta, mu
5756
+ ; CHECK-NEXT: vmsleu.vv v0, v9, v8
5757
+ ; CHECK-NEXT: vsub.vv v8, v8, v9, v0.t
5758
+ ; CHECK-NEXT: ret
5759
+ %cmp = icmp uge <8 x i16 > %va , %vb
5760
+ %select = select <8 x i1 > %cmp , <8 x i16 > %vb , <8 x i16 > zeroinitializer
5761
+ %sub = sub nuw <8 x i16 > %va , %select
5762
+ ret <8 x i16 > %sub
5763
+ }
5764
+
5765
+ define <4 x i32 > @vsub_if_uge_v4i32 (<4 x i32 > %va , <4 x i32 > %vb ) {
5766
+ ; CHECK-LABEL: vsub_if_uge_v4i32:
5767
+ ; CHECK: # %bb.0:
5768
+ ; CHECK-NEXT: vsetivli zero, 4, e32, m1, ta, ma
5769
+ ; CHECK-NEXT: vmsltu.vv v0, v8, v9
5770
+ ; CHECK-NEXT: vsub.vv v9, v8, v9
5771
+ ; CHECK-NEXT: vmerge.vvm v8, v9, v8, v0
5772
+ ; CHECK-NEXT: ret
5773
+ %cmp = icmp ult <4 x i32 > %va , %vb
5774
+ %select = select <4 x i1 > %cmp , <4 x i32 > zeroinitializer , <4 x i32 > %vb
5775
+ %sub = sub nuw <4 x i32 > %va , %select
5776
+ ret <4 x i32 > %sub
5777
+ }
5778
+
5779
+ define <4 x i32 > @vsub_if_uge_swapped_v4i32 (<4 x i32 > %va , <4 x i32 > %vb ) {
5780
+ ; CHECK-LABEL: vsub_if_uge_swapped_v4i32:
5781
+ ; CHECK: # %bb.0:
5782
+ ; CHECK-NEXT: vsetivli zero, 4, e32, m1, ta, mu
5783
+ ; CHECK-NEXT: vmsleu.vv v0, v9, v8
5784
+ ; CHECK-NEXT: vsub.vv v8, v8, v9, v0.t
5785
+ ; CHECK-NEXT: ret
5786
+ %cmp = icmp uge <4 x i32 > %va , %vb
5787
+ %select = select <4 x i1 > %cmp , <4 x i32 > %vb , <4 x i32 > zeroinitializer
5788
+ %sub = sub nuw <4 x i32 > %va , %select
5789
+ ret <4 x i32 > %sub
5790
+ }
5791
+
5792
+ define <2 x i64 > @vsub_if_uge_v2i64 (<2 x i64 > %va , <2 x i64 > %vb ) {
5793
+ ; CHECK-LABEL: vsub_if_uge_v2i64:
5794
+ ; CHECK: # %bb.0:
5795
+ ; CHECK-NEXT: vsetivli zero, 2, e64, m1, ta, ma
5796
+ ; CHECK-NEXT: vmsltu.vv v0, v8, v9
5797
+ ; CHECK-NEXT: vsub.vv v9, v8, v9
5798
+ ; CHECK-NEXT: vmerge.vvm v8, v9, v8, v0
5799
+ ; CHECK-NEXT: ret
5800
+ %cmp = icmp ult <2 x i64 > %va , %vb
5801
+ %select = select <2 x i1 > %cmp , <2 x i64 > zeroinitializer , <2 x i64 > %vb
5802
+ %sub = sub nuw <2 x i64 > %va , %select
5803
+ ret <2 x i64 > %sub
5804
+ }
5805
+
5806
+ define <2 x i64 > @vsub_if_uge_swapped_v2i64 (<2 x i64 > %va , <2 x i64 > %vb ) {
5807
+ ; CHECK-LABEL: vsub_if_uge_swapped_v2i64:
5808
+ ; CHECK: # %bb.0:
5809
+ ; CHECK-NEXT: vsetivli zero, 2, e64, m1, ta, mu
5810
+ ; CHECK-NEXT: vmsleu.vv v0, v9, v8
5811
+ ; CHECK-NEXT: vsub.vv v8, v8, v9, v0.t
5812
+ ; CHECK-NEXT: ret
5813
+ %cmp = icmp uge <2 x i64 > %va , %vb
5814
+ %select = select <2 x i1 > %cmp , <2 x i64 > %vb , <2 x i64 > zeroinitializer
5815
+ %sub = sub nuw <2 x i64 > %va , %select
5816
+ ret <2 x i64 > %sub
5817
+ }
5818
+
5819
+ define <8 x i8 > @sub_if_uge_C_v8i8 (<8 x i8 > %x ) {
5820
+ ; CHECK-LABEL: sub_if_uge_C_v8i8:
5821
+ ; CHECK: # %bb.0:
5822
+ ; CHECK-NEXT: vsetivli zero, 8, e8, mf2, ta, mu
5823
+ ; CHECK-NEXT: vmsgtu.vi v0, v8, 12
5824
+ ; CHECK-NEXT: vadd.vi v8, v8, -13, v0.t
5825
+ ; CHECK-NEXT: ret
5826
+ %cmp = icmp ugt <8 x i8 > %x , splat (i8 12 )
5827
+ %sub = add <8 x i8 > %x , splat (i8 -13 )
5828
+ %select = select <8 x i1 > %cmp , <8 x i8 > %sub , <8 x i8 > %x
5829
+ ret <8 x i8 > %select
5830
+ }
5831
+
5832
+ define <8 x i16 > @sub_if_uge_C_v8i16 (<8 x i16 > %x ) {
5833
+ ; CHECK-LABEL: sub_if_uge_C_v8i16:
5834
+ ; CHECK: # %bb.0:
5835
+ ; CHECK-NEXT: li a0, 2000
5836
+ ; CHECK-NEXT: vsetivli zero, 8, e16, m1, ta, mu
5837
+ ; CHECK-NEXT: vmsgtu.vx v0, v8, a0
5838
+ ; CHECK-NEXT: li a0, -2001
5839
+ ; CHECK-NEXT: vadd.vx v8, v8, a0, v0.t
5840
+ ; CHECK-NEXT: ret
5841
+ %cmp = icmp ugt <8 x i16 > %x , splat (i16 2000 )
5842
+ %sub = add <8 x i16 > %x , splat (i16 -2001 )
5843
+ %select = select <8 x i1 > %cmp , <8 x i16 > %sub , <8 x i16 > %x
5844
+ ret <8 x i16 > %select
5845
+ }
5846
+
5847
+ define <4 x i32 > @sub_if_uge_C_v4i32 (<4 x i32 > %x ) {
5848
+ ; CHECK-LABEL: sub_if_uge_C_v4i32:
5849
+ ; CHECK: # %bb.0:
5850
+ ; CHECK-NEXT: lui a0, 16
5851
+ ; CHECK-NEXT: addi a0, a0, -16
5852
+ ; CHECK-NEXT: vsetivli zero, 4, e32, m1, ta, mu
5853
+ ; CHECK-NEXT: vmsgtu.vx v0, v8, a0
5854
+ ; CHECK-NEXT: lui a0, 1048560
5855
+ ; CHECK-NEXT: addi a0, a0, 15
5856
+ ; CHECK-NEXT: vadd.vx v8, v8, a0, v0.t
5857
+ ; CHECK-NEXT: ret
5858
+ %cmp = icmp ugt <4 x i32 > %x , splat (i32 65520 )
5859
+ %sub = add <4 x i32 > %x , splat (i32 -65521 )
5860
+ %select = select <4 x i1 > %cmp , <4 x i32 > %sub , <4 x i32 > %x
5861
+ ret <4 x i32 > %select
5862
+ }
5863
+
5864
+ define <4 x i32 > @sub_if_uge_C_swapped_v4i32 (<4 x i32 > %x ) {
5865
+ ; CHECK-LABEL: sub_if_uge_C_swapped_v4i32:
5866
+ ; CHECK: # %bb.0:
5867
+ ; CHECK-NEXT: lui a0, 16
5868
+ ; CHECK-NEXT: addi a0, a0, -15
5869
+ ; CHECK-NEXT: vsetivli zero, 4, e32, m1, ta, ma
5870
+ ; CHECK-NEXT: vmsltu.vx v0, v8, a0
5871
+ ; CHECK-NEXT: lui a0, 1048560
5872
+ ; CHECK-NEXT: addi a0, a0, 15
5873
+ ; CHECK-NEXT: vadd.vx v9, v8, a0
5874
+ ; CHECK-NEXT: vmerge.vvm v8, v9, v8, v0
5875
+ ; CHECK-NEXT: ret
5876
+ %cmp = icmp ult <4 x i32 > %x , splat (i32 65521 )
5877
+ %sub = add <4 x i32 > %x , splat (i32 -65521 )
5878
+ %select = select <4 x i1 > %cmp , <4 x i32 > %x , <4 x i32 > %sub
5879
+ ret <4 x i32 > %select
5880
+ }
5881
+
5882
+ define <2 x i64 > @sub_if_uge_C_v2i64 (<2 x i64 > %x ) nounwind {
5883
+ ; RV32-LABEL: sub_if_uge_C_v2i64:
5884
+ ; RV32: # %bb.0:
5885
+ ; RV32-NEXT: addi sp, sp, -16
5886
+ ; RV32-NEXT: li a0, 1
5887
+ ; RV32-NEXT: lui a1, 172127
5888
+ ; RV32-NEXT: mv a2, sp
5889
+ ; RV32-NEXT: addi a1, a1, 512
5890
+ ; RV32-NEXT: sw a1, 0(sp)
5891
+ ; RV32-NEXT: sw a0, 4(sp)
5892
+ ; RV32-NEXT: li a0, -2
5893
+ ; RV32-NEXT: vsetivli zero, 2, e64, m1, ta, mu
5894
+ ; RV32-NEXT: vlse64.v v9, (a2), zero
5895
+ ; RV32-NEXT: lui a1, 876449
5896
+ ; RV32-NEXT: addi a1, a1, -513
5897
+ ; RV32-NEXT: sw a1, 8(sp)
5898
+ ; RV32-NEXT: sw a0, 12(sp)
5899
+ ; RV32-NEXT: addi a0, sp, 8
5900
+ ; RV32-NEXT: vlse64.v v10, (a0), zero
5901
+ ; RV32-NEXT: vmsltu.vv v0, v9, v8
5902
+ ; RV32-NEXT: vadd.vv v8, v8, v10, v0.t
5903
+ ; RV32-NEXT: addi sp, sp, 16
5904
+ ; RV32-NEXT: ret
5905
+ ;
5906
+ ; RV64-LABEL: sub_if_uge_C_v2i64:
5907
+ ; RV64: # %bb.0:
5908
+ ; RV64-NEXT: lui a0, 2384
5909
+ ; RV64-NEXT: addi a0, a0, 761
5910
+ ; RV64-NEXT: slli a0, a0, 9
5911
+ ; RV64-NEXT: vsetivli zero, 2, e64, m1, ta, mu
5912
+ ; RV64-NEXT: vmsgtu.vx v0, v8, a0
5913
+ ; RV64-NEXT: lui a0, 1048278
5914
+ ; RV64-NEXT: addi a0, a0, -95
5915
+ ; RV64-NEXT: slli a0, a0, 12
5916
+ ; RV64-NEXT: addi a0, a0, -513
5917
+ ; RV64-NEXT: vadd.vx v8, v8, a0, v0.t
5918
+ ; RV64-NEXT: ret
5919
+ %cmp = icmp ugt <2 x i64 > %x , splat (i64 5000000000 )
5920
+ %sub = add <2 x i64 > %x , splat (i64 -5000000001 )
5921
+ %select = select <2 x i1 > %cmp , <2 x i64 > %sub , <2 x i64 > %x
5922
+ ret <2 x i64 > %select
5923
+ }
0 commit comments