@@ -5707,3 +5707,217 @@ define void @msub_vv_v2i64_2(ptr %x, <2 x i64> %y) {
57075707 store <2 x i64 > %c , ptr %x
57085708 ret void
57095709}
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