Skip to content

Commit 4166df2

Browse files
committed
[RISCV][test] Add tests for vector subtraction if above threshold
1 parent 935fd98 commit 4166df2

File tree

2 files changed

+428
-0
lines changed

2 files changed

+428
-0
lines changed

llvm/test/CodeGen/RISCV/rvv/fixed-vectors-int.ll

Lines changed: 214 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)