Re-land [openmp] Fix warnings when building on Windows with latest MSVC or Clang...
[llvm-project.git] / llvm / test / CodeGen / RISCV / rvv / vp-reverse-mask.ll
blob29917141fffed880b1a2bf6b3004e619f28a1178
1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2 ; RUN: llc -mtriple=riscv64 -mattr=+m,+v -verify-machineinstrs < %s | FileCheck %s
4 define <vscale x 1 x i1> @test_vp_reverse_nxv1i1_masked(<vscale x 1 x i1> %src, <vscale x 1 x i1> %mask, i32 zeroext %evl) {
5 ; CHECK-LABEL: test_vp_reverse_nxv1i1_masked:
6 ; CHECK:       # %bb.0:
7 ; CHECK-NEXT:    vsetvli zero, a0, e8, mf8, ta, ma
8 ; CHECK-NEXT:    vmv.v.i v9, 0
9 ; CHECK-NEXT:    vmerge.vim v9, v9, 1, v0
10 ; CHECK-NEXT:    vsetvli zero, zero, e16, mf4, ta, ma
11 ; CHECK-NEXT:    vmv1r.v v0, v8
12 ; CHECK-NEXT:    vid.v v10, v0.t
13 ; CHECK-NEXT:    addi a0, a0, -1
14 ; CHECK-NEXT:    vrsub.vx v10, v10, a0, v0.t
15 ; CHECK-NEXT:    vsetvli zero, zero, e8, mf8, ta, ma
16 ; CHECK-NEXT:    vrgatherei16.vv v11, v9, v10, v0.t
17 ; CHECK-NEXT:    vmsne.vi v0, v11, 0, v0.t
18 ; CHECK-NEXT:    ret
19   %dst = call <vscale x 1 x i1> @llvm.experimental.vp.reverse.nxv1i1(<vscale x 1 x i1> %src, <vscale x 1 x i1> %mask, i32 %evl)
20   ret <vscale x 1 x i1> %dst
23 define <vscale x 1 x i1> @test_vp_reverse_nxv1i1(<vscale x 1 x i1> %src, i32 zeroext %evl) {
24 ; CHECK-LABEL: test_vp_reverse_nxv1i1:
25 ; CHECK:       # %bb.0:
26 ; CHECK-NEXT:    addi a1, a0, -1
27 ; CHECK-NEXT:    vsetvli zero, a0, e16, mf4, ta, ma
28 ; CHECK-NEXT:    vid.v v8
29 ; CHECK-NEXT:    vrsub.vx v8, v8, a1
30 ; CHECK-NEXT:    vsetvli zero, zero, e8, mf8, ta, ma
31 ; CHECK-NEXT:    vmv.v.i v9, 0
32 ; CHECK-NEXT:    vmerge.vim v9, v9, 1, v0
33 ; CHECK-NEXT:    vrgatherei16.vv v10, v9, v8
34 ; CHECK-NEXT:    vmsne.vi v0, v10, 0
35 ; CHECK-NEXT:    ret
36   %head = insertelement <vscale x 1 x i1> undef, i1 1, i32 0
37   %allones = shufflevector <vscale x 1 x i1> %head, <vscale x 1 x i1> undef, <vscale x 1 x i32> zeroinitializer
39   %dst = call <vscale x 1 x i1> @llvm.experimental.vp.reverse.nxv1i1(<vscale x 1 x i1> %src, <vscale x 1 x i1> %allones, i32 %evl)
40   ret <vscale x 1 x i1> %dst
43 define <vscale x 2 x i1> @test_vp_reverse_nxv2i1_masked(<vscale x 2 x i1> %src, <vscale x 2 x i1> %mask, i32 zeroext %evl) {
44 ; CHECK-LABEL: test_vp_reverse_nxv2i1_masked:
45 ; CHECK:       # %bb.0:
46 ; CHECK-NEXT:    vsetvli zero, a0, e8, mf4, ta, ma
47 ; CHECK-NEXT:    vmv.v.i v9, 0
48 ; CHECK-NEXT:    vmerge.vim v9, v9, 1, v0
49 ; CHECK-NEXT:    vsetvli zero, zero, e16, mf2, ta, ma
50 ; CHECK-NEXT:    vmv1r.v v0, v8
51 ; CHECK-NEXT:    vid.v v10, v0.t
52 ; CHECK-NEXT:    addi a0, a0, -1
53 ; CHECK-NEXT:    vrsub.vx v10, v10, a0, v0.t
54 ; CHECK-NEXT:    vsetvli zero, zero, e8, mf4, ta, ma
55 ; CHECK-NEXT:    vrgatherei16.vv v11, v9, v10, v0.t
56 ; CHECK-NEXT:    vmsne.vi v0, v11, 0, v0.t
57 ; CHECK-NEXT:    ret
58   %dst = call <vscale x 2 x i1> @llvm.experimental.vp.reverse.nxv2i1(<vscale x 2 x i1> %src, <vscale x 2 x i1> %mask, i32 %evl)
59   ret <vscale x 2 x i1> %dst
62 define <vscale x 2 x i1> @test_vp_reverse_nxv2i1(<vscale x 2 x i1> %src, i32 zeroext %evl) {
63 ; CHECK-LABEL: test_vp_reverse_nxv2i1:
64 ; CHECK:       # %bb.0:
65 ; CHECK-NEXT:    addi a1, a0, -1
66 ; CHECK-NEXT:    vsetvli zero, a0, e16, mf2, ta, ma
67 ; CHECK-NEXT:    vid.v v8
68 ; CHECK-NEXT:    vrsub.vx v8, v8, a1
69 ; CHECK-NEXT:    vsetvli zero, zero, e8, mf4, ta, ma
70 ; CHECK-NEXT:    vmv.v.i v9, 0
71 ; CHECK-NEXT:    vmerge.vim v9, v9, 1, v0
72 ; CHECK-NEXT:    vrgatherei16.vv v10, v9, v8
73 ; CHECK-NEXT:    vmsne.vi v0, v10, 0
74 ; CHECK-NEXT:    ret
75   %head = insertelement <vscale x 2 x i1> undef, i1 1, i32 0
76   %allones = shufflevector <vscale x 2 x i1> %head, <vscale x 2 x i1> undef, <vscale x 2 x i32> zeroinitializer
78   %dst = call <vscale x 2 x i1> @llvm.experimental.vp.reverse.nxv2i1(<vscale x 2 x i1> %src, <vscale x 2 x i1> %allones, i32 %evl)
79   ret <vscale x 2 x i1> %dst
82 define <vscale x 4 x i1> @test_vp_reverse_nxv4i1_masked(<vscale x 4 x i1> %src, <vscale x 4 x i1> %mask, i32 zeroext %evl) {
83 ; CHECK-LABEL: test_vp_reverse_nxv4i1_masked:
84 ; CHECK:       # %bb.0:
85 ; CHECK-NEXT:    vsetvli zero, a0, e8, mf2, ta, ma
86 ; CHECK-NEXT:    vmv.v.i v9, 0
87 ; CHECK-NEXT:    vmerge.vim v9, v9, 1, v0
88 ; CHECK-NEXT:    vsetvli zero, zero, e16, m1, ta, ma
89 ; CHECK-NEXT:    vmv1r.v v0, v8
90 ; CHECK-NEXT:    vid.v v10, v0.t
91 ; CHECK-NEXT:    addi a0, a0, -1
92 ; CHECK-NEXT:    vrsub.vx v10, v10, a0, v0.t
93 ; CHECK-NEXT:    vsetvli zero, zero, e8, mf2, ta, ma
94 ; CHECK-NEXT:    vrgatherei16.vv v11, v9, v10, v0.t
95 ; CHECK-NEXT:    vmsne.vi v0, v11, 0, v0.t
96 ; CHECK-NEXT:    ret
97   %dst = call <vscale x 4 x i1> @llvm.experimental.vp.reverse.nxv4i1(<vscale x 4 x i1> %src, <vscale x 4 x i1> %mask, i32 %evl)
98   ret <vscale x 4 x i1> %dst
101 define <vscale x 4 x i1> @test_vp_reverse_nxv4i1(<vscale x 4 x i1> %src, i32 zeroext %evl) {
102 ; CHECK-LABEL: test_vp_reverse_nxv4i1:
103 ; CHECK:       # %bb.0:
104 ; CHECK-NEXT:    addi a1, a0, -1
105 ; CHECK-NEXT:    vsetvli zero, a0, e16, m1, ta, ma
106 ; CHECK-NEXT:    vid.v v8
107 ; CHECK-NEXT:    vrsub.vx v8, v8, a1
108 ; CHECK-NEXT:    vsetvli zero, zero, e8, mf2, ta, ma
109 ; CHECK-NEXT:    vmv.v.i v9, 0
110 ; CHECK-NEXT:    vmerge.vim v9, v9, 1, v0
111 ; CHECK-NEXT:    vrgatherei16.vv v10, v9, v8
112 ; CHECK-NEXT:    vmsne.vi v0, v10, 0
113 ; CHECK-NEXT:    ret
114   %head = insertelement <vscale x 4 x i1> undef, i1 1, i32 0
115   %allones = shufflevector <vscale x 4 x i1> %head, <vscale x 4 x i1> undef, <vscale x 4 x i32> zeroinitializer
117   %dst = call <vscale x 4 x i1> @llvm.experimental.vp.reverse.nxv4i1(<vscale x 4 x i1> %src, <vscale x 4 x i1> %allones, i32 %evl)
118   ret <vscale x 4 x i1> %dst
121 define <vscale x 8 x i1> @test_vp_reverse_nxv8i1_masked(<vscale x 8 x i1> %src, <vscale x 8 x i1> %mask, i32 zeroext %evl) {
122 ; CHECK-LABEL: test_vp_reverse_nxv8i1_masked:
123 ; CHECK:       # %bb.0:
124 ; CHECK-NEXT:    vsetvli zero, a0, e8, m1, ta, ma
125 ; CHECK-NEXT:    vmv.v.i v9, 0
126 ; CHECK-NEXT:    vmerge.vim v9, v9, 1, v0
127 ; CHECK-NEXT:    vsetvli zero, zero, e16, m2, ta, ma
128 ; CHECK-NEXT:    vmv1r.v v0, v8
129 ; CHECK-NEXT:    vid.v v10, v0.t
130 ; CHECK-NEXT:    addi a0, a0, -1
131 ; CHECK-NEXT:    vrsub.vx v10, v10, a0, v0.t
132 ; CHECK-NEXT:    vsetvli zero, zero, e8, m1, ta, ma
133 ; CHECK-NEXT:    vrgatherei16.vv v12, v9, v10, v0.t
134 ; CHECK-NEXT:    vmsne.vi v0, v12, 0, v0.t
135 ; CHECK-NEXT:    ret
136   %dst = call <vscale x 8 x i1> @llvm.experimental.vp.reverse.nxv8i1(<vscale x 8 x i1> %src, <vscale x 8 x i1> %mask, i32 %evl)
137   ret <vscale x 8 x i1> %dst
140 define <vscale x 8 x i1> @test_vp_reverse_nxv8i1(<vscale x 8 x i1> %src, i32 zeroext %evl) {
141 ; CHECK-LABEL: test_vp_reverse_nxv8i1:
142 ; CHECK:       # %bb.0:
143 ; CHECK-NEXT:    addi a1, a0, -1
144 ; CHECK-NEXT:    vsetvli zero, a0, e16, m2, ta, ma
145 ; CHECK-NEXT:    vid.v v8
146 ; CHECK-NEXT:    vrsub.vx v8, v8, a1
147 ; CHECK-NEXT:    vsetvli zero, zero, e8, m1, ta, ma
148 ; CHECK-NEXT:    vmv.v.i v10, 0
149 ; CHECK-NEXT:    vmerge.vim v10, v10, 1, v0
150 ; CHECK-NEXT:    vrgatherei16.vv v11, v10, v8
151 ; CHECK-NEXT:    vmsne.vi v0, v11, 0
152 ; CHECK-NEXT:    ret
153   %head = insertelement <vscale x 8 x i1> undef, i1 1, i32 0
154   %allones = shufflevector <vscale x 8 x i1> %head, <vscale x 8 x i1> undef, <vscale x 8 x i32> zeroinitializer
156   %dst = call <vscale x 8 x i1> @llvm.experimental.vp.reverse.nxv8i1(<vscale x 8 x i1> %src, <vscale x 8 x i1> %allones, i32 %evl)
157   ret <vscale x 8 x i1> %dst
160 define <vscale x 16 x i1> @test_vp_reverse_nxv16i1_masked(<vscale x 16 x i1> %src, <vscale x 16 x i1> %mask, i32 zeroext %evl) {
161 ; CHECK-LABEL: test_vp_reverse_nxv16i1_masked:
162 ; CHECK:       # %bb.0:
163 ; CHECK-NEXT:    vsetvli zero, a0, e8, m2, ta, ma
164 ; CHECK-NEXT:    vmv.v.i v10, 0
165 ; CHECK-NEXT:    vmerge.vim v10, v10, 1, v0
166 ; CHECK-NEXT:    vsetvli zero, zero, e16, m4, ta, ma
167 ; CHECK-NEXT:    vmv1r.v v0, v8
168 ; CHECK-NEXT:    vid.v v12, v0.t
169 ; CHECK-NEXT:    addi a0, a0, -1
170 ; CHECK-NEXT:    vrsub.vx v12, v12, a0, v0.t
171 ; CHECK-NEXT:    vsetvli zero, zero, e8, m2, ta, ma
172 ; CHECK-NEXT:    vrgatherei16.vv v16, v10, v12, v0.t
173 ; CHECK-NEXT:    vmsne.vi v8, v16, 0, v0.t
174 ; CHECK-NEXT:    vmv1r.v v0, v8
175 ; CHECK-NEXT:    ret
176   %dst = call <vscale x 16 x i1> @llvm.experimental.vp.reverse.nxv16i1(<vscale x 16 x i1> %src, <vscale x 16 x i1> %mask, i32 %evl)
177   ret <vscale x 16 x i1> %dst
180 define <vscale x 16 x i1> @test_vp_reverse_nxv16i1(<vscale x 16 x i1> %src, i32 zeroext %evl) {
181 ; CHECK-LABEL: test_vp_reverse_nxv16i1:
182 ; CHECK:       # %bb.0:
183 ; CHECK-NEXT:    addi a1, a0, -1
184 ; CHECK-NEXT:    vsetvli zero, a0, e16, m4, ta, ma
185 ; CHECK-NEXT:    vid.v v8
186 ; CHECK-NEXT:    vrsub.vx v8, v8, a1
187 ; CHECK-NEXT:    vsetvli zero, zero, e8, m2, ta, ma
188 ; CHECK-NEXT:    vmv.v.i v12, 0
189 ; CHECK-NEXT:    vmerge.vim v12, v12, 1, v0
190 ; CHECK-NEXT:    vrgatherei16.vv v14, v12, v8
191 ; CHECK-NEXT:    vmsne.vi v0, v14, 0
192 ; CHECK-NEXT:    ret
193   %head = insertelement <vscale x 16 x i1> undef, i1 1, i32 0
194   %allones = shufflevector <vscale x 16 x i1> %head, <vscale x 16 x i1> undef, <vscale x 16 x i32> zeroinitializer
196   %dst = call <vscale x 16 x i1> @llvm.experimental.vp.reverse.nxv16i1(<vscale x 16 x i1> %src, <vscale x 16 x i1> %allones, i32 %evl)
197   ret <vscale x 16 x i1> %dst
200 define <vscale x 32 x i1> @test_vp_reverse_nxv32i1_masked(<vscale x 32 x i1> %src, <vscale x 32 x i1> %mask, i32 zeroext %evl) {
201 ; CHECK-LABEL: test_vp_reverse_nxv32i1_masked:
202 ; CHECK:       # %bb.0:
203 ; CHECK-NEXT:    vsetvli zero, a0, e8, m4, ta, ma
204 ; CHECK-NEXT:    vmv.v.i v12, 0
205 ; CHECK-NEXT:    vmerge.vim v12, v12, 1, v0
206 ; CHECK-NEXT:    vsetvli zero, zero, e16, m8, ta, ma
207 ; CHECK-NEXT:    vmv1r.v v0, v8
208 ; CHECK-NEXT:    vid.v v16, v0.t
209 ; CHECK-NEXT:    addi a0, a0, -1
210 ; CHECK-NEXT:    vrsub.vx v16, v16, a0, v0.t
211 ; CHECK-NEXT:    vsetvli zero, zero, e8, m4, ta, ma
212 ; CHECK-NEXT:    vrgatherei16.vv v24, v12, v16, v0.t
213 ; CHECK-NEXT:    vmsne.vi v8, v24, 0, v0.t
214 ; CHECK-NEXT:    vmv1r.v v0, v8
215 ; CHECK-NEXT:    ret
216   %dst = call <vscale x 32 x i1> @llvm.experimental.vp.reverse.nxv32i1(<vscale x 32 x i1> %src, <vscale x 32 x i1> %mask, i32 %evl)
217   ret <vscale x 32 x i1> %dst
220 define <vscale x 32 x i1> @test_vp_reverse_nxv32i1(<vscale x 32 x i1> %src, i32 zeroext %evl) {
221 ; CHECK-LABEL: test_vp_reverse_nxv32i1:
222 ; CHECK:       # %bb.0:
223 ; CHECK-NEXT:    addi a1, a0, -1
224 ; CHECK-NEXT:    vsetvli zero, a0, e16, m8, ta, ma
225 ; CHECK-NEXT:    vid.v v8
226 ; CHECK-NEXT:    vrsub.vx v8, v8, a1
227 ; CHECK-NEXT:    vsetvli zero, zero, e8, m4, ta, ma
228 ; CHECK-NEXT:    vmv.v.i v16, 0
229 ; CHECK-NEXT:    vmerge.vim v16, v16, 1, v0
230 ; CHECK-NEXT:    vrgatherei16.vv v20, v16, v8
231 ; CHECK-NEXT:    vmsne.vi v0, v20, 0
232 ; CHECK-NEXT:    ret
233   %head = insertelement <vscale x 32 x i1> undef, i1 1, i32 0
234   %allones = shufflevector <vscale x 32 x i1> %head, <vscale x 32 x i1> undef, <vscale x 32 x i32> zeroinitializer
236   %dst = call <vscale x 32 x i1> @llvm.experimental.vp.reverse.nxv32i1(<vscale x 32 x i1> %src, <vscale x 32 x i1> %allones, i32 %evl)
237   ret <vscale x 32 x i1> %dst
240 define <vscale x 64 x i1> @test_vp_reverse_nxv64i1_masked(<vscale x 64 x i1> %src, <vscale x 64 x i1> %mask, i32 zeroext %evl) {
241 ; CHECK-LABEL: test_vp_reverse_nxv64i1_masked:
242 ; CHECK:       # %bb.0:
243 ; CHECK-NEXT:    vsetvli zero, a0, e8, m8, ta, ma
244 ; CHECK-NEXT:    vmv.v.i v16, 0
245 ; CHECK-NEXT:    vmerge.vim v24, v16, 1, v0
246 ; CHECK-NEXT:    csrr a1, vlenb
247 ; CHECK-NEXT:    slli a2, a1, 2
248 ; CHECK-NEXT:    addi a2, a2, -1
249 ; CHECK-NEXT:    vsetvli a3, zero, e16, m8, ta, ma
250 ; CHECK-NEXT:    vid.v v16
251 ; CHECK-NEXT:    vrsub.vx v0, v16, a2
252 ; CHECK-NEXT:    vsetvli zero, zero, e8, m4, ta, ma
253 ; CHECK-NEXT:    vrgatherei16.vv v20, v24, v0
254 ; CHECK-NEXT:    vrgatherei16.vv v16, v28, v0
255 ; CHECK-NEXT:    slli a1, a1, 3
256 ; CHECK-NEXT:    sub a1, a1, a0
257 ; CHECK-NEXT:    vsetvli zero, a0, e8, m8, ta, ma
258 ; CHECK-NEXT:    vmv1r.v v0, v8
259 ; CHECK-NEXT:    vslidedown.vx v16, v16, a1, v0.t
260 ; CHECK-NEXT:    vmsne.vi v8, v16, 0, v0.t
261 ; CHECK-NEXT:    vmv1r.v v0, v8
262 ; CHECK-NEXT:    ret
263   %dst = call <vscale x 64 x i1> @llvm.experimental.vp.reverse.nxv64i1(<vscale x 64 x i1> %src, <vscale x 64 x i1> %mask, i32 %evl)
264   ret <vscale x 64 x i1> %dst
267 define <vscale x 64 x i1> @test_vp_reverse_nxv64i1(<vscale x 64 x i1> %src, i32 zeroext %evl) {
268 ; CHECK-LABEL: test_vp_reverse_nxv64i1:
269 ; CHECK:       # %bb.0:
270 ; CHECK-NEXT:    vsetvli zero, a0, e8, m8, ta, ma
271 ; CHECK-NEXT:    vmv.v.i v8, 0
272 ; CHECK-NEXT:    vmerge.vim v8, v8, 1, v0
273 ; CHECK-NEXT:    csrr a1, vlenb
274 ; CHECK-NEXT:    slli a2, a1, 2
275 ; CHECK-NEXT:    addi a2, a2, -1
276 ; CHECK-NEXT:    vsetvli a3, zero, e16, m8, ta, ma
277 ; CHECK-NEXT:    vid.v v16
278 ; CHECK-NEXT:    vrsub.vx v24, v16, a2
279 ; CHECK-NEXT:    vsetvli zero, zero, e8, m4, ta, ma
280 ; CHECK-NEXT:    vrgatherei16.vv v20, v8, v24
281 ; CHECK-NEXT:    vrgatherei16.vv v16, v12, v24
282 ; CHECK-NEXT:    slli a1, a1, 3
283 ; CHECK-NEXT:    sub a1, a1, a0
284 ; CHECK-NEXT:    vsetvli zero, a0, e8, m8, ta, ma
285 ; CHECK-NEXT:    vslidedown.vx v8, v16, a1
286 ; CHECK-NEXT:    vmsne.vi v0, v8, 0
287 ; CHECK-NEXT:    ret
288   %head = insertelement <vscale x 64 x i1> undef, i1 1, i32 0
289   %allones = shufflevector <vscale x 64 x i1> %head, <vscale x 64 x i1> undef, <vscale x 64 x i32> zeroinitializer
291   %dst = call <vscale x 64 x i1> @llvm.experimental.vp.reverse.nxv64i1(<vscale x 64 x i1> %src, <vscale x 64 x i1> %allones, i32 %evl)
292   ret <vscale x 64 x i1> %dst
295 declare <vscale x 1 x i1> @llvm.experimental.vp.reverse.nxv1i1(<vscale x 1 x i1>,<vscale x 1 x i1>,i32)
296 declare <vscale x 2 x i1> @llvm.experimental.vp.reverse.nxv2i1(<vscale x 2 x i1>,<vscale x 2 x i1>,i32)
297 declare <vscale x 4 x i1> @llvm.experimental.vp.reverse.nxv4i1(<vscale x 4 x i1>,<vscale x 4 x i1>,i32)
298 declare <vscale x 8 x i1> @llvm.experimental.vp.reverse.nxv8i1(<vscale x 8 x i1>,<vscale x 8 x i1>,i32)
299 declare <vscale x 16 x i1> @llvm.experimental.vp.reverse.nxv16i1(<vscale x 16 x i1>,<vscale x 16 x i1>,i32)
300 declare <vscale x 32 x i1> @llvm.experimental.vp.reverse.nxv32i1(<vscale x 32 x i1>,<vscale x 32 x i1>,i32)
301 declare <vscale x 64 x i1> @llvm.experimental.vp.reverse.nxv64i1(<vscale x 64 x i1>,<vscale x 64 x i1>,i32)