Bump version to 19.1.0-rc3
[llvm-project.git] / llvm / test / CodeGen / RISCV / rvv / get_vector_length.ll
blobbd0fecd285515f6388ac07cd84fcc38752637d78
1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 2
2 ; RUN: sed 's/iXLen/i32/g' %s | llc -mtriple=riscv32 -mattr=+m,+v -verify-machineinstrs | FileCheck %s --check-prefixes=CHECK,RV32
3 ; RUN: sed 's/iXLen/i32/g' %s | llc -mtriple=riscv64 -mattr=+m,+v -verify-machineinstrs | FileCheck %s --check-prefixes=CHECK,RV64
5 declare i32 @llvm.experimental.get.vector.length.i16(i16, i32, i1)
6 declare i32 @llvm.experimental.get.vector.length.i32(i32, i32, i1)
7 declare i32 @llvm.experimental.get.vector.length.i64(i64, i32, i1)
9 define i32 @vector_length_i16(i16 zeroext %tc) {
10 ; CHECK-LABEL: vector_length_i16:
11 ; CHECK:       # %bb.0:
12 ; CHECK-NEXT:    csrr a1, vlenb
13 ; CHECK-NEXT:    srli a1, a1, 2
14 ; CHECK-NEXT:    bltu a0, a1, .LBB0_2
15 ; CHECK-NEXT:  # %bb.1:
16 ; CHECK-NEXT:    mv a0, a1
17 ; CHECK-NEXT:  .LBB0_2:
18 ; CHECK-NEXT:    ret
19   %a = call i32 @llvm.experimental.get.vector.length.i16(i16 %tc, i32 2, i1 true)
20   ret i32 %a
23 define i32 @vector_length_i32(i32 zeroext %tc) {
24 ; CHECK-LABEL: vector_length_i32:
25 ; CHECK:       # %bb.0:
26 ; CHECK-NEXT:    vsetvli a0, a0, e8, mf4, ta, ma
27 ; CHECK-NEXT:    ret
28   %a = call i32 @llvm.experimental.get.vector.length.i32(i32 %tc, i32 2, i1 true)
29   ret i32 %a
32 define i32 @vector_length_XLen(iXLen zeroext %tc) {
33 ; CHECK-LABEL: vector_length_XLen:
34 ; CHECK:       # %bb.0:
35 ; CHECK-NEXT:    vsetvli a0, a0, e8, mf4, ta, ma
36 ; CHECK-NEXT:    ret
37   %a = call i32 @llvm.experimental.get.vector.length.iXLen(iXLen %tc, i32 2, i1 true)
38   ret i32 %a
41 define i32 @vector_length_i16_fixed(i16 zeroext %tc) {
42 ; CHECK-LABEL: vector_length_i16_fixed:
43 ; CHECK:       # %bb.0:
44 ; CHECK-NEXT:    li a1, 2
45 ; CHECK-NEXT:    bltu a0, a1, .LBB3_2
46 ; CHECK-NEXT:  # %bb.1:
47 ; CHECK-NEXT:    li a0, 2
48 ; CHECK-NEXT:  .LBB3_2:
49 ; CHECK-NEXT:    ret
50   %a = call i32 @llvm.experimental.get.vector.length.i16(i16 %tc, i32 2, i1 false)
51   ret i32 %a
54 define i32 @vector_length_i32_fixed(i32 zeroext %tc) {
55 ; CHECK-LABEL: vector_length_i32_fixed:
56 ; CHECK:       # %bb.0:
57 ; CHECK-NEXT:    li a1, 2
58 ; CHECK-NEXT:    bltu a0, a1, .LBB4_2
59 ; CHECK-NEXT:  # %bb.1:
60 ; CHECK-NEXT:    li a0, 2
61 ; CHECK-NEXT:  .LBB4_2:
62 ; CHECK-NEXT:    ret
63   %a = call i32 @llvm.experimental.get.vector.length.i32(i32 %tc, i32 2, i1 false)
64   ret i32 %a
67 define i32 @vector_length_XLen_fixed(iXLen zeroext %tc) {
68 ; CHECK-LABEL: vector_length_XLen_fixed:
69 ; CHECK:       # %bb.0:
70 ; CHECK-NEXT:    li a1, 2
71 ; CHECK-NEXT:    bltu a0, a1, .LBB5_2
72 ; CHECK-NEXT:  # %bb.1:
73 ; CHECK-NEXT:    li a0, 2
74 ; CHECK-NEXT:  .LBB5_2:
75 ; CHECK-NEXT:    ret
76   %a = call i32 @llvm.experimental.get.vector.length.iXLen(iXLen %tc, i32 2, i1 false)
77   ret i32 %a
80 define i32 @vector_length_vf1_i32(i32 zeroext %tc) {
81 ; CHECK-LABEL: vector_length_vf1_i32:
82 ; CHECK:       # %bb.0:
83 ; CHECK-NEXT:    vsetvli a0, a0, e8, mf8, ta, ma
84 ; CHECK-NEXT:    ret
85   %a = call i32 @llvm.experimental.get.vector.length.i32(i32 %tc, i32 1, i1 true)
86   ret i32 %a
89 define i32 @vector_length_vf1_XLen(iXLen zeroext %tc) {
90 ; CHECK-LABEL: vector_length_vf1_XLen:
91 ; CHECK:       # %bb.0:
92 ; CHECK-NEXT:    vsetvli a0, a0, e8, mf8, ta, ma
93 ; CHECK-NEXT:    ret
94   %a = call i32 @llvm.experimental.get.vector.length.iXLen(iXLen %tc, i32 1, i1 true)
95   ret i32 %a
98 define i32 @vector_length_vf2_i32(i32 zeroext %tc) {
99 ; CHECK-LABEL: vector_length_vf2_i32:
100 ; CHECK:       # %bb.0:
101 ; CHECK-NEXT:    vsetvli a0, a0, e8, mf4, ta, ma
102 ; CHECK-NEXT:    ret
103   %a = call i32 @llvm.experimental.get.vector.length.i32(i32 %tc, i32 2, i1 true)
104   ret i32 %a
107 define i32 @vector_length_vf2_XLen(iXLen zeroext %tc) {
108 ; CHECK-LABEL: vector_length_vf2_XLen:
109 ; CHECK:       # %bb.0:
110 ; CHECK-NEXT:    vsetvli a0, a0, e8, mf4, ta, ma
111 ; CHECK-NEXT:    ret
112   %a = call i32 @llvm.experimental.get.vector.length.iXLen(iXLen %tc, i32 2, i1 true)
113   ret i32 %a
116 define i32 @vector_length_vf4_i32(i32 zeroext %tc) {
117 ; CHECK-LABEL: vector_length_vf4_i32:
118 ; CHECK:       # %bb.0:
119 ; CHECK-NEXT:    vsetvli a0, a0, e8, mf2, ta, ma
120 ; CHECK-NEXT:    ret
121   %a = call i32 @llvm.experimental.get.vector.length.i32(i32 %tc, i32 4, i1 true)
122   ret i32 %a
125 define i32 @vector_length_vf4_XLen(iXLen zeroext %tc) {
126 ; CHECK-LABEL: vector_length_vf4_XLen:
127 ; CHECK:       # %bb.0:
128 ; CHECK-NEXT:    vsetvli a0, a0, e8, mf2, ta, ma
129 ; CHECK-NEXT:    ret
130   %a = call i32 @llvm.experimental.get.vector.length.iXLen(iXLen %tc, i32 4, i1 true)
131   ret i32 %a
134 define i32 @vector_length_vf8_i32(i32 zeroext %tc) {
135 ; CHECK-LABEL: vector_length_vf8_i32:
136 ; CHECK:       # %bb.0:
137 ; CHECK-NEXT:    vsetvli a0, a0, e8, m1, ta, ma
138 ; CHECK-NEXT:    ret
139   %a = call i32 @llvm.experimental.get.vector.length.i32(i32 %tc, i32 8, i1 true)
140   ret i32 %a
143 define i32 @vector_length_vf8_XLen(iXLen zeroext %tc) {
144 ; CHECK-LABEL: vector_length_vf8_XLen:
145 ; CHECK:       # %bb.0:
146 ; CHECK-NEXT:    vsetvli a0, a0, e8, m1, ta, ma
147 ; CHECK-NEXT:    ret
148   %a = call i32 @llvm.experimental.get.vector.length.iXLen(iXLen %tc, i32 8, i1 true)
149   ret i32 %a
152 define i32 @vector_length_vf16_i32(i32 zeroext %tc) {
153 ; CHECK-LABEL: vector_length_vf16_i32:
154 ; CHECK:       # %bb.0:
155 ; CHECK-NEXT:    vsetvli a0, a0, e8, m2, ta, ma
156 ; CHECK-NEXT:    ret
157   %a = call i32 @llvm.experimental.get.vector.length.i32(i32 %tc, i32 16, i1 true)
158   ret i32 %a
161 define i32 @vector_length_vf16_XLen(iXLen zeroext %tc) {
162 ; CHECK-LABEL: vector_length_vf16_XLen:
163 ; CHECK:       # %bb.0:
164 ; CHECK-NEXT:    vsetvli a0, a0, e8, m2, ta, ma
165 ; CHECK-NEXT:    ret
166   %a = call i32 @llvm.experimental.get.vector.length.iXLen(iXLen %tc, i32 16, i1 true)
167   ret i32 %a
170 define i32 @vector_length_vf32_i32(i32 zeroext %tc) {
171 ; CHECK-LABEL: vector_length_vf32_i32:
172 ; CHECK:       # %bb.0:
173 ; CHECK-NEXT:    vsetvli a0, a0, e8, m4, ta, ma
174 ; CHECK-NEXT:    ret
175   %a = call i32 @llvm.experimental.get.vector.length.i32(i32 %tc, i32 32, i1 true)
176   ret i32 %a
179 define i32 @vector_length_vf32_XLen(iXLen zeroext %tc) {
180 ; CHECK-LABEL: vector_length_vf32_XLen:
181 ; CHECK:       # %bb.0:
182 ; CHECK-NEXT:    vsetvli a0, a0, e8, m4, ta, ma
183 ; CHECK-NEXT:    ret
184   %a = call i32 @llvm.experimental.get.vector.length.iXLen(iXLen %tc, i32 32, i1 true)
185   ret i32 %a
188 define i32 @vector_length_vf64_i32(i32 zeroext %tc) {
189 ; CHECK-LABEL: vector_length_vf64_i32:
190 ; CHECK:       # %bb.0:
191 ; CHECK-NEXT:    vsetvli a0, a0, e8, m8, ta, ma
192 ; CHECK-NEXT:    ret
193   %a = call i32 @llvm.experimental.get.vector.length.i32(i32 %tc, i32 64, i1 true)
194   ret i32 %a
197 define i32 @vector_length_vf64_XLen(iXLen zeroext %tc) {
198 ; CHECK-LABEL: vector_length_vf64_XLen:
199 ; CHECK:       # %bb.0:
200 ; CHECK-NEXT:    vsetvli a0, a0, e8, m8, ta, ma
201 ; CHECK-NEXT:    ret
202   %a = call i32 @llvm.experimental.get.vector.length.iXLen(iXLen %tc, i32 64, i1 true)
203   ret i32 %a
206 define i32 @vector_length_vf128_i32(i32 zeroext %tc) {
207 ; RV32-LABEL: vector_length_vf128_i32:
208 ; RV32:       # %bb.0:
209 ; RV32-NEXT:    csrr a1, vlenb
210 ; RV32-NEXT:    slli a1, a1, 4
211 ; RV32-NEXT:    bltu a0, a1, .LBB20_2
212 ; RV32-NEXT:  # %bb.1:
213 ; RV32-NEXT:    mv a0, a1
214 ; RV32-NEXT:  .LBB20_2:
215 ; RV32-NEXT:    ret
217 ; RV64-LABEL: vector_length_vf128_i32:
218 ; RV64:       # %bb.0:
219 ; RV64-NEXT:    sext.w a0, a0
220 ; RV64-NEXT:    csrr a1, vlenb
221 ; RV64-NEXT:    slli a1, a1, 4
222 ; RV64-NEXT:    bltu a0, a1, .LBB20_2
223 ; RV64-NEXT:  # %bb.1:
224 ; RV64-NEXT:    mv a0, a1
225 ; RV64-NEXT:  .LBB20_2:
226 ; RV64-NEXT:    ret
227   %a = call i32 @llvm.experimental.get.vector.length.i32(i32 %tc, i32 128, i1 true)
228   ret i32 %a
231 define i32 @vector_length_vf128_XLen(iXLen zeroext %tc) {
232 ; RV32-LABEL: vector_length_vf128_XLen:
233 ; RV32:       # %bb.0:
234 ; RV32-NEXT:    csrr a1, vlenb
235 ; RV32-NEXT:    slli a1, a1, 4
236 ; RV32-NEXT:    bltu a0, a1, .LBB21_2
237 ; RV32-NEXT:  # %bb.1:
238 ; RV32-NEXT:    mv a0, a1
239 ; RV32-NEXT:  .LBB21_2:
240 ; RV32-NEXT:    ret
242 ; RV64-LABEL: vector_length_vf128_XLen:
243 ; RV64:       # %bb.0:
244 ; RV64-NEXT:    sext.w a0, a0
245 ; RV64-NEXT:    csrr a1, vlenb
246 ; RV64-NEXT:    slli a1, a1, 4
247 ; RV64-NEXT:    bltu a0, a1, .LBB21_2
248 ; RV64-NEXT:  # %bb.1:
249 ; RV64-NEXT:    mv a0, a1
250 ; RV64-NEXT:  .LBB21_2:
251 ; RV64-NEXT:    ret
252   %a = call i32 @llvm.experimental.get.vector.length.iXLen(iXLen %tc, i32 128, i1 true)
253   ret i32 %a
256 define i32 @vector_length_vf3_i32(i32 zeroext %tc) {
257 ; RV32-LABEL: vector_length_vf3_i32:
258 ; RV32:       # %bb.0:
259 ; RV32-NEXT:    csrr a1, vlenb
260 ; RV32-NEXT:    srli a1, a1, 3
261 ; RV32-NEXT:    slli a2, a1, 1
262 ; RV32-NEXT:    add a1, a2, a1
263 ; RV32-NEXT:    bltu a0, a1, .LBB22_2
264 ; RV32-NEXT:  # %bb.1:
265 ; RV32-NEXT:    mv a0, a1
266 ; RV32-NEXT:  .LBB22_2:
267 ; RV32-NEXT:    ret
269 ; RV64-LABEL: vector_length_vf3_i32:
270 ; RV64:       # %bb.0:
271 ; RV64-NEXT:    sext.w a0, a0
272 ; RV64-NEXT:    csrr a1, vlenb
273 ; RV64-NEXT:    srli a1, a1, 3
274 ; RV64-NEXT:    slli a2, a1, 1
275 ; RV64-NEXT:    add a1, a2, a1
276 ; RV64-NEXT:    bltu a0, a1, .LBB22_2
277 ; RV64-NEXT:  # %bb.1:
278 ; RV64-NEXT:    mv a0, a1
279 ; RV64-NEXT:  .LBB22_2:
280 ; RV64-NEXT:    ret
281   %a = call i32 @llvm.experimental.get.vector.length.i32(i32 %tc, i32 3, i1 true)
282   ret i32 %a
285 define i32 @vector_length_vf3_XLen(iXLen zeroext %tc) {
286 ; RV32-LABEL: vector_length_vf3_XLen:
287 ; RV32:       # %bb.0:
288 ; RV32-NEXT:    csrr a1, vlenb
289 ; RV32-NEXT:    srli a1, a1, 3
290 ; RV32-NEXT:    slli a2, a1, 1
291 ; RV32-NEXT:    add a1, a2, a1
292 ; RV32-NEXT:    bltu a0, a1, .LBB23_2
293 ; RV32-NEXT:  # %bb.1:
294 ; RV32-NEXT:    mv a0, a1
295 ; RV32-NEXT:  .LBB23_2:
296 ; RV32-NEXT:    ret
298 ; RV64-LABEL: vector_length_vf3_XLen:
299 ; RV64:       # %bb.0:
300 ; RV64-NEXT:    sext.w a0, a0
301 ; RV64-NEXT:    csrr a1, vlenb
302 ; RV64-NEXT:    srli a1, a1, 3
303 ; RV64-NEXT:    slli a2, a1, 1
304 ; RV64-NEXT:    add a1, a2, a1
305 ; RV64-NEXT:    bltu a0, a1, .LBB23_2
306 ; RV64-NEXT:  # %bb.1:
307 ; RV64-NEXT:    mv a0, a1
308 ; RV64-NEXT:  .LBB23_2:
309 ; RV64-NEXT:    ret
310   %a = call i32 @llvm.experimental.get.vector.length.iXLen(iXLen %tc, i32 3, i1 true)
311   ret i32 %a