Revert r354244 "[DAGCombiner] Eliminate dead stores to stack."
[llvm-complete.git] / test / CodeGen / AArch64 / fp16-v8-instructions.ll
blobccf8c6874975db2e643af207640de1a7343c5d1a
1 ; RUN: llc < %s -asm-verbose=false -mtriple=aarch64-none-eabi -mattr=-fullfp16 | FileCheck -allow-deprecated-dag-overlap %s --check-prefix=CHECK-CVT   --check-prefix=CHECK
2 ; RUN: llc < %s -asm-verbose=false -mtriple=aarch64-none-eabi -mattr=+fullfp16 | FileCheck -allow-deprecated-dag-overlap %s --check-prefix=CHECK-FP16  --check-prefix=CHECK
4 define <8 x half> @add_h(<8 x half> %a, <8 x half> %b) {
5 entry:
6 ; CHECK-CVT-LABEL: add_h:
7 ; CHECK-CVT:     fcvt
8 ; CHECK-CVT:     fcvt
9 ; CHECK-CVT-DAG: fadd
10 ; CHECK-CVT-DAG: fcvt
11 ; CHECK-CVT-DAG: fcvt
12 ; CHECK-CVT-DAG: fadd
13 ; CHECK-CVT-DAG: fcvt
14 ; CHECK-CVT-DAG: fcvt
15 ; CHECK-CVT-DAG: fadd
16 ; CHECK-CVT-DAG: fcvt
17 ; CHECK-CVT-DAG: fcvt
18 ; CHECK-CVT-DAG: fadd
19 ; CHECK-CVT-DAG: fcvt
20 ; CHECK-CVT-DAG: fcvt
21 ; CHECK-CVT-DAG: fadd
22 ; CHECK-CVT-DAG: fcvt
23 ; CHECK-CVT-DAG: fcvt
24 ; CHECK-CVT-DAG: fadd
25 ; CHECK-CVT-DAG: fcvt
26 ; CHECK-CVT-DAG: fcvt
27 ; CHECK-CVT-DAG: fadd
28 ; CHECK-CVT-DAG: fcvt
29 ; CHECK-CVT-DAG: fcvt
30 ; CHECK-CVT-DAG: fadd
31 ; CHECK-CVT-DAG: fcvt
32 ; CHECK-CVT-DAG: fcvt
33 ; CHECK-CVT-DAG: fcvt
34 ; CHECK-CVT-DAG: fcvt
35 ; CHECK-CVT-DAG: fcvt
36 ; CHECK-CVT-DAG: fcvt
37 ; CHECK-CVT-DAG: fcvt
38 ; CHECK-CVT:     fcvt
40 ; CHECK-FP16-LABEL: add_h:
41 ; CHECK-FP16:       fadd  v0.8h, v0.8h, v1.8h
42 ; CHECK-FP16-NEXT:  ret
44   %0 = fadd <8 x half> %a, %b
45   ret <8 x half> %0
49 define <8 x half> @sub_h(<8 x half> %a, <8 x half> %b) {
50 entry:
51 ; CHECK-CVT-LABEL: sub_h:
52 ; CHECK-CVT:       fcvt
53 ; CHECK-CVT:       fcvt
54 ; CHECK-CVT-DAG:   fsub
55 ; CHECK-CVT-DAG:   fcvt
56 ; CHECK-CVT-DAG:   fcvt
57 ; CHECK-CVT-DAG:   fsub
58 ; CHECK-CVT-DAG:   fcvt
59 ; CHECK-CVT-DAG:   fcvt
60 ; CHECK-CVT-DAG:   fsub
61 ; CHECK-CVT-DAG:   fcvt
62 ; CHECK-CVT-DAG:   fcvt
63 ; CHECK-CVT-DAG:   fsub
64 ; CHECK-CVT-DAG:   fcvt
65 ; CHECK-CVT-DAG:   fcvt
66 ; CHECK-CVT-DAG:   fsub
67 ; CHECK-CVT-DAG:   fcvt
68 ; CHECK-CVT-DAG:   fcvt
69 ; CHECK-CVT-DAG:   fsub
70 ; CHECK-CVT-DAG:   fcvt
71 ; CHECK-CVT-DAG:   fcvt
72 ; CHECK-CVT-DAG:   fsub
73 ; CHECK-CVT-DAG:   fcvt
74 ; CHECK-CVT-DAG:   fcvt
75 ; CHECK-CVT-DAG:   fsub
76 ; CHECK-CVT-DAG:   fcvt
77 ; CHECK-CVT-DAG:   fcvt
78 ; CHECK-CVT-DAG:   fcvt
79 ; CHECK-CVT-DAG:   fcvt
80 ; CHECK-CVT-DAG:   fcvt
81 ; CHECK-CVT-DAG:   fcvt
82 ; CHECK-CVT-DAG:   fcvt
83 ; CHECK-CVT:       fcvt
85 ; CHECK-FP16-LABEL: sub_h:
86 ; CHECK-FP16:       fsub  v0.8h, v0.8h, v1.8h
87 ; CHECK-FP16-NEXT:  ret
89   %0 = fsub <8 x half> %a, %b
90   ret <8 x half> %0
94 define <8 x half> @mul_h(<8 x half> %a, <8 x half> %b) {
95 entry:
96 ; CHECK-CVT-LABEL: mul_h:
97 ; CHECK-CVT:       fcvt
98 ; CHECK-CVT:       fcvt
99 ; CHECK-CVT-DAG:   fmul
100 ; CHECK-CVT-DAG:   fcvt
101 ; CHECK-CVT-DAG:   fcvt
102 ; CHECK-CVT-DAG:   fmul
103 ; CHECK-CVT-DAG:   fcvt
104 ; CHECK-CVT-DAG:   fcvt
105 ; CHECK-CVT-DAG:   fmul
106 ; CHECK-CVT-DAG:   fcvt
107 ; CHECK-CVT-DAG:   fcvt
108 ; CHECK-CVT-DAG:   fmul
109 ; CHECK-CVT-DAG:   fcvt
110 ; CHECK-CVT-DAG:   fcvt
111 ; CHECK-CVT-DAG:   fmul
112 ; CHECK-CVT-DAG:   fcvt
113 ; CHECK-CVT-DAG:   fcvt
114 ; CHECK-CVT-DAG:   fmul
115 ; CHECK-CVT-DAG:   fcvt
116 ; CHECK-CVT-DAG:   fcvt
117 ; CHECK-CVT-DAG:   fmul
118 ; CHECK-CVT-DAG:   fcvt
119 ; CHECK-CVT-DAG:   fcvt
120 ; CHECK-CVT-DAG:   fmul
121 ; CHECK-CVT-DAG:   fcvt
122 ; CHECK-CVT-DAG:   fcvt
123 ; CHECK-CVT-DAG:   fcvt
124 ; CHECK-CVT-DAG:   fcvt
125 ; CHECK-CVT-DAG:   fcvt
126 ; CHECK-CVT-DAG:   fcvt
127 ; CHECK-CVT-DAG:   fcvt
128 ; CHECK-CVT:       fcvt
130 ; CHECK-FP16-LABEL: mul_h:
131 ; CHECK-FP16:       fmul  v0.8h, v0.8h, v1.8h
132 ; CHECK-FP16-NEXT:  ret
134   %0 = fmul <8 x half> %a, %b
135   ret <8 x half> %0
139 define <8 x half> @div_h(<8 x half> %a, <8 x half> %b) {
140 entry:
141 ; CHECK-CVT-LABEL: div_h:
142 ; CHECK-CVT:       fcvt
143 ; CHECK-CVT:       fcvt
144 ; CHECK-CVT-DAG:   fdiv
145 ; CHECK-CVT-DAG:   fcvt
146 ; CHECK-CVT-DAG:   fcvt
147 ; CHECK-CVT-DAG:   fdiv
148 ; CHECK-CVT-DAG:   fcvt
149 ; CHECK-CVT-DAG:   fcvt
150 ; CHECK-CVT-DAG:   fdiv
151 ; CHECK-CVT-DAG:   fcvt
152 ; CHECK-CVT-DAG:   fcvt
153 ; CHECK-CVT-DAG:   fdiv
154 ; CHECK-CVT-DAG:   fcvt
155 ; CHECK-CVT-DAG:   fcvt
156 ; CHECK-CVT-DAG:   fdiv
157 ; CHECK-CVT-DAG:   fcvt
158 ; CHECK-CVT-DAG:   fcvt
159 ; CHECK-CVT-DAG:   fdiv
160 ; CHECK-CVT-DAG:   fcvt
161 ; CHECK-CVT-DAG:   fcvt
162 ; CHECK-CVT-DAG:   fdiv
163 ; CHECK-CVT-DAG:   fcvt
164 ; CHECK-CVT-DAG:   fcvt
165 ; CHECK-CVT-DAG:   fdiv
166 ; CHECK-CVT-DAG:   fcvt
167 ; CHECK-CVT-DAG:   fcvt
168 ; CHECK-CVT-DAG:   fcvt
169 ; CHECK-CVT-DAG:   fcvt
170 ; CHECK-CVT-DAG:   fcvt
171 ; CHECK-CVT-DAG:   fcvt
172 ; CHECK-CVT-DAG:   fcvt
173 ; CHECK-CVT:       fcvt
175 ; CHECK-FP16-LABEL: div_h:
176 ; CHECK-FP16:       fdiv  v0.8h, v0.8h, v1.8h
177 ; CHECK-FP16-NEXT:  ret
179   %0 = fdiv <8 x half> %a, %b
180   ret <8 x half> %0
184 define <8 x half> @load_h(<8 x half>* %a) {
185 entry:
186 ; CHECK-LABEL: load_h:
187 ; CHECK: ldr q0, [x0]
188   %0 = load <8 x half>, <8 x half>* %a, align 4
189   ret <8 x half> %0
193 define void @store_h(<8 x half>* %a, <8 x half> %b) {
194 entry:
195 ; CHECK-LABEL: store_h:
196 ; CHECK: str q0, [x0]
197   store <8 x half> %b, <8 x half>* %a, align 4
198   ret void
201 define <8 x half> @s_to_h(<8 x float> %a) {
202 ; CHECK-LABEL: s_to_h:
203 ; CHECK-DAG: fcvtn v0.4h, v0.4s
204 ; CHECK-DAG: fcvtn [[REG:v[0-9+]]].4h, v1.4s
205 ; CHECK: mov v0.d[1], [[REG]].d[0]
206   %1 = fptrunc <8 x float> %a to <8 x half>
207   ret <8 x half> %1
210 define <8 x half> @d_to_h(<8 x double> %a) {
211 ; CHECK-LABEL: d_to_h:
212 ; CHECK-DAG: mov d{{[0-9]+}}, v{{[0-9]+}}.d[1]
213 ; CHECK-DAG: mov d{{[0-9]+}}, v{{[0-9]+}}.d[1]
214 ; CHECK-DAG: mov d{{[0-9]+}}, v{{[0-9]+}}.d[1]
215 ; CHECK-DAG: mov d{{[0-9]+}}, v{{[0-9]+}}.d[1]
216 ; CHECK-DAG: fcvt h
217 ; CHECK-DAG: fcvt h
218 ; CHECK-DAG: fcvt h
219 ; CHECK-DAG: fcvt h
220 ; CHECK-DAG: fcvt h
221 ; CHECK-DAG: fcvt h
222 ; CHECK-DAG: fcvt h
223 ; CHECK-DAG: fcvt h
224 ; CHECK-DAG: mov v{{[0-9]+}}.h
225 ; CHECK-DAG: mov v{{[0-9]+}}.h
226 ; CHECK-DAG: mov v{{[0-9]+}}.h
227 ; CHECK-DAG: mov v{{[0-9]+}}.h
228 ; CHECK-DAG: mov v{{[0-9]+}}.h
229 ; CHECK-DAG: mov v{{[0-9]+}}.h
230 ; CHECK-DAG: mov v{{[0-9]+}}.h
231 ; CHECK-DAG: mov v{{[0-9]+}}.h
232   %1 = fptrunc <8 x double> %a to <8 x half>
233   ret <8 x half> %1
236 define <8 x float> @h_to_s(<8 x half> %a) {
237 ; CHECK-LABEL: h_to_s:
238 ; CHECK: fcvtl2 v1.4s, v0.8h
239 ; CHECK: fcvtl v0.4s, v0.4h
240   %1 = fpext <8 x half> %a to <8 x float>
241   ret <8 x float> %1
244 define <8 x double> @h_to_d(<8 x half> %a) {
245 ; CHECK-LABEL: h_to_d:
246 ; CHECK-DAG: mov h{{[0-9]+}}, v0.h
247 ; CHECK-DAG: mov h{{[0-9]+}}, v0.h
248 ; CHECK-DAG: mov h{{[0-9]+}}, v0.h
249 ; CHECK-DAG: mov h{{[0-9]+}}, v0.h
250 ; CHECK-DAG: mov h{{[0-9]+}}, v0.h
251 ; CHECK-DAG: mov h{{[0-9]+}}, v0.h
252 ; CHECK-DAG: mov h{{[0-9]+}}, v0.h
253 ; CHECK-DAG: fcvt d
254 ; CHECK-DAG: fcvt d
255 ; CHECK-DAG: fcvt d
256 ; CHECK-DAG: fcvt d
257 ; CHECK-DAG: fcvt d
258 ; CHECK-DAG: fcvt d
259 ; CHECK-DAG: fcvt d
260 ; CHECK-DAG: fcvt d
261   %1 = fpext <8 x half> %a to <8 x double>
262   ret <8 x double> %1
266 define <8 x half> @bitcast_i_to_h(float, <8 x i16> %a) {
267 ; CHECK-LABEL: bitcast_i_to_h:
268 ; CHECK: mov v0.16b, v1.16b
269   %2 = bitcast <8 x i16> %a to <8 x half>
270   ret <8 x half> %2
273 define <8 x i16> @bitcast_h_to_i(float, <8 x half> %a) {
274 ; CHECK-LABEL: bitcast_h_to_i:
275 ; CHECK: mov v0.16b, v1.16b
276   %2 = bitcast <8 x half> %a to <8 x i16>
277   ret <8 x i16> %2
281 define <8 x half> @sitofp_i8(<8 x i8> %a) #0 {
282 ; CHECK-LABEL: sitofp_i8:
283 ; CHECK-NEXT: sshll v[[REG1:[0-9]+]].8h, v0.8b, #0
284 ; CHECK-NEXT: sshll2 [[LO:v[0-9]+\.4s]], v[[REG1]].8h, #0
285 ; CHECK-NEXT: sshll  [[HI:v[0-9]+\.4s]], v[[REG1]].4h, #0
286 ; CHECK-DAG: scvtf [[HIF:v[0-9]+\.4s]], [[HI]]
287 ; CHECK-DAG: scvtf [[LOF:v[0-9]+\.4s]], [[LO]]
288 ; CHECK-DAG: fcvtn v[[LOREG:[0-9]+]].4h, [[LOF]]
289 ; CHECK-DAG: fcvtn v0.4h, [[HIF]]
290 ; CHECK: mov v0.d[1], v[[LOREG]].d[0]
291   %1 = sitofp <8 x i8> %a to <8 x half>
292   ret <8 x half> %1
296 define <8 x half> @sitofp_i16(<8 x i16> %a) #0 {
297 ; CHECK-LABEL: sitofp_i16:
298 ; CHECK-NEXT: sshll2 [[LO:v[0-9]+\.4s]], v0.8h, #0
299 ; CHECK-NEXT: sshll  [[HI:v[0-9]+\.4s]], v0.4h, #0
300 ; CHECK-DAG: scvtf [[HIF:v[0-9]+\.4s]], [[HI]]
301 ; CHECK-DAG: scvtf [[LOF:v[0-9]+\.4s]], [[LO]]
302 ; CHECK-DAG: fcvtn v[[LOREG:[0-9]+]].4h, [[LOF]]
303 ; CHECK-DAG: fcvtn v0.4h, [[HIF]]
304 ; CHECK: mov v0.d[1], v[[LOREG]].d[0]
305   %1 = sitofp <8 x i16> %a to <8 x half>
306   ret <8 x half> %1
310 define <8 x half> @sitofp_i32(<8 x i32> %a) #0 {
311 ; CHECK-LABEL: sitofp_i32:
312 ; CHECK-DAG: scvtf [[OP1:v[0-9]+\.4s]], v0.4s
313 ; CHECK-DAG: scvtf [[OP2:v[0-9]+\.4s]], v1.4s
314 ; CHECK-DAG: fcvtn v[[REG:[0-9]+]].4h, [[OP2]]
315 ; CHECK-DAG: fcvtn v0.4h, [[OP1]]
316 ; CHECK: mov v0.d[1], v[[REG]].d[0]
317   %1 = sitofp <8 x i32> %a to <8 x half>
318   ret <8 x half> %1
322 define <8 x half> @sitofp_i64(<8 x i64> %a) #0 {
323 ; CHECK-LABEL: sitofp_i64:
324 ; CHECK-DAG: scvtf [[OP1:v[0-9]+\.2d]], v0.2d
325 ; CHECK-DAG: scvtf [[OP2:v[0-9]+\.2d]], v1.2d
326 ; CHECK-DAG: fcvtn [[OP3:v[0-9]+]].2s, [[OP1]]
327 ; CHECK-DAG: fcvtn2 [[OP3]].4s, [[OP2]]
328 ; CHECK: fcvtn v0.4h, [[OP3]].4s
329   %1 = sitofp <8 x i64> %a to <8 x half>
330   ret <8 x half> %1
333 define <8 x half> @uitofp_i8(<8 x i8> %a) #0 {
334 ; CHECK-LABEL: uitofp_i8:
335 ; CHECK-NEXT: ushll v[[REG1:[0-9]+]].8h, v0.8b, #0
336 ; CHECK-NEXT: ushll2 [[LO:v[0-9]+\.4s]], v[[REG1]].8h, #0
337 ; CHECK-NEXT: ushll  [[HI:v[0-9]+\.4s]], v[[REG1]].4h, #0
338 ; CHECK-DAG: ucvtf [[HIF:v[0-9]+\.4s]], [[HI]]
339 ; CHECK-DAG: ucvtf [[LOF:v[0-9]+\.4s]], [[LO]]
340 ; CHECK-DAG: fcvtn v[[LOREG:[0-9]+]].4h, [[LOF]]
341 ; CHECK-DAG: fcvtn v0.4h, [[HIF]]
342 ; CHECK: mov v0.d[1], v[[LOREG]].d[0]
343   %1 = uitofp <8 x i8> %a to <8 x half>
344   ret <8 x half> %1
348 define <8 x half> @uitofp_i16(<8 x i16> %a) #0 {
349 ; CHECK-LABEL: uitofp_i16:
350 ; CHECK-NEXT: ushll2 [[LO:v[0-9]+\.4s]], v0.8h, #0
351 ; CHECK-NEXT: ushll  [[HI:v[0-9]+\.4s]], v0.4h, #0
352 ; CHECK-DAG: ucvtf [[HIF:v[0-9]+\.4s]], [[HI]]
353 ; CHECK-DAG: ucvtf [[LOF:v[0-9]+\.4s]], [[LO]]
354 ; CHECK-DAG: fcvtn v[[LOREG:[0-9]+]].4h, [[LOF]]
355 ; CHECK-DAG: fcvtn v0.4h, [[HIF]]
356 ; CHECK: mov v0.d[1], v[[LOREG]].d[0]
357   %1 = uitofp <8 x i16> %a to <8 x half>
358   ret <8 x half> %1
362 define <8 x half> @uitofp_i32(<8 x i32> %a) #0 {
363 ; CHECK-LABEL: uitofp_i32:
364 ; CHECK-DAG: ucvtf [[OP1:v[0-9]+\.4s]], v0.4s
365 ; CHECK-DAG: ucvtf [[OP2:v[0-9]+\.4s]], v1.4s
366 ; CHECK-DAG: fcvtn v[[REG:[0-9]+]].4h, [[OP2]]
367 ; CHECK-DAG: fcvtn v0.4h, [[OP1]]
368 ; CHECK: mov v0.d[1], v[[REG]].d[0]
369   %1 = uitofp <8 x i32> %a to <8 x half>
370   ret <8 x half> %1
374 define <8 x half> @uitofp_i64(<8 x i64> %a) #0 {
375 ; CHECK-LABEL: uitofp_i64:
376 ; CHECK-DAG: ucvtf [[OP1:v[0-9]+\.2d]], v0.2d
377 ; CHECK-DAG: ucvtf [[OP2:v[0-9]+\.2d]], v1.2d
378 ; CHECK-DAG: fcvtn [[OP3:v[0-9]+]].2s, [[OP1]]
379 ; CHECK-DAG: fcvtn2 [[OP3]].4s, [[OP2]]
380 ; CHECK: fcvtn v0.4h, [[OP3]].4s
381   %1 = uitofp <8 x i64> %a to <8 x half>
382   ret <8 x half> %1
385 define void @test_insert_at_zero(half %a, <8 x half>* %b) #0 {
386 ; CHECK-LABEL: test_insert_at_zero:
387 ; CHECK-NEXT: str q0, [x0]
388 ; CHECK-NEXT: ret
389   %1 = insertelement <8 x half> undef, half %a, i64 0
390   store <8 x half> %1, <8 x half>* %b, align 4
391   ret void
394 define <8 x i8> @fptosi_i8(<8 x half> %a) #0 {
395 ; CHECK-LABEL: fptosi_i8:
396 ; CHECK-DAG: fcvtl   [[LO:v[0-9]+\.4s]], v0.4h
397 ; CHECK-DAG: fcvtl2  [[HI:v[0-9]+\.4s]], v0.8h
398 ; CHECK-DAG: fcvtzs  [[LOF32:v[0-9]+\.4s]], [[LO]]
399 ; CHECK-DAG: xtn     [[I16:v[0-9]+]].4h, [[LOF32]]
400 ; CHECK-DAG: fcvtzs  [[HIF32:v[0-9]+\.4s]], [[HI]]
401 ; CHECK-DAG: xtn2    [[I16]].8h, [[HIF32]]
402 ; CHECK-NEXT: xtn     v0.8b, [[I16]].8h
403 ; CHECK-NEXT: ret
404   %1 = fptosi<8 x half> %a to <8 x i8>
405   ret <8 x i8> %1
408 define <8 x i16> @fptosi_i16(<8 x half> %a) #0 {
409 ; CHECK-LABEL: fptosi_i16:
410 ; CHECK-DAG: fcvtl   [[LO:v[0-9]+\.4s]], v0.4h
411 ; CHECK-DAG: fcvtl2  [[HI:v[0-9]+\.4s]], v0.8h
412 ; CHECK-DAG: fcvtzs  [[LOF32:v[0-9]+\.4s]], [[LO]]
413 ; CHECK-DAG: xtn     [[I16:v[0-9]+]].4h, [[LOF32]]
414 ; CHECK-DAG: fcvtzs  [[HIF32:v[0-9]+\.4s]], [[HI]]
415 ; CHECK-NEXT: xtn2    [[I16]].8h, [[HIF32]]
416 ; CHECK-NEXT: ret
417   %1 = fptosi<8 x half> %a to <8 x i16>
418   ret <8 x i16> %1
421 define <8 x i8> @fptoui_i8(<8 x half> %a) #0 {
422 ; CHECK-LABEL: fptoui_i8:
423 ; CHECK-DAG: fcvtl   [[LO:v[0-9]+\.4s]], v0.4h
424 ; CHECK-DAG: fcvtl2  [[HI:v[0-9]+\.4s]], v0.8h
425 ; CHECK-DAG: fcvtzu  [[LOF32:v[0-9]+\.4s]], [[LO]]
426 ; CHECK-DAG: xtn     [[I16:v[0-9]+]].4h, [[LOF32]]
427 ; CHECK-DAG: fcvtzu  [[HIF32:v[0-9]+\.4s]], [[HI]]
428 ; CHECK-DAG: xtn2    [[I16]].8h, [[HIF32]]
429 ; CHECK-NEXT: xtn     v0.8b, [[I16]].8h
430 ; CHECK-NEXT: ret
431   %1 = fptoui<8 x half> %a to <8 x i8>
432   ret <8 x i8> %1
435 define <8 x i16> @fptoui_i16(<8 x half> %a) #0 {
436 ; CHECK-LABEL: fptoui_i16:
437 ; CHECK-DAG: fcvtl   [[LO:v[0-9]+\.4s]], v0.4h
438 ; CHECK-DAG: fcvtl2  [[HI:v[0-9]+\.4s]], v0.8h
439 ; CHECK-DAG: fcvtzu  [[LOF32:v[0-9]+\.4s]], [[LO]]
440 ; CHECK-DAG: xtn     [[I16:v[0-9]+]].4h, [[LOF32]]
441 ; CHECK-DAG: fcvtzu  [[HIF32:v[0-9]+\.4s]], [[HI]]
442 ; CHECK-NEXT: xtn2    [[I16]].8h, [[HIF32]]
443 ; CHECK-NEXT: ret
444   %1 = fptoui<8 x half> %a to <8 x i16>
445   ret <8 x i16> %1
448 define <8 x i1> @test_fcmp_une(<8 x half> %a, <8 x half> %b) #0 {
449 ; FileCheck checks are unwieldy with 16 fcvt and 8 csel tests, so skipped for -fullfp16.
451 ; CHECK-FP16-LABEL: test_fcmp_une:
452 ; CHECK-FP16-NOT:   fcvt
453 ; CHECK-FP16-DAG:   fcmp  h{{[0-9]}}, h{{[0-9]}}
454 ; CHECK-FP16-DAG:   fcmp  h{{[0-9]}}, h{{[0-9]}}
455 ; CHECK-FP16-DAG:   fcmp  h{{[0-9]}}, h{{[0-9]}}
456 ; CHECK-FP16-DAG:   fcmp  h{{[0-9]}}, h{{[0-9]}}
457 ; CHECK-FP16-DAG:   fcmp  h{{[0-9]}}, h{{[0-9]}}
458 ; CHECK-FP16-DAG:   fcmp  h{{[0-9]}}, h{{[0-9]}}
459 ; CHECK-FP16-DAG:   fcmp  h{{[0-9]}}, h{{[0-9]}}
460 ; CHECK-FP16-DAG:   fcmp  h{{[0-9]}}, h{{[0-9]}}
462   %1 = fcmp une <8 x half> %a, %b
463   ret <8 x i1> %1
466 define <8 x i1> @test_fcmp_ueq(<8 x half> %a, <8 x half> %b) #0 {
467 ; FileCheck checks are unwieldy with 16 fcvt and 8 csel tests, so skipped for -fullfp16.
469 ; CHECK-FP16-LABEL: test_fcmp_ueq:
470 ; CHECK-FP16-NOT:   fcvt
471 ; CHECK-FP16-DAG:   fcmp  h{{[0-9]}}, h{{[0-9]}}
472 ; CHECK-FP16-DAG:   fcmp  h{{[0-9]}}, h{{[0-9]}}
473 ; CHECK-FP16-DAG:   fcmp  h{{[0-9]}}, h{{[0-9]}}
474 ; CHECK-FP16-DAG:   fcmp  h{{[0-9]}}, h{{[0-9]}}
475 ; CHECK-FP16-DAG:   fcmp  h{{[0-9]}}, h{{[0-9]}}
476 ; CHECK-FP16-DAG:   fcmp  h{{[0-9]}}, h{{[0-9]}}
477 ; CHECK-FP16-DAG:   fcmp  h{{[0-9]}}, h{{[0-9]}}
478 ; CHECK-FP16-DAG:   fcmp  h{{[0-9]}}, h{{[0-9]}}
480   %1 = fcmp ueq <8 x half> %a, %b
481   ret <8 x i1> %1
484 define <8 x i1> @test_fcmp_ugt(<8 x half> %a, <8 x half> %b) #0 {
485 ; FileCheck checks are unwieldy with 16 fcvt and 8 csel tests, so skipped for -fullfp16.
487 ; CHECK-FP16-LABEL: test_fcmp_ugt:
488 ; CHECK-FP16-NOT:   fcvt
489 ; CHECK-FP16-DAG:   fcmp  h{{[0-9]}}, h{{[0-9]}}
490 ; CHECK-FP16-DAG:   fcmp  h{{[0-9]}}, h{{[0-9]}}
491 ; CHECK-FP16-DAG:   fcmp  h{{[0-9]}}, h{{[0-9]}}
492 ; CHECK-FP16-DAG:   fcmp  h{{[0-9]}}, h{{[0-9]}}
493 ; CHECK-FP16-DAG:   fcmp  h{{[0-9]}}, h{{[0-9]}}
494 ; CHECK-FP16-DAG:   fcmp  h{{[0-9]}}, h{{[0-9]}}
495 ; CHECK-FP16-DAG:   fcmp  h{{[0-9]}}, h{{[0-9]}}
496 ; CHECK-FP16-DAG:   fcmp  h{{[0-9]}}, h{{[0-9]}}
498   %1 = fcmp ugt <8 x half> %a, %b
499   ret <8 x i1> %1
502 define <8 x i1> @test_fcmp_uge(<8 x half> %a, <8 x half> %b) #0 {
503 ; FileCheck checks are unwieldy with 16 fcvt and 8 csel tests, so skipped for -fullfp16.
505 ; CHECK-FP16-LABEL: test_fcmp_uge:
506 ; CHECK-FP16-NOT:   fcvt
507 ; CHECK-FP16-DAG:   fcmp  h{{[0-9]}}, h{{[0-9]}}
508 ; CHECK-FP16-DAG:   fcmp  h{{[0-9]}}, h{{[0-9]}}
509 ; CHECK-FP16-DAG:   fcmp  h{{[0-9]}}, h{{[0-9]}}
510 ; CHECK-FP16-DAG:   fcmp  h{{[0-9]}}, h{{[0-9]}}
511 ; CHECK-FP16-DAG:   fcmp  h{{[0-9]}}, h{{[0-9]}}
512 ; CHECK-FP16-DAG:   fcmp  h{{[0-9]}}, h{{[0-9]}}
513 ; CHECK-FP16-DAG:   fcmp  h{{[0-9]}}, h{{[0-9]}}
514 ; CHECK-FP16-DAG:   fcmp  h{{[0-9]}}, h{{[0-9]}}
516   %1 = fcmp uge <8 x half> %a, %b
517   ret <8 x i1> %1
520 define <8 x i1> @test_fcmp_ult(<8 x half> %a, <8 x half> %b) #0 {
521 ; FileCheck checks are unwieldy with 16 fcvt and 8 csel tests, so skipped for -fullfp16.
523 ; CHECK-FP16-LABEL: test_fcmp_ult:
524 ; CHECK-FP16-NOT:   fcvt
525 ; CHECK-FP16-DAG:   fcmp  h{{[0-9]}}, h{{[0-9]}}
526 ; CHECK-FP16-DAG:   fcmp  h{{[0-9]}}, h{{[0-9]}}
527 ; CHECK-FP16-DAG:   fcmp  h{{[0-9]}}, h{{[0-9]}}
528 ; CHECK-FP16-DAG:   fcmp  h{{[0-9]}}, h{{[0-9]}}
529 ; CHECK-FP16-DAG:   fcmp  h{{[0-9]}}, h{{[0-9]}}
530 ; CHECK-FP16-DAG:   fcmp  h{{[0-9]}}, h{{[0-9]}}
531 ; CHECK-FP16-DAG:   fcmp  h{{[0-9]}}, h{{[0-9]}}
532 ; CHECK-FP16-DAG:   fcmp  h{{[0-9]}}, h{{[0-9]}}
534   %1 = fcmp ult <8 x half> %a, %b
535   ret <8 x i1> %1
538 define <8 x i1> @test_fcmp_ule(<8 x half> %a, <8 x half> %b) #0 {
539 ; FileCheck checks are unwieldy with 16 fcvt and 8 csel tests, so skipped for -fullfp16.
541 ; CHECK-FP16-LABEL: test_fcmp_ule:
542 ; CHECK-FP16-NOT:   fcvt
543 ; CHECK-FP16-DAG:   fcmp  h{{[0-9]}}, h{{[0-9]}}
544 ; CHECK-FP16-DAG:   fcmp  h{{[0-9]}}, h{{[0-9]}}
545 ; CHECK-FP16-DAG:   fcmp  h{{[0-9]}}, h{{[0-9]}}
546 ; CHECK-FP16-DAG:   fcmp  h{{[0-9]}}, h{{[0-9]}}
547 ; CHECK-FP16-DAG:   fcmp  h{{[0-9]}}, h{{[0-9]}}
548 ; CHECK-FP16-DAG:   fcmp  h{{[0-9]}}, h{{[0-9]}}
549 ; CHECK-FP16-DAG:   fcmp  h{{[0-9]}}, h{{[0-9]}}
550 ; CHECK-FP16-DAG:   fcmp  h{{[0-9]}}, h{{[0-9]}}
552   %1 = fcmp ule <8 x half> %a, %b
553   ret <8 x i1> %1
556 define <8 x i1> @test_fcmp_uno(<8 x half> %a, <8 x half> %b) #0 {
557 ; FileCheck checks are unwieldy with 16 fcvt and 8 csel tests, so skipped for -fullfp16.
559 ; CHECK-FP16-LABEL: test_fcmp_uno:
560 ; CHECK-FP16-NOT:   fcvt
561 ; CHECK-FP16-DAG:   fcmp  h{{[0-9]}}, h{{[0-9]}}
562 ; CHECK-FP16-DAG:   fcmp  h{{[0-9]}}, h{{[0-9]}}
563 ; CHECK-FP16-DAG:   fcmp  h{{[0-9]}}, h{{[0-9]}}
564 ; CHECK-FP16-DAG:   fcmp  h{{[0-9]}}, h{{[0-9]}}
565 ; CHECK-FP16-DAG:   fcmp  h{{[0-9]}}, h{{[0-9]}}
566 ; CHECK-FP16-DAG:   fcmp  h{{[0-9]}}, h{{[0-9]}}
567 ; CHECK-FP16-DAG:   fcmp  h{{[0-9]}}, h{{[0-9]}}
568 ; CHECK-FP16-DAG:   fcmp  h{{[0-9]}}, h{{[0-9]}}
570   %1 = fcmp uno <8 x half> %a, %b
571   ret <8 x i1> %1
574 define <8 x i1> @test_fcmp_one(<8 x half> %a, <8 x half> %b) #0 {
575 ; FileCheck checks are unwieldy with 16 fcvt and 8 csel tests, so skipped for -fullfp16.
577 ; CHECK-FP16-LABEL: test_fcmp_one:
578 ; CHECK-FP16-NOT:   fcvt
579 ; CHECK-FP16-DAG:   fcmp  h{{[0-9]}}, h{{[0-9]}}
580 ; CHECK-FP16-DAG:   fcmp  h{{[0-9]}}, h{{[0-9]}}
581 ; CHECK-FP16-DAG:   fcmp  h{{[0-9]}}, h{{[0-9]}}
582 ; CHECK-FP16-DAG:   fcmp  h{{[0-9]}}, h{{[0-9]}}
583 ; CHECK-FP16-DAG:   fcmp  h{{[0-9]}}, h{{[0-9]}}
584 ; CHECK-FP16-DAG:   fcmp  h{{[0-9]}}, h{{[0-9]}}
585 ; CHECK-FP16-DAG:   fcmp  h{{[0-9]}}, h{{[0-9]}}
586 ; CHECK-FP16-DAG:   fcmp  h{{[0-9]}}, h{{[0-9]}}
588   %1 = fcmp one <8 x half> %a, %b
589   ret <8 x i1> %1
592 define <8 x i1> @test_fcmp_oeq(<8 x half> %a, <8 x half> %b) #0 {
593 ; FileCheck checks are unwieldy with 16 fcvt and 8 csel tests, so skipped for -fullfp16.
595 ; CHECK-FP16-LABEL: test_fcmp_oeq:
596 ; CHECK-FP16-NOT:   fcvt
597 ; CHECK-FP16-DAG:   fcmp  h{{[0-9]}}, h{{[0-9]}}
598 ; CHECK-FP16-DAG:   fcmp  h{{[0-9]}}, h{{[0-9]}}
599 ; CHECK-FP16-DAG:   fcmp  h{{[0-9]}}, h{{[0-9]}}
600 ; CHECK-FP16-DAG:   fcmp  h{{[0-9]}}, h{{[0-9]}}
601 ; CHECK-FP16-DAG:   fcmp  h{{[0-9]}}, h{{[0-9]}}
602 ; CHECK-FP16-DAG:   fcmp  h{{[0-9]}}, h{{[0-9]}}
603 ; CHECK-FP16-DAG:   fcmp  h{{[0-9]}}, h{{[0-9]}}
604 ; CHECK-FP16-DAG:   fcmp  h{{[0-9]}}, h{{[0-9]}}
606   %1 = fcmp oeq <8 x half> %a, %b
607   ret <8 x i1> %1
610 define <8 x i1> @test_fcmp_ogt(<8 x half> %a, <8 x half> %b) #0 {
611 ; FileCheck checks are unwieldy with 16 fcvt and 8 csel tests, so skipped for -fullfp16.
613 ; CHECK-FP16-LABEL: test_fcmp_ogt:
614 ; CHECK-FP16-NOT:   fcvt
615 ; CHECK-FP16-DAG:   fcmp  h{{[0-9]}}, h{{[0-9]}}
616 ; CHECK-FP16-DAG:   fcmp  h{{[0-9]}}, h{{[0-9]}}
617 ; CHECK-FP16-DAG:   fcmp  h{{[0-9]}}, h{{[0-9]}}
618 ; CHECK-FP16-DAG:   fcmp  h{{[0-9]}}, h{{[0-9]}}
619 ; CHECK-FP16-DAG:   fcmp  h{{[0-9]}}, h{{[0-9]}}
620 ; CHECK-FP16-DAG:   fcmp  h{{[0-9]}}, h{{[0-9]}}
621 ; CHECK-FP16-DAG:   fcmp  h{{[0-9]}}, h{{[0-9]}}
622 ; CHECK-FP16-DAG:   fcmp  h{{[0-9]}}, h{{[0-9]}}
624   %1 = fcmp ogt <8 x half> %a, %b
625   ret <8 x i1> %1
628 define <8 x i1> @test_fcmp_oge(<8 x half> %a, <8 x half> %b) #0 {
629 ; FileCheck checks are unwieldy with 16 fcvt and 8 csel tests, so skipped for -fullfp16.
631 ; CHECK-FP16-LABEL: test_fcmp_oge:
632 ; CHECK-FP16-NOT:   fcvt
633 ; CHECK-FP16-DAG:   fcmp  h{{[0-9]}}, h{{[0-9]}}
634 ; CHECK-FP16-DAG:   fcmp  h{{[0-9]}}, h{{[0-9]}}
635 ; CHECK-FP16-DAG:   fcmp  h{{[0-9]}}, h{{[0-9]}}
636 ; CHECK-FP16-DAG:   fcmp  h{{[0-9]}}, h{{[0-9]}}
637 ; CHECK-FP16-DAG:   fcmp  h{{[0-9]}}, h{{[0-9]}}
638 ; CHECK-FP16-DAG:   fcmp  h{{[0-9]}}, h{{[0-9]}}
639 ; CHECK-FP16-DAG:   fcmp  h{{[0-9]}}, h{{[0-9]}}
640 ; CHECK-FP16-DAG:   fcmp  h{{[0-9]}}, h{{[0-9]}}
642   %1 = fcmp oge <8 x half> %a, %b
643   ret <8 x i1> %1
646 define <8 x i1> @test_fcmp_olt(<8 x half> %a, <8 x half> %b) #0 {
647 ; FileCheck checks are unwieldy with 16 fcvt and 8 csel tests, so skipped for -fullfp16.
649 ; CHECK-FP16-LABEL: test_fcmp_olt:
650 ; CHECK-FP16-NOT:   fcvt
651 ; CHECK-FP16-DAG:   fcmp  h{{[0-9]}}, h{{[0-9]}}
652 ; CHECK-FP16-DAG:   fcmp  h{{[0-9]}}, h{{[0-9]}}
653 ; CHECK-FP16-DAG:   fcmp  h{{[0-9]}}, h{{[0-9]}}
654 ; CHECK-FP16-DAG:   fcmp  h{{[0-9]}}, h{{[0-9]}}
655 ; CHECK-FP16-DAG:   fcmp  h{{[0-9]}}, h{{[0-9]}}
656 ; CHECK-FP16-DAG:   fcmp  h{{[0-9]}}, h{{[0-9]}}
657 ; CHECK-FP16-DAG:   fcmp  h{{[0-9]}}, h{{[0-9]}}
658 ; CHECK-FP16-DAG:   fcmp  h{{[0-9]}}, h{{[0-9]}}
660   %1 = fcmp olt <8 x half> %a, %b
661   ret <8 x i1> %1
664 define <8 x i1> @test_fcmp_ole(<8 x half> %a, <8 x half> %b) #0 {
665 ; FileCheck checks are unwieldy with 16 fcvt and 8 csel tests, so skipped for -fullfp16.
667 ; CHECK-FP16-LABEL: test_fcmp_ole:
668 ; CHECK-FP16-NOT:   fcvt
669 ; CHECK-FP16-DAG:   fcmp  h{{[0-9]}}, h{{[0-9]}}
670 ; CHECK-FP16-DAG:   fcmp  h{{[0-9]}}, h{{[0-9]}}
671 ; CHECK-FP16-DAG:   fcmp  h{{[0-9]}}, h{{[0-9]}}
672 ; CHECK-FP16-DAG:   fcmp  h{{[0-9]}}, h{{[0-9]}}
673 ; CHECK-FP16-DAG:   fcmp  h{{[0-9]}}, h{{[0-9]}}
674 ; CHECK-FP16-DAG:   fcmp  h{{[0-9]}}, h{{[0-9]}}
675 ; CHECK-FP16-DAG:   fcmp  h{{[0-9]}}, h{{[0-9]}}
676 ; CHECK-FP16-DAG:   fcmp  h{{[0-9]}}, h{{[0-9]}}
678   %1 = fcmp ole <8 x half> %a, %b
679   ret <8 x i1> %1
682 define <8 x i1> @test_fcmp_ord(<8 x half> %a, <8 x half> %b) #0 {
683 ; FileCheck checks are unwieldy with 16 fcvt and 8 csel tests, so skipped for -fullfp16.
685 ; CHECK-FP16-LABEL: test_fcmp_ord:
686 ; CHECK-FP16-NOT:   fcvt
687 ; CHECK-FP16-DAG:   fcmp  h{{[0-9]}}, h{{[0-9]}}
688 ; CHECK-FP16-DAG:   fcmp  h{{[0-9]}}, h{{[0-9]}}
689 ; CHECK-FP16-DAG:   fcmp  h{{[0-9]}}, h{{[0-9]}}
690 ; CHECK-FP16-DAG:   fcmp  h{{[0-9]}}, h{{[0-9]}}
691 ; CHECK-FP16-DAG:   fcmp  h{{[0-9]}}, h{{[0-9]}}
692 ; CHECK-FP16-DAG:   fcmp  h{{[0-9]}}, h{{[0-9]}}
693 ; CHECK-FP16-DAG:   fcmp  h{{[0-9]}}, h{{[0-9]}}
694 ; CHECK-FP16-DAG:   fcmp  h{{[0-9]}}, h{{[0-9]}}
696   %1 = fcmp ord <8 x half> %a, %b
697   ret <8 x i1> %1
700 attributes #0 = { nounwind }