Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(4)

Side by Side Diff: tests_lit/assembler/arm32/cmp-vec.ll

Issue 1891243002: Subzero. ARM32. De-scalarizes icmp and fcmp for vectors. (Closed) Base URL: https://chromium.googlesource.com/native_client/pnacl-subzero.git@master
Patch Set: Addresses comments. Created 4 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « src/IceTargetLoweringARM32.def ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 ; Test that we handle icmp and fcmp on vectors. 1 ; Test that we handle icmp and fcmp on vectors.
2 2
3 ; TODO(eholk): This test will need to be updated once comparison is no
4 ; longer scalarized.
5
6 ; REQUIRES: allow_dump 3 ; REQUIRES: allow_dump
7 4
8 ; Compile using standalone assembler. 5 ; Compile using standalone assembler.
9 ; RUN: %p2i --filetype=asm -i %s --target=arm32 --args -Om1 \ 6 ; RUN: %p2i --filetype=asm -i %s --target=arm32 --args -O2 \
10 ; RUN: | FileCheck %s --check-prefix=ASM 7 ; RUN: | FileCheck %s --check-prefix=ASM
11 8
12 ; Show bytes in assembled standalone code. 9 ; Show bytes in assembled standalone code.
13 ; RUN: %p2i --filetype=asm -i %s --target=arm32 --assemble --disassemble \ 10 ; RUN: %p2i --filetype=asm -i %s --target=arm32 --assemble --disassemble \
14 ; RUN: --args -Om1 | FileCheck %s --check-prefix=DIS 11 ; RUN: --args -O2 | FileCheck %s --check-prefix=DIS
12
13 ; Compile using integrated assembler.
14 ; RUN: %p2i --filetype=iasm -i %s --target=arm32 --args -O2 \
15 ; RUN: | FileCheck %s --check-prefix=IASM
15 16
16 ; Show bytes in assembled integrated code. 17 ; Show bytes in assembled integrated code.
17 ; RUN: %p2i --filetype=iasm -i %s --target=arm32 --assemble --disassemble \ 18 ; RUN: %p2i --filetype=iasm -i %s --target=arm32 --assemble --disassemble \
18 ; RUN: --args -Om1 | FileCheck %s --check-prefix=DIS 19 ; RUN: --args -O2 | FileCheck %s --check-prefix=DIS
19 20
20 define internal <4 x i32> @cmpEq4I32(<4 x i32> %a, <4 x i32> %b) { 21 define internal <4 x i32> @cmpEqV4I32(<4 x i32> %a, <4 x i32> %b) {
21 ; ASM-LABEL:cmpEq4I32: 22 ; ASM-LABEL:cmpEqV4I32:
22 ; DIS-LABEL:00000000 <cmpEq4I32>: 23 ; DIS-LABEL:00000000 <cmpEqV4I32>:
24 ; IASM-LABEL:cmpEqV4I32:
23 25
24 entry: 26 entry:
25 %cmp = icmp eq <4 x i32> %a, %b 27 %cmp = icmp eq <4 x i32> %a, %b
26 28
27 ; ASM: cmp r1, r2 29 ; ASM: vceq.i32 q0, q0, q1
28 ; ASM: cmp r1, r2 30 ; DIS: 0: f3200852
29 ; ASM: cmp r1, r2 31 ; IASM-NOT: vceq
30 ; ASM: cmp r1, r2 32
31 ; DIS: 40: e1510002 33 %cmp.ret_ext = zext <4 x i1> %cmp to <4 x i32>
32 34 ret <4 x i32> %cmp.ret_ext
33 %cmp.ret_ext = zext <4 x i1> %cmp to <4 x i32> 35 }
34 ret <4 x i32> %cmp.ret_ext 36
35 } 37 define internal <4 x i32> @cmpNeV4I32(<4 x i32> %a, <4 x i32> %b) {
36 38 ; ASM-LABEL:cmpNeV4I32:
37 define internal <4 x i32> @cmpEq4f32(<4 x float> %a, <4 x float> %b) { 39 ; DIS-LABEL:00000010 <cmpNeV4I32>:
38 ; ASM-LABEL:cmpEq4f32: 40 ; IASM-LABEL:cmpNeV4I32:
39 ; DIS-LABEL:00000180 <cmpEq4f32>: 41
42 entry:
43 %cmp = icmp ne <4 x i32> %a, %b
44
45 ; ASM: vceq.i32 q0, q0, q1
46 ; ASM-NEXT: vmvn.i32 q0, q0
47 ; DIS: 10: f3200852
48 ; DIS-NEXT: 14: f3b005c0
49 ; IASM-NOT: vceq
50 ; IASM-NOT: vmvn
51
52 %cmp.ret_ext = zext <4 x i1> %cmp to <4 x i32>
53 ret <4 x i32> %cmp.ret_ext
54 }
55
56 define internal <4 x i32> @cmpUgtV4I32(<4 x i32> %a, <4 x i32> %b) {
57 ; ASM-LABEL:cmpUgtV4I32:
58 ; DIS-LABEL:00000030 <cmpUgtV4I32>:
59 ; IASM-LABEL:cmpUgtV4I32:
60
61 entry:
62 %cmp = icmp ugt <4 x i32> %a, %b
63
64 ; ASM: vcgt.u32 q0, q0, q1
65 ; DIS: 30: f3200342
66 ; IASM-NOT: vcgt
67
68 %cmp.ret_ext = zext <4 x i1> %cmp to <4 x i32>
69 ret <4 x i32> %cmp.ret_ext
70 }
71
72 define internal <4 x i32> @cmpUgeV4I32(<4 x i32> %a, <4 x i32> %b) {
73 ; ASM-LABEL:cmpUgeV4I32:
74 ; DIS-LABEL:00000040 <cmpUgeV4I32>:
75 ; IASM-LABEL:cmpUgeV4I32:
76
77 entry:
78 %cmp = icmp uge <4 x i32> %a, %b
79
80 ; ASM: vcge.u32 q0, q0, q1
81 ; DIS: 40: f3200352
82 ; IASM-NOT: vcge
83
84 %cmp.ret_ext = zext <4 x i1> %cmp to <4 x i32>
85 ret <4 x i32> %cmp.ret_ext
86 }
87
88 define internal <4 x i32> @cmpUltV4I32(<4 x i32> %a, <4 x i32> %b) {
89 ; ASM-LABEL:cmpUltV4I32:
90 ; DIS-LABEL:00000050 <cmpUltV4I32>:
91 ; IASM-LABEL:cmpUltV4I32:
92
93 entry:
94 %cmp = icmp ult <4 x i32> %a, %b
95
96 ; ASM: vcgt.u32 q1, q1, q0
97 ; DIS: 50: f3222340
98 ; IASM-NOT: vcgt
99
100 %cmp.ret_ext = zext <4 x i1> %cmp to <4 x i32>
101 ret <4 x i32> %cmp.ret_ext
102 }
103
104 define internal <4 x i32> @cmpUleV4I32(<4 x i32> %a, <4 x i32> %b) {
105 ; ASM-LABEL:cmpUleV4I32:
106 ; DIS-LABEL:00000070 <cmpUleV4I32>:
107 ; IASM-LABEL:cmpUleV4I32:
108
109 entry:
110 %cmp = icmp ule <4 x i32> %a, %b
111
112 ; ASM: vcge.u32 q1, q1, q0
113 ; DIS: 70: f3222350
114 ; IASM-NOT: vcge
115
116 %cmp.ret_ext = zext <4 x i1> %cmp to <4 x i32>
117 ret <4 x i32> %cmp.ret_ext
118 }
119
120 define internal <4 x i32> @cmpSgtV4I32(<4 x i32> %a, <4 x i32> %b) {
121 ; ASM-LABEL:cmpSgtV4I32:
122 ; DIS-LABEL:00000090 <cmpSgtV4I32>:
123 ; IASM-LABEL:cmpSgtV4I32:
124
125 entry:
126 %cmp = icmp sgt <4 x i32> %a, %b
127
128 ; ASM: vcgt.s32 q0, q0, q1
129 ; DIS: 90: f2200342
130 ; IASM-NOT: vcgt
131
132 %cmp.ret_ext = zext <4 x i1> %cmp to <4 x i32>
133 ret <4 x i32> %cmp.ret_ext
134 }
135
136 define internal <4 x i32> @cmpSgeV4I32(<4 x i32> %a, <4 x i32> %b) {
137 ; ASM-LABEL:cmpSgeV4I32:
138 ; DIS-LABEL:000000a0 <cmpSgeV4I32>:
139 ; IASM-LABEL:cmpSgeV4I32:
140
141 entry:
142 %cmp = icmp sge <4 x i32> %a, %b
143
144 ; ASM: vcge.s32 q0, q0, q1
145 ; DIS: a0: f2200352
146 ; IASM-NOT: vcge
147
148 %cmp.ret_ext = zext <4 x i1> %cmp to <4 x i32>
149 ret <4 x i32> %cmp.ret_ext
150 }
151
152 define internal <4 x i32> @cmpSltV4I32(<4 x i32> %a, <4 x i32> %b) {
153 ; ASM-LABEL:cmpSltV4I32:
154 ; DIS-LABEL:000000b0 <cmpSltV4I32>:
155 ; IASM-LABEL:cmpSltV4I32:
156
157 entry:
158 %cmp = icmp slt <4 x i32> %a, %b
159
160 ; ASM: vcgt.s32 q1, q1, q0
161 ; DIS: b0: f2222340
162 ; IASM-NOT: vcgt
163
164 %cmp.ret_ext = zext <4 x i1> %cmp to <4 x i32>
165 ret <4 x i32> %cmp.ret_ext
166 }
167
168 define internal <4 x i32> @cmpSleV4I32(<4 x i32> %a, <4 x i32> %b) {
169 ; ASM-LABEL:cmpSleV4I32:
170 ; DIS-LABEL:000000d0 <cmpSleV4I32>:
171 ; IASM-LABEL:cmpSleV4I32:
172
173 entry:
174 %cmp = icmp sle <4 x i32> %a, %b
175
176 ; ASM: vcge.s32 q1, q1, q0
177 ; DIS: d0: f2222350
178 ; IASM-NOT: vcge
179
180 %cmp.ret_ext = zext <4 x i1> %cmp to <4 x i32>
181 ret <4 x i32> %cmp.ret_ext
182 }
183
184 define internal <4 x i32> @cmpEqV4I1(<4 x i32> %a, <4 x i32> %b) {
185 ; ASM-LABEL:cmpEqV4I1:
186 ; DIS-LABEL:000000f0 <cmpEqV4I1>:
187 ; IASM-LABEL:cmpEqV4I1:
188
189 entry:
190 %a1 = trunc <4 x i32> %a to <4 x i1>
191 %b1 = trunc <4 x i32> %b to <4 x i1>
192 %cmp = icmp eq <4 x i1> %a1, %b1
193
194 ; ASM: vshl.u32 q0, q0, #31
195 ; ASM-NEXT: vshl.u32 q1, q1, #31
196 ; ASM-NEXT: vceq.i32 q0, q0, q1
197 ; DIS: f0: f2bf0550
198 ; DIS-NEXT: f4: f2bf2552
199 ; DIS-NEXT: f8: f3200852
200 ; IASM-NOT: vshl
201 ; IASM-NOT: vceq
202
203 %cmp.ret_ext = zext <4 x i1> %cmp to <4 x i32>
204 ret <4 x i32> %cmp.ret_ext
205 }
206
207 define internal <4 x i32> @cmpNeV4I1(<4 x i32> %a, <4 x i32> %b) {
208 ; ASM-LABEL:cmpNeV4I1:
209 ; DIS-LABEL:00000110 <cmpNeV4I1>:
210 ; IASM-LABEL:cmpNeV4I1:
211
212 entry:
213 %a1 = trunc <4 x i32> %a to <4 x i1>
214 %b1 = trunc <4 x i32> %b to <4 x i1>
215 %cmp = icmp ne <4 x i1> %a1, %b1
216
217 ; ASM: vshl.u32 q0, q0, #31
218 ; ASM-NEXT: vshl.u32 q1, q1, #31
219 ; ASM-NEXT: vceq.i32 q0, q0, q1
220 ; ASM-NEXT: vmvn.i32 q0, q0
221 ; DIS: 110: f2bf0550
222 ; DIS-NEXT: 114: f2bf2552
223 ; DIS-NEXT: 118: f3200852
224 ; DIS-NEXT: 11c: f3b005c0
225 ; IASM-NOT: vshl
226 ; IASM-NOT: vceq
227 ; IASM-NOT: vmvn
228
229 %cmp.ret_ext = zext <4 x i1> %cmp to <4 x i32>
230 ret <4 x i32> %cmp.ret_ext
231 }
232
233 define internal <4 x i32> @cmpUgtV4I1(<4 x i32> %a, <4 x i32> %b) {
234 ; ASM-LABEL:cmpUgtV4I1:
235 ; DIS-LABEL:00000130 <cmpUgtV4I1>:
236 ; IASM-LABEL:cmpUgtV4I1:
237
238 entry:
239 %a1 = trunc <4 x i32> %a to <4 x i1>
240 %b1 = trunc <4 x i32> %b to <4 x i1>
241 %cmp = icmp ugt <4 x i1> %a1, %b1
242
243 ; ASM: vshl.u32 q0, q0, #31
244 ; ASM-NEXT: vshl.u32 q1, q1, #31
245 ; ASM-NEXT: vcgt.u32 q0, q0, q1
246 ; DIS: 130: f2bf0550
247 ; DIS-NEXT: 134: f2bf2552
248 ; DIS-NEXT: 138: f3200342
249 ; IASM-NOT: vshl
250 ; IASM-NOT: vcgt
251
252 %cmp.ret_ext = zext <4 x i1> %cmp to <4 x i32>
253 ret <4 x i32> %cmp.ret_ext
254 }
255
256 define internal <4 x i32> @cmpUgeV4I1(<4 x i32> %a, <4 x i32> %b) {
257 ; ASM-LABEL:cmpUgeV4I1:
258 ; DIS-LABEL:00000150 <cmpUgeV4I1>:
259 ; IASM-LABEL:cmpUgeV4I1:
260
261 entry:
262 %a1 = trunc <4 x i32> %a to <4 x i1>
263 %b1 = trunc <4 x i32> %b to <4 x i1>
264 %cmp = icmp uge <4 x i1> %a1, %b1
265
266 ; ASM: vshl.u32 q0, q0, #31
267 ; ASM-NEXT: vshl.u32 q1, q1, #31
268 ; ASM-NEXT: vcge.u32 q0, q0, q1
269 ; DIS: 150: f2bf0550
270 ; DIS-NEXT: 154: f2bf2552
271 ; DIS-NEXT: 158: f3200352
272 ; IASM-NOT: vshl
273 ; IASM-NOT: vcge
274
275 %cmp.ret_ext = zext <4 x i1> %cmp to <4 x i32>
276 ret <4 x i32> %cmp.ret_ext
277 }
278
279 define internal <4 x i32> @cmpUltV4I1(<4 x i32> %a, <4 x i32> %b) {
280 ; ASM-LABEL:cmpUltV4I1:
281 ; DIS-LABEL:00000170 <cmpUltV4I1>:
282 ; IASM-LABEL:cmpUltV4I1:
283
284 entry:
285 %a1 = trunc <4 x i32> %a to <4 x i1>
286 %b1 = trunc <4 x i32> %b to <4 x i1>
287 %cmp = icmp ult <4 x i1> %a1, %b1
288
289 ; ASM: vshl.u32 q0, q0, #31
290 ; ASM-NEXT: vshl.u32 q1, q1, #31
291 ; ASM-NEXT: vcgt.u32 q1, q1, q0
292 ; DIS: 170: f2bf0550
293 ; DIS-NEXT: 174: f2bf2552
294 ; DIS-NEXT: 178: f3222340
295 ; IASM-NOT: vshl
296 ; IASM-NOT: vcgt
297
298 %cmp.ret_ext = zext <4 x i1> %cmp to <4 x i32>
299 ret <4 x i32> %cmp.ret_ext
300 }
301
302 define internal <4 x i32> @cmpUleV4I1(<4 x i32> %a, <4 x i32> %b) {
303 ; ASM-LABEL:cmpUleV4I1:
304 ; DIS-LABEL:00000190 <cmpUleV4I1>:
305 ; IASM-LABEL:cmpUleV4I1:
306
307 entry:
308 %a1 = trunc <4 x i32> %a to <4 x i1>
309 %b1 = trunc <4 x i32> %b to <4 x i1>
310 %cmp = icmp ule <4 x i1> %a1, %b1
311
312 ; ASM: vshl.u32 q0, q0, #31
313 ; ASM-NEXT: vshl.u32 q1, q1, #31
314 ; ASM-NEXT: vcge.u32 q1, q1, q0
315 ; DIS: 190: f2bf0550
316 ; DIS-NEXT: 194: f2bf2552
317 ; DIS-NEXT: 198: f3222350
318 ; IASM-NOT: vshl
319 ; IASM-NOT: vcge
320
321 %cmp.ret_ext = zext <4 x i1> %cmp to <4 x i32>
322 ret <4 x i32> %cmp.ret_ext
323 }
324
325 define internal <4 x i32> @cmpSgtV4I1(<4 x i32> %a, <4 x i32> %b) {
326 ; ASM-LABEL:cmpSgtV4I1:
327 ; DIS-LABEL:000001b0 <cmpSgtV4I1>:
328 ; IASM-LABEL:cmpSgtV4I1:
329
330 entry:
331 %a1 = trunc <4 x i32> %a to <4 x i1>
332 %b1 = trunc <4 x i32> %b to <4 x i1>
333 %cmp = icmp sgt <4 x i1> %a1, %b1
334
335 ; ASM: vshl.u32 q0, q0, #31
336 ; ASM-NEXT: vshl.u32 q1, q1, #31
337 ; ASM-NEXT: vcgt.s32 q0, q0, q1
338 ; DIS: 1b0: f2bf0550
339 ; DIS-NEXT: 1b4: f2bf2552
340 ; DIS-NEXT: 1b8: f2200342
341 ; IASM-NOT: vshl
342 ; IASM-NOT: vcgt
343
344 %cmp.ret_ext = zext <4 x i1> %cmp to <4 x i32>
345 ret <4 x i32> %cmp.ret_ext
346 }
347
348 define internal <4 x i32> @cmpSgeV4I1(<4 x i32> %a, <4 x i32> %b) {
349 ; ASM-LABEL:cmpSgeV4I1:
350 ; DIS-LABEL:000001d0 <cmpSgeV4I1>:
351 ; IASM-LABEL:cmpSgeV4I1:
352
353 entry:
354 %a1 = trunc <4 x i32> %a to <4 x i1>
355 %b1 = trunc <4 x i32> %b to <4 x i1>
356 %cmp = icmp sge <4 x i1> %a1, %b1
357
358 ; ASM: vshl.u32 q0, q0, #31
359 ; ASM-NEXT: vshl.u32 q1, q1, #31
360 ; ASM-NEXT: vcge.s32 q0, q0, q1
361 ; DIS: 1d0: f2bf0550
362 ; DIS-NEXT: 1d4: f2bf2552
363 ; DIS-NEXT: 1d8: f2200352
364 ; IASM-NOT: vshl
365 ; IASM-NOT: vcge
366
367 %cmp.ret_ext = zext <4 x i1> %cmp to <4 x i32>
368 ret <4 x i32> %cmp.ret_ext
369 }
370
371 define internal <4 x i32> @cmpSltV4I1(<4 x i32> %a, <4 x i32> %b) {
372 ; ASM-LABEL:cmpSltV4I1:
373 ; DIS-LABEL:000001f0 <cmpSltV4I1>:
374 ; IASM-LABEL:cmpSltV4I1:
375
376 entry:
377 %a1 = trunc <4 x i32> %a to <4 x i1>
378 %b1 = trunc <4 x i32> %b to <4 x i1>
379 %cmp = icmp slt <4 x i1> %a1, %b1
380
381 ; ASM: vshl.u32 q0, q0, #31
382 ; ASM-NEXT: vshl.u32 q1, q1, #31
383 ; ASM-NEXT: vcgt.s32 q1, q1, q0
384 ; DIS: 1f0: f2bf0550
385 ; DIS-NEXT: 1f4: f2bf2552
386 ; DIS-NEXT: 1f8: f2222340
387 ; IASM-NOT: vshl
388 ; IASM-NOT: vcgt
389
390 %cmp.ret_ext = zext <4 x i1> %cmp to <4 x i32>
391 ret <4 x i32> %cmp.ret_ext
392 }
393
394 define internal <4 x i32> @cmpSleV4I1(<4 x i32> %a, <4 x i32> %b) {
395 ; ASM-LABEL:cmpSleV4I1:
396 ; DIS-LABEL:00000210 <cmpSleV4I1>:
397 ; IASM-LABEL:cmpSleV4I1:
398
399 entry:
400 %a1 = trunc <4 x i32> %a to <4 x i1>
401 %b1 = trunc <4 x i32> %b to <4 x i1>
402 %cmp = icmp sle <4 x i1> %a1, %b1
403
404 ; ASM: vshl.u32 q0, q0, #31
405 ; ASM-NEXT: vshl.u32 q1, q1, #31
406 ; ASM-NEXT: vcge.s32 q1, q1, q0
407 ; DIS: 210: f2bf0550
408 ; DIS-NEXT: 214: f2bf2552
409 ; DIS-NEXT: 218: f2222350
410 ; IASM-NOT: vshl
411 ; IASM-NOT: vcge
412
413 %cmp.ret_ext = zext <4 x i1> %cmp to <4 x i32>
414 ret <4 x i32> %cmp.ret_ext
415 }
416
417 define internal <8 x i16> @cmpEqV8I16(<8 x i16> %a, <8 x i16> %b) {
418 ; ASM-LABEL:cmpEqV8I16:
419 ; DIS-LABEL:00000230 <cmpEqV8I16>:
420 ; IASM-LABEL:cmpEqV8I16:
421
422 entry:
423 %cmp = icmp eq <8 x i16> %a, %b
424
425 ; ASM: vceq.i16 q0, q0, q1
426 ; DIS: 230: f3100852
427 ; IASM-NOT: vceq
428
429 %cmp.ret_ext = zext <8 x i1> %cmp to <8 x i16>
430 ret <8 x i16> %cmp.ret_ext
431 }
432
433 define internal <8 x i16> @cmpNeV8I16(<8 x i16> %a, <8 x i16> %b) {
434 ; ASM-LABEL:cmpNeV8I16:
435 ; DIS-LABEL:00000240 <cmpNeV8I16>:
436 ; IASM-LABEL:cmpNeV8I16:
437
438 entry:
439 %cmp = icmp ne <8 x i16> %a, %b
440
441 ; ASM: vceq.i16 q0, q0, q1
442 ; ASM-NEXT: vmvn.i16 q0, q0
443 ; DIS: 240: f3100852
444 ; DIS-NEXT: 244: f3b005c0
445 ; IASM-NOT: vceq
446 ; IASM-NOT: vmvn
447
448 %cmp.ret_ext = zext <8 x i1> %cmp to <8 x i16>
449 ret <8 x i16> %cmp.ret_ext
450 }
451
452 define internal <8 x i16> @cmpUgtV8I16(<8 x i16> %a, <8 x i16> %b) {
453 ; ASM-LABEL:cmpUgtV8I16:
454 ; DIS-LABEL:00000260 <cmpUgtV8I16>:
455 ; IASM-LABEL:cmpUgtV8I16:
456
457 entry:
458 %cmp = icmp ugt <8 x i16> %a, %b
459
460 ; ASM: vcgt.u16 q0, q0, q1
461 ; DIS: 260: f3100342
462 ; IASM-NOT: vcgt
463
464 %cmp.ret_ext = zext <8 x i1> %cmp to <8 x i16>
465 ret <8 x i16> %cmp.ret_ext
466 }
467
468 define internal <8 x i16> @cmpUgeV8I16(<8 x i16> %a, <8 x i16> %b) {
469 ; ASM-LABEL:cmpUgeV8I16:
470 ; DIS-LABEL:00000270 <cmpUgeV8I16>:
471 ; IASM-LABEL:cmpUgeV8I16:
472
473 entry:
474 %cmp = icmp uge <8 x i16> %a, %b
475
476 ; ASM: vcge.u16 q0, q0, q1
477 ; DIS: 270: f3100352
478 ; IASM-NOT: vcge
479
480 %cmp.ret_ext = zext <8 x i1> %cmp to <8 x i16>
481 ret <8 x i16> %cmp.ret_ext
482 }
483
484 define internal <8 x i16> @cmpUltV8I16(<8 x i16> %a, <8 x i16> %b) {
485 ; ASM-LABEL:cmpUltV8I16:
486 ; DIS-LABEL:00000280 <cmpUltV8I16>:
487 ; IASM-LABEL:cmpUltV8I16:
488
489 entry:
490 %cmp = icmp ult <8 x i16> %a, %b
491
492 ; ASM: vcgt.u16 q1, q1, q0
493 ; DIS: 280: f3122340
494 ; IASM-NOT: vcgt
495
496 %cmp.ret_ext = zext <8 x i1> %cmp to <8 x i16>
497 ret <8 x i16> %cmp.ret_ext
498 }
499
500 define internal <8 x i16> @cmpUleV8I16(<8 x i16> %a, <8 x i16> %b) {
501 ; ASM-LABEL:cmpUleV8I16:
502 ; DIS-LABEL:000002a0 <cmpUleV8I16>:
503 ; IASM-LABEL:cmpUleV8I16:
504
505 entry:
506 %cmp = icmp ule <8 x i16> %a, %b
507
508 ; ASM: vcge.u16 q1, q1, q0
509 ; DIS: 2a0: f3122350
510 ; IASM-NOT: vcge
511
512 %cmp.ret_ext = zext <8 x i1> %cmp to <8 x i16>
513 ret <8 x i16> %cmp.ret_ext
514 }
515
516 define internal <8 x i16> @cmpSgtV8I16(<8 x i16> %a, <8 x i16> %b) {
517 ; ASM-LABEL:cmpSgtV8I16:
518 ; DIS-LABEL:000002c0 <cmpSgtV8I16>:
519 ; IASM-LABEL:cmpSgtV8I16:
520
521 entry:
522 %cmp = icmp sgt <8 x i16> %a, %b
523
524 ; ASM: vcgt.s16 q0, q0, q1
525 ; DIS: 2c0: f2100342
526 ; IASM-NOT: vcgt
527
528 %cmp.ret_ext = zext <8 x i1> %cmp to <8 x i16>
529 ret <8 x i16> %cmp.ret_ext
530 }
531
532 define internal <8 x i16> @cmpSgeV8I16(<8 x i16> %a, <8 x i16> %b) {
533 ; ASM-LABEL:cmpSgeV8I16:
534 ; DIS-LABEL:000002d0 <cmpSgeV8I16>:
535 ; IASM-LABEL:cmpSgeV8I16:
536
537 entry:
538 %cmp = icmp sge <8 x i16> %a, %b
539
540 ; ASM: vcge.s16 q0, q0, q1
541 ; DIS: 2d0: f2100352
542 ; IASM-NOT: vcge
543
544 %cmp.ret_ext = zext <8 x i1> %cmp to <8 x i16>
545 ret <8 x i16> %cmp.ret_ext
546 }
547
548 define internal <8 x i16> @cmpSltV8I16(<8 x i16> %a, <8 x i16> %b) {
549 ; ASM-LABEL:cmpSltV8I16:
550 ; DIS-LABEL:000002e0 <cmpSltV8I16>:
551 ; IASM-LABEL:cmpSltV8I16:
552
553 entry:
554 %cmp = icmp slt <8 x i16> %a, %b
555
556 ; ASM: vcgt.s16 q1, q1, q0
557 ; DIS: 2e0: f2122340
558 ; IASM-NOT: vcgt
559
560 %cmp.ret_ext = zext <8 x i1> %cmp to <8 x i16>
561 ret <8 x i16> %cmp.ret_ext
562 }
563
564 define internal <8 x i16> @cmpSleV8I16(<8 x i16> %a, <8 x i16> %b) {
565 ; ASM-LABEL:cmpSleV8I16:
566 ; DIS-LABEL:00000300 <cmpSleV8I16>:
567 ; IASM-LABEL:cmpSleV8I16:
568
569 entry:
570 %cmp = icmp sle <8 x i16> %a, %b
571
572 ; ASM: vcge.s16 q1, q1, q0
573 ; DIS: 300: f2122350
574 ; IASM-NOT: vcge
575
576 %cmp.ret_ext = zext <8 x i1> %cmp to <8 x i16>
577 ret <8 x i16> %cmp.ret_ext
578 }
579
580 define internal <8 x i16> @cmpEqV8I1(<8 x i16> %a, <8 x i16> %b) {
581 ; ASM-LABEL:cmpEqV8I1:
582 ; DIS-LABEL:00000320 <cmpEqV8I1>:
583 ; IASM-LABEL:cmpEqV8I1:
584
585 entry:
586 %a1 = trunc <8 x i16> %a to <8 x i1>
587 %b1 = trunc <8 x i16> %b to <8 x i1>
588 %cmp = icmp eq <8 x i1> %a1, %b1
589
590 ; ASM: vshl.u16 q0, q0, #15
591 ; ASM-NEXT: vshl.u16 q1, q1, #15
592 ; ASM-NEXT: vceq.i16 q0, q0, q1
593 ; DIS: 320: f29f0550
594 ; DIS-NEXT: 324: f29f2552
595 ; DIS-NEXT: 328: f3100852
596 ; IASM-NOT: vshl
597 ; IASM-NOT: vceq
598
599 %cmp.ret_ext = zext <8 x i1> %cmp to <8 x i16>
600 ret <8 x i16> %cmp.ret_ext
601 }
602
603 define internal <8 x i16> @cmpNeV8I1(<8 x i16> %a, <8 x i16> %b) {
604 ; ASM-LABEL:cmpNeV8I1:
605 ; DIS-LABEL:00000340 <cmpNeV8I1>:
606 ; IASM-LABEL:cmpNeV8I1:
607
608 entry:
609 %a1 = trunc <8 x i16> %a to <8 x i1>
610 %b1 = trunc <8 x i16> %b to <8 x i1>
611 %cmp = icmp ne <8 x i1> %a1, %b1
612
613 ; ASM: vshl.u16 q0, q0, #15
614 ; ASM-NEXT: vshl.u16 q1, q1, #15
615 ; ASM-NEXT: vceq.i16 q0, q0, q1
616 ; ASM-NEXT: vmvn.i16 q0, q0
617 ; DIS: 340: f29f0550
618 ; DIS-NEXT: 344: f29f2552
619 ; DIS-NEXT: 348: f3100852
620 ; DIS-NEXT: 34c: f3b005c0
621 ; IASM-NOT: vshl
622 ; IASM-NOT: vceq
623 ; IASM-NOT: vmvn
624
625 %cmp.ret_ext = zext <8 x i1> %cmp to <8 x i16>
626 ret <8 x i16> %cmp.ret_ext
627 }
628
629 define internal <8 x i16> @cmpUgtV8I1(<8 x i16> %a, <8 x i16> %b) {
630 ; ASM-LABEL:cmpUgtV8I1:
631 ; DIS-LABEL:00000360 <cmpUgtV8I1>:
632 ; IASM-LABEL:cmpUgtV8I1:
633
634 entry:
635 %a1 = trunc <8 x i16> %a to <8 x i1>
636 %b1 = trunc <8 x i16> %b to <8 x i1>
637 %cmp = icmp ugt <8 x i1> %a1, %b1
638
639 ; ASM: vshl.u16 q0, q0, #15
640 ; ASM-NEXT: vshl.u16 q1, q1, #15
641 ; ASM-NEXT: vcgt.u16 q0, q0, q1
642 ; DIS: 360: f29f0550
643 ; DIS-NEXT: 364: f29f2552
644 ; DIS-NEXT: 368: f3100342
645 ; IASM-NOT: vshl
646 ; IASM-NOT: vcgt
647
648 %cmp.ret_ext = zext <8 x i1> %cmp to <8 x i16>
649 ret <8 x i16> %cmp.ret_ext
650 }
651
652 define internal <8 x i16> @cmpUgeV8I1(<8 x i16> %a, <8 x i16> %b) {
653 ; ASM-LABEL:cmpUgeV8I1:
654 ; DIS-LABEL:00000380 <cmpUgeV8I1>:
655 ; IASM-LABEL:cmpUgeV8I1:
656
657 entry:
658 %a1 = trunc <8 x i16> %a to <8 x i1>
659 %b1 = trunc <8 x i16> %b to <8 x i1>
660 %cmp = icmp uge <8 x i1> %a1, %b1
661
662 ; ASM: vshl.u16 q0, q0, #15
663 ; ASM-NEXT: vshl.u16 q1, q1, #15
664 ; ASM-NEXT: vcge.u16 q0, q0, q1
665 ; DIS: 380: f29f0550
666 ; DIS-NEXT: 384: f29f2552
667 ; DIS-NEXT: 388: f3100352
668 ; IASM-NOT: vshl
669 ; IASM-NOT: vcge
670
671 %cmp.ret_ext = zext <8 x i1> %cmp to <8 x i16>
672 ret <8 x i16> %cmp.ret_ext
673 }
674
675 define internal <8 x i16> @cmpUltV8I1(<8 x i16> %a, <8 x i16> %b) {
676 ; ASM-LABEL:cmpUltV8I1:
677 ; DIS-LABEL:000003a0 <cmpUltV8I1>:
678 ; IASM-LABEL:cmpUltV8I1:
679
680 entry:
681 %a1 = trunc <8 x i16> %a to <8 x i1>
682 %b1 = trunc <8 x i16> %b to <8 x i1>
683 %cmp = icmp ult <8 x i1> %a1, %b1
684
685 ; ASM: vshl.u16 q0, q0, #15
686 ; ASM-NEXT: vshl.u16 q1, q1, #15
687 ; ASM-NEXT: vcgt.u16 q1, q1, q0
688 ; DIS: 3a0: f29f0550
689 ; DIS-NEXT: 3a4: f29f2552
690 ; DIS-NEXT: 3a8: f3122340
691 ; IASM-NOT: vshl
692 ; IASM-NOT: vcgt
693
694 %cmp.ret_ext = zext <8 x i1> %cmp to <8 x i16>
695 ret <8 x i16> %cmp.ret_ext
696 }
697
698 define internal <8 x i16> @cmpUleV8I1(<8 x i16> %a, <8 x i16> %b) {
699 ; ASM-LABEL:cmpUleV8I1:
700 ; DIS-LABEL:000003c0 <cmpUleV8I1>:
701 ; IASM-LABEL:cmpUleV8I1:
702
703 entry:
704 %a1 = trunc <8 x i16> %a to <8 x i1>
705 %b1 = trunc <8 x i16> %b to <8 x i1>
706 %cmp = icmp ule <8 x i1> %a1, %b1
707
708 ; ASM: vshl.u16 q0, q0, #15
709 ; ASM-NEXT: vshl.u16 q1, q1, #15
710 ; ASM-NEXT: vcge.u16 q1, q1, q0
711 ; DIS: 3c0: f29f0550
712 ; DIS-NEXT: 3c4: f29f2552
713 ; DIS-NEXT: 3c8: f3122350
714 ; IASM-NOT: vshl
715 ; IASM-NOT: vcge
716
717 %cmp.ret_ext = zext <8 x i1> %cmp to <8 x i16>
718 ret <8 x i16> %cmp.ret_ext
719 }
720
721 define internal <8 x i16> @cmpSgtV8I1(<8 x i16> %a, <8 x i16> %b) {
722 ; ASM-LABEL:cmpSgtV8I1:
723 ; DIS-LABEL:000003e0 <cmpSgtV8I1>:
724 ; IASM-LABEL:cmpSgtV8I1:
725
726 entry:
727 %a1 = trunc <8 x i16> %a to <8 x i1>
728 %b1 = trunc <8 x i16> %b to <8 x i1>
729 %cmp = icmp sgt <8 x i1> %a1, %b1
730
731 ; ASM: vshl.u16 q0, q0, #15
732 ; ASM-NEXT: vshl.u16 q1, q1, #15
733 ; ASM-NEXT: vcgt.s16 q0, q0, q1
734 ; DIS: 3e0: f29f0550
735 ; DIS-NEXT: 3e4: f29f2552
736 ; DIS-NEXT: 3e8: f2100342
737 ; IASM-NOT: vshl
738 ; IASM-NOT: vcgt
739
740 %cmp.ret_ext = zext <8 x i1> %cmp to <8 x i16>
741 ret <8 x i16> %cmp.ret_ext
742 }
743
744 define internal <8 x i16> @cmpSgeV8I1(<8 x i16> %a, <8 x i16> %b) {
745 ; ASM-LABEL:cmpSgeV8I1:
746 ; DIS-LABEL:00000400 <cmpSgeV8I1>:
747 ; IASM-LABEL:cmpSgeV8I1:
748
749 entry:
750 %a1 = trunc <8 x i16> %a to <8 x i1>
751 %b1 = trunc <8 x i16> %b to <8 x i1>
752 %cmp = icmp sge <8 x i1> %a1, %b1
753
754 ; ASM: vshl.u16 q0, q0, #15
755 ; ASM-NEXT: vshl.u16 q1, q1, #15
756 ; ASM-NEXT: vcge.s16 q0, q0, q1
757 ; DIS: 400: f29f0550
758 ; DIS-NEXT: 404: f29f2552
759 ; DIS-NEXT: 408: f2100352
760 ; IASM-NOT: vshl
761 ; IASM-NOT: vcge
762
763 %cmp.ret_ext = zext <8 x i1> %cmp to <8 x i16>
764 ret <8 x i16> %cmp.ret_ext
765 }
766
767 define internal <8 x i16> @cmpSltV8I1(<8 x i16> %a, <8 x i16> %b) {
768 ; ASM-LABEL:cmpSltV8I1:
769 ; DIS-LABEL:00000420 <cmpSltV8I1>:
770 ; IASM-LABEL:cmpSltV8I1:
771
772 entry:
773 %a1 = trunc <8 x i16> %a to <8 x i1>
774 %b1 = trunc <8 x i16> %b to <8 x i1>
775 %cmp = icmp slt <8 x i1> %a1, %b1
776
777 ; ASM: vshl.u16 q0, q0, #15
778 ; ASM-NEXT: vshl.u16 q1, q1, #15
779 ; ASM-NEXT: vcgt.s16 q1, q1, q0
780 ; DIS: 420: f29f0550
781 ; DIS-NEXT: 424: f29f2552
782 ; DIS-NEXT: 428: f2122340
783 ; IASM-NOT: vshl
784 ; IASM-NOT: vcgt
785
786 %cmp.ret_ext = zext <8 x i1> %cmp to <8 x i16>
787 ret <8 x i16> %cmp.ret_ext
788 }
789
790 define internal <8 x i16> @cmpSleV8I1(<8 x i16> %a, <8 x i16> %b) {
791 ; ASM-LABEL:cmpSleV8I1:
792 ; DIS-LABEL:00000440 <cmpSleV8I1>:
793 ; IASM-LABEL:cmpSleV8I1:
794
795 entry:
796 %a1 = trunc <8 x i16> %a to <8 x i1>
797 %b1 = trunc <8 x i16> %b to <8 x i1>
798 %cmp = icmp sle <8 x i1> %a1, %b1
799
800 ; ASM: vshl.u16 q0, q0, #15
801 ; ASM-NEXT: vshl.u16 q1, q1, #15
802 ; ASM-NEXT: vcge.s16 q1, q1, q0
803 ; DIS: 440: f29f0550
804 ; DIS-NEXT: 444: f29f2552
805 ; DIS-NEXT: 448: f2122350
806 ; IASM-NOT: vshl
807 ; IASM-NOT: vcge
808
809 %cmp.ret_ext = zext <8 x i1> %cmp to <8 x i16>
810 ret <8 x i16> %cmp.ret_ext
811 }
812
813 define internal <16 x i8> @cmpEqV16I8(<16 x i8> %a, <16 x i8> %b) {
814 ; ASM-LABEL:cmpEqV16I8:
815 ; DIS-LABEL:00000460 <cmpEqV16I8>:
816 ; IASM-LABEL:cmpEqV16I8:
817
818 entry:
819 %cmp = icmp eq <16 x i8> %a, %b
820
821 ; ASM: vceq.i8 q0, q0, q1
822 ; DIS: 460: f3000852
823 ; IASM-NOT: vceq
824
825 %cmp.ret_ext = zext <16 x i1> %cmp to <16 x i8>
826 ret <16 x i8> %cmp.ret_ext
827 }
828
829 define internal <16 x i8> @cmpNeV16I8(<16 x i8> %a, <16 x i8> %b) {
830 ; ASM-LABEL:cmpNeV16I8:
831 ; DIS-LABEL:00000470 <cmpNeV16I8>:
832 ; IASM-LABEL:cmpNeV16I8:
833
834 entry:
835 %cmp = icmp ne <16 x i8> %a, %b
836
837 ; ASM: vceq.i8 q0, q0, q1
838 ; ASM-NEXT: vmvn.i8 q0, q0
839 ; DIS: 470: f3000852
840 ; DIS-NEXT: 474: f3b005c0
841 ; IASM-NOT: vceq
842 ; IASM-NOT: vmvn
843
844 %cmp.ret_ext = zext <16 x i1> %cmp to <16 x i8>
845 ret <16 x i8> %cmp.ret_ext
846 }
847
848 define internal <16 x i8> @cmpUgtV16I8(<16 x i8> %a, <16 x i8> %b) {
849 ; ASM-LABEL:cmpUgtV16I8:
850 ; DIS-LABEL:00000490 <cmpUgtV16I8>:
851 ; IASM-LABEL:cmpUgtV16I8:
852
853 entry:
854 %cmp = icmp ugt <16 x i8> %a, %b
855
856 ; ASM: vcgt.u8 q0, q0, q1
857 ; DIS: 490: f3000342
858 ; IASM-NOT: vcgt
859
860 %cmp.ret_ext = zext <16 x i1> %cmp to <16 x i8>
861 ret <16 x i8> %cmp.ret_ext
862 }
863
864 define internal <16 x i8> @cmpUgeV16I8(<16 x i8> %a, <16 x i8> %b) {
865 ; ASM-LABEL:cmpUgeV16I8:
866 ; DIS-LABEL:000004a0 <cmpUgeV16I8>:
867 ; IASM-LABEL:cmpUgeV16I8:
868
869 entry:
870 %cmp = icmp uge <16 x i8> %a, %b
871
872 ; ASM: vcge.u8 q0, q0, q1
873 ; DIS: 4a0: f3000352
874 ; IASM-NOT: vcge
875
876 %cmp.ret_ext = zext <16 x i1> %cmp to <16 x i8>
877 ret <16 x i8> %cmp.ret_ext
878 }
879
880 define internal <16 x i8> @cmpUltV16I8(<16 x i8> %a, <16 x i8> %b) {
881 ; ASM-LABEL:cmpUltV16I8:
882 ; DIS-LABEL:000004b0 <cmpUltV16I8>:
883 ; IASM-LABEL:cmpUltV16I8:
884
885 entry:
886 %cmp = icmp ult <16 x i8> %a, %b
887
888 ; ASM: vcgt.u8 q1, q1, q0
889 ; DIS: 4b0: f3022340
890 ; IASM-NOT: vcgt
891
892 %cmp.ret_ext = zext <16 x i1> %cmp to <16 x i8>
893 ret <16 x i8> %cmp.ret_ext
894 }
895
896 define internal <16 x i8> @cmpUleV16I8(<16 x i8> %a, <16 x i8> %b) {
897 ; ASM-LABEL:cmpUleV16I8:
898 ; DIS-LABEL:000004d0 <cmpUleV16I8>:
899 ; IASM-LABEL:cmpUleV16I8:
900
901 entry:
902 %cmp = icmp ule <16 x i8> %a, %b
903
904 ; ASM: vcge.u8 q1, q1, q0
905 ; DIS: 4d0: f3022350
906 ; IASM-NOT: vcge
907
908 %cmp.ret_ext = zext <16 x i1> %cmp to <16 x i8>
909 ret <16 x i8> %cmp.ret_ext
910 }
911
912 define internal <16 x i8> @cmpSgtV16I8(<16 x i8> %a, <16 x i8> %b) {
913 ; ASM-LABEL:cmpSgtV16I8:
914 ; DIS-LABEL:000004f0 <cmpSgtV16I8>:
915 ; IASM-LABEL:cmpSgtV16I8:
916
917 entry:
918 %cmp = icmp sgt <16 x i8> %a, %b
919
920 ; ASM: vcgt.s8 q0, q0, q1
921 ; DIS: 4f0: f2000342
922 ; IASM-NOT: vcgt
923
924 %cmp.ret_ext = zext <16 x i1> %cmp to <16 x i8>
925 ret <16 x i8> %cmp.ret_ext
926 }
927
928 define internal <16 x i8> @cmpSgeV16I8(<16 x i8> %a, <16 x i8> %b) {
929 ; ASM-LABEL:cmpSgeV16I8:
930 ; DIS-LABEL:00000500 <cmpSgeV16I8>:
931 ; IASM-LABEL:cmpSgeV16I8:
932
933 entry:
934 %cmp = icmp sge <16 x i8> %a, %b
935
936 ; ASM: vcge.s8 q0, q0, q1
937 ; DIS: 500: f2000352
938 ; IASM-NOT: vcge
939
940 %cmp.ret_ext = zext <16 x i1> %cmp to <16 x i8>
941 ret <16 x i8> %cmp.ret_ext
942 }
943
944 define internal <16 x i8> @cmpSltV16I8(<16 x i8> %a, <16 x i8> %b) {
945 ; ASM-LABEL:cmpSltV16I8:
946 ; DIS-LABEL:00000510 <cmpSltV16I8>:
947 ; IASM-LABEL:cmpSltV16I8:
948
949 entry:
950 %cmp = icmp slt <16 x i8> %a, %b
951
952 ; ASM: vcgt.s8 q1, q1, q0
953 ; DIS: 510: f2022340
954 ; IASM-NOT: vcgt
955
956 %cmp.ret_ext = zext <16 x i1> %cmp to <16 x i8>
957 ret <16 x i8> %cmp.ret_ext
958 }
959
960 define internal <16 x i8> @cmpSleV16I8(<16 x i8> %a, <16 x i8> %b) {
961 ; ASM-LABEL:cmpSleV16I8:
962 ; DIS-LABEL:00000530 <cmpSleV16I8>:
963 ; IASM-LABEL:cmpSleV16I8:
964
965 entry:
966 %cmp = icmp sle <16 x i8> %a, %b
967
968 ; ASM: vcge.s8 q1, q1, q0
969 ; DIS: 530: f2022350
970 ; IASM-NOT: vcge
971
972 %cmp.ret_ext = zext <16 x i1> %cmp to <16 x i8>
973 ret <16 x i8> %cmp.ret_ext
974 }
975
976 define internal <16 x i8> @cmpEqV16I1(<16 x i8> %a, <16 x i8> %b) {
977 ; ASM-LABEL:cmpEqV16I1:
978 ; DIS-LABEL:00000550 <cmpEqV16I1>:
979 ; IASM-LABEL:cmpEqV16I1:
980
981 entry:
982 %a1 = trunc <16 x i8> %a to <16 x i1>
983 %b1 = trunc <16 x i8> %b to <16 x i1>
984 %cmp = icmp eq <16 x i1> %a1, %b1
985
986 ; ASM: vshl.u8 q0, q0, #7
987 ; ASM-NEXT: vshl.u8 q1, q1, #7
988 ; ASM-NEXT: vceq.i8 q0, q0, q1
989 ; DIS: 550: f28f0550
990 ; DIS-NEXT: 554: f28f2552
991 ; DIS-NEXT: 558: f3000852
992 ; IASM-NOT: vshl
993 ; IASM-NOT: vceq
994
995 %cmp.ret_ext = zext <16 x i1> %cmp to <16 x i8>
996 ret <16 x i8> %cmp.ret_ext
997 }
998
999 define internal <16 x i8> @cmpNeV16I1(<16 x i8> %a, <16 x i8> %b) {
1000 ; ASM-LABEL:cmpNeV16I1:
1001 ; DIS-LABEL:00000570 <cmpNeV16I1>:
1002 ; IASM-LABEL:cmpNeV16I1:
1003
1004 entry:
1005 %a1 = trunc <16 x i8> %a to <16 x i1>
1006 %b1 = trunc <16 x i8> %b to <16 x i1>
1007 %cmp = icmp ne <16 x i1> %a1, %b1
1008
1009 ; ASM: vshl.u8 q0, q0, #7
1010 ; ASM-NEXT: vshl.u8 q1, q1, #7
1011 ; ASM-NEXT: vceq.i8 q0, q0, q1
1012 ; ASM-NEXT: vmvn.i8 q0, q0
1013 ; DIS: 570: f28f0550
1014 ; DIS-NEXT: 574: f28f2552
1015 ; DIS-NEXT: 578: f3000852
1016 ; DIS-NEXT: 57c: f3b005c0
1017 ; IASM-NOT: vshl
1018 ; IASM-NOT: vceq
1019 ; IASM-NOT: vmvn
1020
1021 %cmp.ret_ext = zext <16 x i1> %cmp to <16 x i8>
1022 ret <16 x i8> %cmp.ret_ext
1023 }
1024
1025 define internal <16 x i8> @cmpUgtV16I1(<16 x i8> %a, <16 x i8> %b) {
1026 ; ASM-LABEL:cmpUgtV16I1:
1027 ; DIS-LABEL:00000590 <cmpUgtV16I1>:
1028 ; IASM-LABEL:cmpUgtV16I1:
1029
1030 entry:
1031 %a1 = trunc <16 x i8> %a to <16 x i1>
1032 %b1 = trunc <16 x i8> %b to <16 x i1>
1033 %cmp = icmp ugt <16 x i1> %a1, %b1
1034
1035 ; ASM: vshl.u8 q0, q0, #7
1036 ; ASM-NEXT: vshl.u8 q1, q1, #7
1037 ; ASM-NEXT: vcgt.u8 q0, q0, q1
1038 ; DIS: 590: f28f0550
1039 ; DIS-NEXT: 594: f28f2552
1040 ; DIS-NEXT: 598: f3000342
1041 ; IASM-NOT: vshl
1042 ; IASM-NOT: vcgt
1043
1044 %cmp.ret_ext = zext <16 x i1> %cmp to <16 x i8>
1045 ret <16 x i8> %cmp.ret_ext
1046 }
1047
1048 define internal <16 x i8> @cmpUgeV16I1(<16 x i8> %a, <16 x i8> %b) {
1049 ; ASM-LABEL:cmpUgeV16I1:
1050 ; DIS-LABEL:000005b0 <cmpUgeV16I1>:
1051 ; IASM-LABEL:cmpUgeV16I1:
1052
1053 entry:
1054 %a1 = trunc <16 x i8> %a to <16 x i1>
1055 %b1 = trunc <16 x i8> %b to <16 x i1>
1056 %cmp = icmp uge <16 x i1> %a1, %b1
1057
1058 ; ASM: vshl.u8 q0, q0, #7
1059 ; ASM-NEXT: vshl.u8 q1, q1, #7
1060 ; ASM-NEXT: vcge.u8 q0, q0, q1
1061 ; DIS: 5b0: f28f0550
1062 ; DIS-NEXT: 5b4: f28f2552
1063 ; DIS-NEXT: 5b8: f3000352
1064 ; IASM-NOT: vshl
1065 ; IASM-NOT: vcge
1066
1067 %cmp.ret_ext = zext <16 x i1> %cmp to <16 x i8>
1068 ret <16 x i8> %cmp.ret_ext
1069 }
1070
1071 define internal <16 x i8> @cmpUltV16I1(<16 x i8> %a, <16 x i8> %b) {
1072 ; ASM-LABEL:cmpUltV16I1:
1073 ; DIS-LABEL:000005d0 <cmpUltV16I1>:
1074 ; IASM-LABEL:cmpUltV16I1:
1075
1076 entry:
1077 %a1 = trunc <16 x i8> %a to <16 x i1>
1078 %b1 = trunc <16 x i8> %b to <16 x i1>
1079 %cmp = icmp ult <16 x i1> %a1, %b1
1080
1081 ; ASM: vshl.u8 q0, q0, #7
1082 ; ASM-NEXT: vshl.u8 q1, q1, #7
1083 ; ASM-NEXT: vcgt.u8 q1, q1, q0
1084 ; DIS: 5d0: f28f0550
1085 ; DIS-NEXT: 5d4: f28f2552
1086 ; DIS-NEXT: 5d8: f3022340
1087 ; IASM-NOT: vshl
1088 ; IASM-NOT: vcgt
1089
1090 %cmp.ret_ext = zext <16 x i1> %cmp to <16 x i8>
1091 ret <16 x i8> %cmp.ret_ext
1092 }
1093
1094 define internal <16 x i8> @cmpUleV16I1(<16 x i8> %a, <16 x i8> %b) {
1095 ; ASM-LABEL:cmpUleV16I1:
1096 ; DIS-LABEL:000005f0 <cmpUleV16I1>:
1097 ; IASM-LABEL:cmpUleV16I1:
1098
1099 entry:
1100 %a1 = trunc <16 x i8> %a to <16 x i1>
1101 %b1 = trunc <16 x i8> %b to <16 x i1>
1102 %cmp = icmp ule <16 x i1> %a1, %b1
1103
1104 ; ASM: vshl.u8 q0, q0, #7
1105 ; ASM-NEXT: vshl.u8 q1, q1, #7
1106 ; ASM-NEXT: vcge.u8 q1, q1, q0
1107 ; DIS: 5f0: f28f0550
1108 ; DIS-NEXT: 5f4: f28f2552
1109 ; DIS-NEXT: 5f8: f3022350
1110 ; IASM-NOT: vshl
1111 ; IASM-NOT: vcge
1112
1113 %cmp.ret_ext = zext <16 x i1> %cmp to <16 x i8>
1114 ret <16 x i8> %cmp.ret_ext
1115 }
1116
1117 define internal <16 x i8> @cmpSgtV16I1(<16 x i8> %a, <16 x i8> %b) {
1118 ; ASM-LABEL:cmpSgtV16I1:
1119 ; DIS-LABEL:00000610 <cmpSgtV16I1>:
1120 ; IASM-LABEL:cmpSgtV16I1:
1121
1122 entry:
1123 %a1 = trunc <16 x i8> %a to <16 x i1>
1124 %b1 = trunc <16 x i8> %b to <16 x i1>
1125 %cmp = icmp sgt <16 x i1> %a1, %b1
1126
1127 ; ASM: vshl.u8 q0, q0, #7
1128 ; ASM-NEXT: vshl.u8 q1, q1, #7
1129 ; ASM-NEXT: vcgt.s8 q0, q0, q1
1130 ; DIS: 610: f28f0550
1131 ; DIS-NEXT: 614: f28f2552
1132 ; DIS-NEXT: 618: f2000342
1133 ; IASM-NOT: vshl
1134 ; IASM-NOT: vcgt
1135
1136 %cmp.ret_ext = zext <16 x i1> %cmp to <16 x i8>
1137 ret <16 x i8> %cmp.ret_ext
1138 }
1139
1140 define internal <16 x i8> @cmpSgeV16I1(<16 x i8> %a, <16 x i8> %b) {
1141 ; ASM-LABEL:cmpSgeV16I1:
1142 ; DIS-LABEL:00000630 <cmpSgeV16I1>:
1143 ; IASM-LABEL:cmpSgeV16I1:
1144
1145 entry:
1146 %a1 = trunc <16 x i8> %a to <16 x i1>
1147 %b1 = trunc <16 x i8> %b to <16 x i1>
1148 %cmp = icmp sge <16 x i1> %a1, %b1
1149
1150 ; ASM: vshl.u8 q0, q0, #7
1151 ; ASM-NEXT: vshl.u8 q1, q1, #7
1152 ; ASM-NEXT: vcge.s8 q0, q0, q1
1153 ; DIS: 630: f28f0550
1154 ; DIS-NEXT: 634: f28f2552
1155 ; DIS-NEXT: 638: f2000352
1156 ; IASM-NOT: vshl
1157 ; IASM-NOT: vcge
1158
1159 %cmp.ret_ext = zext <16 x i1> %cmp to <16 x i8>
1160 ret <16 x i8> %cmp.ret_ext
1161 }
1162
1163 define internal <16 x i8> @cmpSltV16I1(<16 x i8> %a, <16 x i8> %b) {
1164 ; ASM-LABEL:cmpSltV16I1:
1165 ; DIS-LABEL:00000650 <cmpSltV16I1>:
1166 ; IASM-LABEL:cmpSltV16I1:
1167
1168 entry:
1169 %a1 = trunc <16 x i8> %a to <16 x i1>
1170 %b1 = trunc <16 x i8> %b to <16 x i1>
1171 %cmp = icmp slt <16 x i1> %a1, %b1
1172
1173 ; ASM: vshl.u8 q0, q0, #7
1174 ; ASM-NEXT: vshl.u8 q1, q1, #7
1175 ; ASM-NEXT: vcgt.s8 q1, q1, q0
1176 ; DIS: 650: f28f0550
1177 ; DIS-NEXT: 654: f28f2552
1178 ; DIS-NEXT: 658: f2022340
1179 ; IASM-NOT: vshl
1180 ; IASM-NOT: vcgt
1181
1182 %cmp.ret_ext = zext <16 x i1> %cmp to <16 x i8>
1183 ret <16 x i8> %cmp.ret_ext
1184 }
1185
1186 define internal <16 x i8> @cmpSleV16I1(<16 x i8> %a, <16 x i8> %b) {
1187 ; ASM-LABEL:cmpSleV16I1:
1188 ; DIS-LABEL:00000670 <cmpSleV16I1>:
1189 ; IASM-LABEL:cmpSleV16I1:
1190
1191 entry:
1192 %a1 = trunc <16 x i8> %a to <16 x i1>
1193 %b1 = trunc <16 x i8> %b to <16 x i1>
1194 %cmp = icmp sle <16 x i1> %a1, %b1
1195
1196 ; ASM: vshl.u8 q0, q0, #7
1197 ; ASM-NEXT: vshl.u8 q1, q1, #7
1198 ; ASM-NEXT: vcge.s8 q1, q1, q0
1199 ; DIS: 670: f28f0550
1200 ; DIS-NEXT: 674: f28f2552
1201 ; DIS-NEXT: 678: f2022350
1202 ; IASM-NOT: vshl
1203 ; IASM-NOT: vcge
1204
1205 %cmp.ret_ext = zext <16 x i1> %cmp to <16 x i8>
1206 ret <16 x i8> %cmp.ret_ext
1207 }
1208
1209 define internal <4 x i32> @cmpFalseV4Float(<4 x float> %a, <4 x float> %b) {
1210 ; ASM-LABEL:cmpFalseV4Float:
1211 ; DIS-LABEL:00000690 <cmpFalseV4Float>:
1212 ; IASM-LABEL:cmpFalseV4Float:
1213
1214 entry:
1215 %cmp = fcmp false <4 x float> %a, %b
1216
1217 ; ASM: vmov.i32 q0, #0
1218 ; DIS: 690: f2800050
1219 ; IASM-NOT: vmov
1220
1221 %zext = zext <4 x i1> %cmp to <4 x i32>
1222 ret <4 x i32> %zext
1223 }
1224
1225 define internal <4 x i32> @cmpOeqV4Float(<4 x float> %a, <4 x float> %b) {
1226 ; ASM-LABEL:cmpOeqV4Float:
1227 ; DIS-LABEL:000006a0 <cmpOeqV4Float>:
1228 ; IASM-LABEL:cmpOeqV4Float:
40 1229
41 entry: 1230 entry:
42 %cmp = fcmp oeq <4 x float> %a, %b 1231 %cmp = fcmp oeq <4 x float> %a, %b
43 1232
44 ; ASM: vcmp.f32 s0, s1 1233 ; ASM: vceq.f32 q0, q0, q1
45 ; ASM: vcmp.f32 s0, s1 1234 ; DIS: 6a0: f2000e42
46 ; ASM: vcmp.f32 s0, s1 1235 ; IASM-NOT: vceq
47 ; ASM: vcmp.f32 s0, s1 1236
48 ; DIS: 1bc: eeb40a60 1237 %zext = zext <4 x i1> %cmp to <4 x i32>
49 1238 ret <4 x i32> %zext
50 %cmp.ret_ext = zext <4 x i1> %cmp to <4 x i32> 1239 }
51 ret <4 x i32> %cmp.ret_ext 1240
52 } 1241 define internal <4 x i32> @cmpOgtV4Float(<4 x float> %a, <4 x float> %b) {
1242 ; ASM-LABEL:cmpOgtV4Float:
1243 ; DIS-LABEL:000006b0 <cmpOgtV4Float>:
1244 ; IASM-LABEL:cmpOgtV4Float:
1245
1246 entry:
1247 %cmp = fcmp ogt <4 x float> %a, %b
1248
1249 ; ASM: vcgt.f32 q0, q0, q1
1250 ; DIS: 6b0: f3200e42
1251 ; IASM-NOT: vcgt
1252
1253 %zext = zext <4 x i1> %cmp to <4 x i32>
1254 ret <4 x i32> %zext
1255 }
1256
1257 define internal <4 x i32> @cmpOgeV4Float(<4 x float> %a, <4 x float> %b) {
1258 ; ASM-LABEL:cmpOgeV4Float:
1259 ; DIS-LABEL:000006c0 <cmpOgeV4Float>:
1260 ; IASM-LABEL:cmpOgeV4Float:
1261
1262 entry:
1263 %cmp = fcmp oge <4 x float> %a, %b
1264
1265 ; ASM: vcge.f32 q0, q0, q1
1266 ; DIS: 6c0: f3000e42
1267 ; IASM-NOT: vcge
1268
1269 %zext = zext <4 x i1> %cmp to <4 x i32>
1270 ret <4 x i32> %zext
1271 }
1272
1273 define internal <4 x i32> @cmpOltV4Float(<4 x float> %a, <4 x float> %b) {
1274 ; ASM-LABEL:cmpOltV4Float:
1275 ; DIS-LABEL:000006d0 <cmpOltV4Float>:
1276 ; IASM-LABEL:cmpOltV4Float:
1277
1278 entry:
1279 %cmp = fcmp olt <4 x float> %a, %b
1280
1281 ; ASM: vcgt.f32 q1, q1, q0
1282 ; DIS: 6d0: f3222e40
1283 ; IASM-NOT: vcgt
1284
1285 %zext = zext <4 x i1> %cmp to <4 x i32>
1286 ret <4 x i32> %zext
1287 }
1288
1289 define internal <4 x i32> @cmpOleV4Float(<4 x float> %a, <4 x float> %b) {
1290 ; ASM-LABEL:cmpOleV4Float:
1291 ; DIS-LABEL:000006f0 <cmpOleV4Float>:
1292 ; IASM-LABEL:cmpOleV4Float:
1293
1294 entry:
1295 %cmp = fcmp ole <4 x float> %a, %b
1296
1297 ; ASM: vcge.f32 q1, q1, q0
1298 ; DIS: 6f0: f3022e40
1299 ; IASM-NOT: vcge
1300
1301 %zext = zext <4 x i1> %cmp to <4 x i32>
1302 ret <4 x i32> %zext
1303 }
1304
1305 define internal <4 x i32> @cmpOrdV4Float(<4 x float> %a, <4 x float> %b) {
1306 ; ASM-LABEL:cmpOrdV4Float:
1307 ; DIS-LABEL:00000710 <cmpOrdV4Float>:
1308 ; IASM-LABEL:cmpOrdV4Float:
1309
1310 entry:
1311 %cmp = fcmp ord <4 x float> %a, %b
1312
1313 ; ASM: vcge.f32 q2, q0, q1
1314 ; ASM-NEXT: vcgt.f32 q1, q1, q0
1315 ; DIS: 710: f3004e42
1316 ; DIS-NEXT: 714: f3222e40
1317 ; IASM-NOT: vcge
1318 ; IASM-NOT: vcgt
1319
1320 %zext = zext <4 x i1> %cmp to <4 x i32>
1321 ret <4 x i32> %zext
1322 }
1323
1324 define internal <4 x i32> @cmpUeqV4Float(<4 x float> %a, <4 x float> %b) {
1325 ; ASM-LABEL:cmpUeqV4Float:
1326 ; DIS-LABEL:00000730 <cmpUeqV4Float>:
1327 ; IASM-LABEL:cmpUeqV4Float:
1328
1329 entry:
1330 %cmp = fcmp ueq <4 x float> %a, %b
1331
1332 ; ASM: vcgt.f32 q2, q0, q1
1333 ; ASM-NEXT: vcgt.f32 q1, q1, q0
1334 ; ASM-NEXT: vorr.i32 q2, q2, q1
1335 ; ASM-NEXT: vmvn.i32 q2, q2
1336 ; DIS: 730: f3204e42
1337 ; DIS-NEXT: 734: f3222e40
1338 ; DIS-NEXT: 738: f2244152
1339 ; DIS-NEXT: 73c: f3b045c4
1340 ; IASM-NOT: vcgt
1341 ; IASM-NOT: vorr
1342 ; IASM-NOT: vmvn
1343
1344 %zext = zext <4 x i1> %cmp to <4 x i32>
1345 ret <4 x i32> %zext
1346 }
1347
1348 define internal <4 x i32> @cmpUgtV4Float(<4 x float> %a, <4 x float> %b) {
1349 ; ASM-LABEL:cmpUgtV4Float:
1350 ; DIS-LABEL:00000750 <cmpUgtV4Float>:
1351 ; IASM-LABEL:cmpUgtV4Float:
1352
1353 entry:
1354 %cmp = fcmp ugt <4 x float> %a, %b
1355
1356 ; ASM: vcge.f32 q1, q1, q0
1357 ; ASM-NEXT: vmvn.i32 q1, q1
1358 ; DIS: 750: f3022e40
1359 ; DIS-NEXT: 754: f3b025c2
1360 ; IASM-NOT: vcge
1361 ; IASM-NOT: vmvn
1362
1363 %zext = zext <4 x i1> %cmp to <4 x i32>
1364 ret <4 x i32> %zext
1365 }
1366
1367 define internal <4 x i32> @cmpUgeV4Float(<4 x float> %a, <4 x float> %b) {
1368 ; ASM-LABEL:cmpUgeV4Float:
1369 ; DIS-LABEL:00000770 <cmpUgeV4Float>:
1370 ; IASM-LABEL:cmpUgeV4Float:
1371
1372 entry:
1373 %cmp = fcmp uge <4 x float> %a, %b
1374
1375 ; ASM: vcgt.f32 q1, q1, q0
1376 ; ASM-NEXT: vmvn.i32 q1, q1
1377 ; DIS: 770: f3222e40
1378 ; DIS-NEXT: 774: f3b025c2
1379 ; IASM-NOT: vcgt
1380 ; IASM-NOT: vmvn
1381
1382 %zext = zext <4 x i1> %cmp to <4 x i32>
1383 ret <4 x i32> %zext
1384 }
1385
1386 define internal <4 x i32> @cmpUltV4Float(<4 x float> %a, <4 x float> %b) {
1387 ; ASM-LABEL:cmpUltV4Float:
1388 ; DIS-LABEL:00000790 <cmpUltV4Float>:
1389 ; IASM-LABEL:cmpUltV4Float:
1390
1391 entry:
1392 %cmp = fcmp ult <4 x float> %a, %b
1393
1394 ; ASM: vcge.f32 q0, q0, q1
1395 ; ASM-NEXT: vmvn.i32 q0, q0
1396 ; DIS: 790: f3000e42
1397 ; DIS-NEXT: 794: f3b005c0
1398 ; IASM-NOT: vcge
1399 ; IASM-NOT: vmvn
1400
1401 %zext = zext <4 x i1> %cmp to <4 x i32>
1402 ret <4 x i32> %zext
1403 }
1404
1405 define internal <4 x i32> @cmpUleV4Float(<4 x float> %a, <4 x float> %b) {
1406 ; ASM-LABEL:cmpUleV4Float:
1407 ; DIS-LABEL:000007b0 <cmpUleV4Float>:
1408 ; IASM-LABEL:cmpUleV4Float:
1409
1410 entry:
1411 %cmp = fcmp ule <4 x float> %a, %b
1412
1413 ; ASM: vcgt.f32 q0, q0, q1
1414 ; ASM-NEXT: vmvn.i32 q0, q0
1415 ; DIS: 7b0: f3200e42
1416 ; DIS-NEXT: 7b4: f3b005c0
1417 ; IASM-NOT: vcgt
1418 ; IASM-NOT: vmvn
1419
1420 %zext = zext <4 x i1> %cmp to <4 x i32>
1421 ret <4 x i32> %zext
1422 }
1423
1424 define internal <4 x i32> @cmpTrueV4Float(<4 x float> %a, <4 x float> %b) {
1425 ; ASM-LABEL:cmpTrueV4Float:
1426 ; DIS-LABEL:000007d0 <cmpTrueV4Float>:
1427 ; IASM-LABEL:cmpTrueV4Float:
1428
1429 entry:
1430 %cmp = fcmp true <4 x float> %a, %b
1431
1432 ; ASM: vmov.i32 q0, #1
1433 ; DIS: 7d0: f2800051
1434 ; IASM-NOT: vmov
1435
1436 %zext = zext <4 x i1> %cmp to <4 x i32>
1437 ret <4 x i32> %zext
1438 }
OLDNEW
« no previous file with comments | « src/IceTargetLoweringARM32.def ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698