1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2 ; RUN: llc --mtriple=aarch64 --mattr=-fullfp16,-neon < %s | FileCheck %s --check-prefix=CHECK-NOFP16-NONEON
3 ; RUN: llc --mtriple=aarch64 --mattr=+fullfp16,-neon < %s | FileCheck %s --check-prefix=CHECK-FP16-NONEON
4 ; RUN: llc --mtriple=aarch64 --mattr=-fullfp16,+neon < %s | FileCheck %s --check-prefix=CHECK-NOFP16-NEON
5 ; RUN: llc --mtriple=aarch64 --mattr=+fullfp16,+neon < %s | FileCheck %s --check-prefixes=CHECK-FP16-NEON
7 declare half @llvm.fcanonicalize.f16(half)
8 declare float @llvm.fcanonicalize.f32(float)
9 declare double @llvm.fcanonicalize.f64(double)
11 define half @fcanonicalize_f16(half %x) {
12 ; CHECK-NOFP16-NONEON-LABEL: fcanonicalize_f16:
13 ; CHECK-NOFP16-NONEON: // %bb.0:
14 ; CHECK-NOFP16-NONEON-NEXT: fcvt s0, h0
15 ; CHECK-NOFP16-NONEON-NEXT: fminnm s0, s0, s0
16 ; CHECK-NOFP16-NONEON-NEXT: fcvt h0, s0
17 ; CHECK-NOFP16-NONEON-NEXT: ret
19 ; CHECK-FP16-NONEON-LABEL: fcanonicalize_f16:
20 ; CHECK-FP16-NONEON: // %bb.0:
21 ; CHECK-FP16-NONEON-NEXT: fminnm h0, h0, h0
22 ; CHECK-FP16-NONEON-NEXT: ret
24 ; CHECK-NOFP16-NEON-LABEL: fcanonicalize_f16:
25 ; CHECK-NOFP16-NEON: // %bb.0:
26 ; CHECK-NOFP16-NEON-NEXT: fcvt s0, h0
27 ; CHECK-NOFP16-NEON-NEXT: fminnm s0, s0, s0
28 ; CHECK-NOFP16-NEON-NEXT: fcvt h0, s0
29 ; CHECK-NOFP16-NEON-NEXT: ret
31 ; CHECK-FP16-NEON-LABEL: fcanonicalize_f16:
32 ; CHECK-FP16-NEON: // %bb.0:
33 ; CHECK-FP16-NEON-NEXT: fminnm h0, h0, h0
34 ; CHECK-FP16-NEON-NEXT: ret
35 %z = call half @llvm.canonicalize.f16(half %x)
39 define half @fcanonicalize_f16_nnan(half %x) {
40 ; CHECK-NOFP16-NONEON-LABEL: fcanonicalize_f16_nnan:
41 ; CHECK-NOFP16-NONEON: // %bb.0:
42 ; CHECK-NOFP16-NONEON-NEXT: fcvt s0, h0
43 ; CHECK-NOFP16-NONEON-NEXT: fminnm s0, s0, s0
44 ; CHECK-NOFP16-NONEON-NEXT: fcvt h0, s0
45 ; CHECK-NOFP16-NONEON-NEXT: ret
47 ; CHECK-FP16-NONEON-LABEL: fcanonicalize_f16_nnan:
48 ; CHECK-FP16-NONEON: // %bb.0:
49 ; CHECK-FP16-NONEON-NEXT: fminnm h0, h0, h0
50 ; CHECK-FP16-NONEON-NEXT: ret
52 ; CHECK-NOFP16-NEON-LABEL: fcanonicalize_f16_nnan:
53 ; CHECK-NOFP16-NEON: // %bb.0:
54 ; CHECK-NOFP16-NEON-NEXT: fcvt s0, h0
55 ; CHECK-NOFP16-NEON-NEXT: fminnm s0, s0, s0
56 ; CHECK-NOFP16-NEON-NEXT: fcvt h0, s0
57 ; CHECK-NOFP16-NEON-NEXT: ret
59 ; CHECK-FP16-NEON-LABEL: fcanonicalize_f16_nnan:
60 ; CHECK-FP16-NEON: // %bb.0:
61 ; CHECK-FP16-NEON-NEXT: fminnm h0, h0, h0
62 ; CHECK-FP16-NEON-NEXT: ret
63 %z = call nnan half @llvm.canonicalize.f16(half %x)
67 define <2 x half> @fcanonicalize_v2f16(<2 x half> %x) {
68 ; CHECK-NOFP16-NONEON-LABEL: fcanonicalize_v2f16:
69 ; CHECK-NOFP16-NONEON: // %bb.0:
70 ; CHECK-NOFP16-NONEON-NEXT: fcvt s0, h0
71 ; CHECK-NOFP16-NONEON-NEXT: fcvt s1, h1
72 ; CHECK-NOFP16-NONEON-NEXT: fminnm s0, s0, s0
73 ; CHECK-NOFP16-NONEON-NEXT: fminnm s1, s1, s1
74 ; CHECK-NOFP16-NONEON-NEXT: fcvt h0, s0
75 ; CHECK-NOFP16-NONEON-NEXT: fcvt h1, s1
76 ; CHECK-NOFP16-NONEON-NEXT: ret
78 ; CHECK-FP16-NONEON-LABEL: fcanonicalize_v2f16:
79 ; CHECK-FP16-NONEON: // %bb.0:
80 ; CHECK-FP16-NONEON-NEXT: fminnm h0, h0, h0
81 ; CHECK-FP16-NONEON-NEXT: fminnm h1, h1, h1
82 ; CHECK-FP16-NONEON-NEXT: ret
84 ; CHECK-NOFP16-NEON-LABEL: fcanonicalize_v2f16:
85 ; CHECK-NOFP16-NEON: // %bb.0:
86 ; CHECK-NOFP16-NEON-NEXT: fcvtl v0.4s, v0.4h
87 ; CHECK-NOFP16-NEON-NEXT: fminnm v0.4s, v0.4s, v0.4s
88 ; CHECK-NOFP16-NEON-NEXT: fcvtn v0.4h, v0.4s
89 ; CHECK-NOFP16-NEON-NEXT: ret
91 ; CHECK-FP16-NEON-LABEL: fcanonicalize_v2f16:
92 ; CHECK-FP16-NEON: // %bb.0:
93 ; CHECK-FP16-NEON-NEXT: fminnm v0.4h, v0.4h, v0.4h
94 ; CHECK-FP16-NEON-NEXT: ret
95 %z = call <2 x half> @llvm.canonicalize.v2f16(<2 x half> %x)
99 define <2 x half> @fcanonicalize_v2f16_nnan(<2 x half> %x) {
100 ; CHECK-NOFP16-NONEON-LABEL: fcanonicalize_v2f16_nnan:
101 ; CHECK-NOFP16-NONEON: // %bb.0:
102 ; CHECK-NOFP16-NONEON-NEXT: fcvt s0, h0
103 ; CHECK-NOFP16-NONEON-NEXT: fcvt s1, h1
104 ; CHECK-NOFP16-NONEON-NEXT: fminnm s0, s0, s0
105 ; CHECK-NOFP16-NONEON-NEXT: fminnm s1, s1, s1
106 ; CHECK-NOFP16-NONEON-NEXT: fcvt h0, s0
107 ; CHECK-NOFP16-NONEON-NEXT: fcvt h1, s1
108 ; CHECK-NOFP16-NONEON-NEXT: ret
110 ; CHECK-FP16-NONEON-LABEL: fcanonicalize_v2f16_nnan:
111 ; CHECK-FP16-NONEON: // %bb.0:
112 ; CHECK-FP16-NONEON-NEXT: fminnm h0, h0, h0
113 ; CHECK-FP16-NONEON-NEXT: fminnm h1, h1, h1
114 ; CHECK-FP16-NONEON-NEXT: ret
116 ; CHECK-NOFP16-NEON-LABEL: fcanonicalize_v2f16_nnan:
117 ; CHECK-NOFP16-NEON: // %bb.0:
118 ; CHECK-NOFP16-NEON-NEXT: fcvtl v0.4s, v0.4h
119 ; CHECK-NOFP16-NEON-NEXT: fminnm v0.4s, v0.4s, v0.4s
120 ; CHECK-NOFP16-NEON-NEXT: fcvtn v0.4h, v0.4s
121 ; CHECK-NOFP16-NEON-NEXT: ret
123 ; CHECK-FP16-NEON-LABEL: fcanonicalize_v2f16_nnan:
124 ; CHECK-FP16-NEON: // %bb.0:
125 ; CHECK-FP16-NEON-NEXT: fminnm v0.4h, v0.4h, v0.4h
126 ; CHECK-FP16-NEON-NEXT: ret
127 %z = call nnan <2 x half> @llvm.canonicalize.v2f16(<2 x half> %x)
131 define <4 x half> @fcanonicalize_v4f16(<4 x half> %x) {
132 ; CHECK-NOFP16-NONEON-LABEL: fcanonicalize_v4f16:
133 ; CHECK-NOFP16-NONEON: // %bb.0:
134 ; CHECK-NOFP16-NONEON-NEXT: fcvt s0, h0
135 ; CHECK-NOFP16-NONEON-NEXT: fcvt s1, h1
136 ; CHECK-NOFP16-NONEON-NEXT: fcvt s2, h2
137 ; CHECK-NOFP16-NONEON-NEXT: fcvt s3, h3
138 ; CHECK-NOFP16-NONEON-NEXT: fminnm s0, s0, s0
139 ; CHECK-NOFP16-NONEON-NEXT: fminnm s1, s1, s1
140 ; CHECK-NOFP16-NONEON-NEXT: fminnm s2, s2, s2
141 ; CHECK-NOFP16-NONEON-NEXT: fminnm s3, s3, s3
142 ; CHECK-NOFP16-NONEON-NEXT: fcvt h0, s0
143 ; CHECK-NOFP16-NONEON-NEXT: fcvt h1, s1
144 ; CHECK-NOFP16-NONEON-NEXT: fcvt h2, s2
145 ; CHECK-NOFP16-NONEON-NEXT: fcvt h3, s3
146 ; CHECK-NOFP16-NONEON-NEXT: ret
148 ; CHECK-FP16-NONEON-LABEL: fcanonicalize_v4f16:
149 ; CHECK-FP16-NONEON: // %bb.0:
150 ; CHECK-FP16-NONEON-NEXT: fminnm h0, h0, h0
151 ; CHECK-FP16-NONEON-NEXT: fminnm h1, h1, h1
152 ; CHECK-FP16-NONEON-NEXT: fminnm h2, h2, h2
153 ; CHECK-FP16-NONEON-NEXT: fminnm h3, h3, h3
154 ; CHECK-FP16-NONEON-NEXT: ret
156 ; CHECK-NOFP16-NEON-LABEL: fcanonicalize_v4f16:
157 ; CHECK-NOFP16-NEON: // %bb.0:
158 ; CHECK-NOFP16-NEON-NEXT: fcvtl v0.4s, v0.4h
159 ; CHECK-NOFP16-NEON-NEXT: fminnm v0.4s, v0.4s, v0.4s
160 ; CHECK-NOFP16-NEON-NEXT: fcvtn v0.4h, v0.4s
161 ; CHECK-NOFP16-NEON-NEXT: ret
163 ; CHECK-FP16-NEON-LABEL: fcanonicalize_v4f16:
164 ; CHECK-FP16-NEON: // %bb.0:
165 ; CHECK-FP16-NEON-NEXT: fminnm v0.4h, v0.4h, v0.4h
166 ; CHECK-FP16-NEON-NEXT: ret
167 %z = call <4 x half> @llvm.canonicalize.v4f16(<4 x half> %x)
171 define <4 x half> @fcanonicalize_v4f16_nnan(<4 x half> %x) {
172 ; CHECK-NOFP16-NONEON-LABEL: fcanonicalize_v4f16_nnan:
173 ; CHECK-NOFP16-NONEON: // %bb.0:
174 ; CHECK-NOFP16-NONEON-NEXT: fcvt s0, h0
175 ; CHECK-NOFP16-NONEON-NEXT: fcvt s1, h1
176 ; CHECK-NOFP16-NONEON-NEXT: fcvt s2, h2
177 ; CHECK-NOFP16-NONEON-NEXT: fcvt s3, h3
178 ; CHECK-NOFP16-NONEON-NEXT: fminnm s0, s0, s0
179 ; CHECK-NOFP16-NONEON-NEXT: fminnm s1, s1, s1
180 ; CHECK-NOFP16-NONEON-NEXT: fminnm s2, s2, s2
181 ; CHECK-NOFP16-NONEON-NEXT: fminnm s3, s3, s3
182 ; CHECK-NOFP16-NONEON-NEXT: fcvt h0, s0
183 ; CHECK-NOFP16-NONEON-NEXT: fcvt h1, s1
184 ; CHECK-NOFP16-NONEON-NEXT: fcvt h2, s2
185 ; CHECK-NOFP16-NONEON-NEXT: fcvt h3, s3
186 ; CHECK-NOFP16-NONEON-NEXT: ret
188 ; CHECK-FP16-NONEON-LABEL: fcanonicalize_v4f16_nnan:
189 ; CHECK-FP16-NONEON: // %bb.0:
190 ; CHECK-FP16-NONEON-NEXT: fminnm h0, h0, h0
191 ; CHECK-FP16-NONEON-NEXT: fminnm h1, h1, h1
192 ; CHECK-FP16-NONEON-NEXT: fminnm h2, h2, h2
193 ; CHECK-FP16-NONEON-NEXT: fminnm h3, h3, h3
194 ; CHECK-FP16-NONEON-NEXT: ret
196 ; CHECK-NOFP16-NEON-LABEL: fcanonicalize_v4f16_nnan:
197 ; CHECK-NOFP16-NEON: // %bb.0:
198 ; CHECK-NOFP16-NEON-NEXT: fcvtl v0.4s, v0.4h
199 ; CHECK-NOFP16-NEON-NEXT: fminnm v0.4s, v0.4s, v0.4s
200 ; CHECK-NOFP16-NEON-NEXT: fcvtn v0.4h, v0.4s
201 ; CHECK-NOFP16-NEON-NEXT: ret
203 ; CHECK-FP16-NEON-LABEL: fcanonicalize_v4f16_nnan:
204 ; CHECK-FP16-NEON: // %bb.0:
205 ; CHECK-FP16-NEON-NEXT: fminnm v0.4h, v0.4h, v0.4h
206 ; CHECK-FP16-NEON-NEXT: ret
207 %z = call nnan <4 x half> @llvm.canonicalize.v4f16(<4 x half> %x)
211 define <8 x half> @fcanonicalize_v8f16(<8 x half> %x) {
212 ; CHECK-NOFP16-NONEON-LABEL: fcanonicalize_v8f16:
213 ; CHECK-NOFP16-NONEON: // %bb.0:
214 ; CHECK-NOFP16-NONEON-NEXT: fcvt s0, h0
215 ; CHECK-NOFP16-NONEON-NEXT: fcvt s1, h1
216 ; CHECK-NOFP16-NONEON-NEXT: fcvt s2, h2
217 ; CHECK-NOFP16-NONEON-NEXT: fcvt s3, h3
218 ; CHECK-NOFP16-NONEON-NEXT: fcvt s4, h4
219 ; CHECK-NOFP16-NONEON-NEXT: fcvt s5, h5
220 ; CHECK-NOFP16-NONEON-NEXT: fcvt s6, h6
221 ; CHECK-NOFP16-NONEON-NEXT: fcvt s7, h7
222 ; CHECK-NOFP16-NONEON-NEXT: fminnm s0, s0, s0
223 ; CHECK-NOFP16-NONEON-NEXT: fminnm s1, s1, s1
224 ; CHECK-NOFP16-NONEON-NEXT: fminnm s2, s2, s2
225 ; CHECK-NOFP16-NONEON-NEXT: fminnm s3, s3, s3
226 ; CHECK-NOFP16-NONEON-NEXT: fminnm s4, s4, s4
227 ; CHECK-NOFP16-NONEON-NEXT: fminnm s5, s5, s5
228 ; CHECK-NOFP16-NONEON-NEXT: fminnm s6, s6, s6
229 ; CHECK-NOFP16-NONEON-NEXT: fminnm s7, s7, s7
230 ; CHECK-NOFP16-NONEON-NEXT: fcvt h0, s0
231 ; CHECK-NOFP16-NONEON-NEXT: fcvt h1, s1
232 ; CHECK-NOFP16-NONEON-NEXT: fcvt h2, s2
233 ; CHECK-NOFP16-NONEON-NEXT: fcvt h3, s3
234 ; CHECK-NOFP16-NONEON-NEXT: fcvt h4, s4
235 ; CHECK-NOFP16-NONEON-NEXT: fcvt h5, s5
236 ; CHECK-NOFP16-NONEON-NEXT: fcvt h6, s6
237 ; CHECK-NOFP16-NONEON-NEXT: fcvt h7, s7
238 ; CHECK-NOFP16-NONEON-NEXT: ret
240 ; CHECK-FP16-NONEON-LABEL: fcanonicalize_v8f16:
241 ; CHECK-FP16-NONEON: // %bb.0:
242 ; CHECK-FP16-NONEON-NEXT: fminnm h0, h0, h0
243 ; CHECK-FP16-NONEON-NEXT: fminnm h1, h1, h1
244 ; CHECK-FP16-NONEON-NEXT: fminnm h2, h2, h2
245 ; CHECK-FP16-NONEON-NEXT: fminnm h3, h3, h3
246 ; CHECK-FP16-NONEON-NEXT: fminnm h4, h4, h4
247 ; CHECK-FP16-NONEON-NEXT: fminnm h5, h5, h5
248 ; CHECK-FP16-NONEON-NEXT: fminnm h6, h6, h6
249 ; CHECK-FP16-NONEON-NEXT: fminnm h7, h7, h7
250 ; CHECK-FP16-NONEON-NEXT: ret
252 ; CHECK-NOFP16-NEON-LABEL: fcanonicalize_v8f16:
253 ; CHECK-NOFP16-NEON: // %bb.0:
254 ; CHECK-NOFP16-NEON-NEXT: fcvtl v1.4s, v0.4h
255 ; CHECK-NOFP16-NEON-NEXT: fcvtl2 v2.4s, v0.8h
256 ; CHECK-NOFP16-NEON-NEXT: fminnm v1.4s, v1.4s, v1.4s
257 ; CHECK-NOFP16-NEON-NEXT: fcvtn v0.4h, v1.4s
258 ; CHECK-NOFP16-NEON-NEXT: fminnm v1.4s, v2.4s, v2.4s
259 ; CHECK-NOFP16-NEON-NEXT: fcvtn2 v0.8h, v1.4s
260 ; CHECK-NOFP16-NEON-NEXT: ret
262 ; CHECK-FP16-NEON-LABEL: fcanonicalize_v8f16:
263 ; CHECK-FP16-NEON: // %bb.0:
264 ; CHECK-FP16-NEON-NEXT: fminnm v0.8h, v0.8h, v0.8h
265 ; CHECK-FP16-NEON-NEXT: ret
266 %z = call <8 x half> @llvm.canonicalize.v8f16(<8 x half> %x)
270 define <8 x half> @fcanonicalize_v8f16_nnan(<8 x half> %x) {
271 ; CHECK-NOFP16-NONEON-LABEL: fcanonicalize_v8f16_nnan:
272 ; CHECK-NOFP16-NONEON: // %bb.0:
273 ; CHECK-NOFP16-NONEON-NEXT: fcvt s0, h0
274 ; CHECK-NOFP16-NONEON-NEXT: fcvt s1, h1
275 ; CHECK-NOFP16-NONEON-NEXT: fcvt s2, h2
276 ; CHECK-NOFP16-NONEON-NEXT: fcvt s3, h3
277 ; CHECK-NOFP16-NONEON-NEXT: fcvt s4, h4
278 ; CHECK-NOFP16-NONEON-NEXT: fcvt s5, h5
279 ; CHECK-NOFP16-NONEON-NEXT: fcvt s6, h6
280 ; CHECK-NOFP16-NONEON-NEXT: fcvt s7, h7
281 ; CHECK-NOFP16-NONEON-NEXT: fminnm s0, s0, s0
282 ; CHECK-NOFP16-NONEON-NEXT: fminnm s1, s1, s1
283 ; CHECK-NOFP16-NONEON-NEXT: fminnm s2, s2, s2
284 ; CHECK-NOFP16-NONEON-NEXT: fminnm s3, s3, s3
285 ; CHECK-NOFP16-NONEON-NEXT: fminnm s4, s4, s4
286 ; CHECK-NOFP16-NONEON-NEXT: fminnm s5, s5, s5
287 ; CHECK-NOFP16-NONEON-NEXT: fminnm s6, s6, s6
288 ; CHECK-NOFP16-NONEON-NEXT: fminnm s7, s7, s7
289 ; CHECK-NOFP16-NONEON-NEXT: fcvt h0, s0
290 ; CHECK-NOFP16-NONEON-NEXT: fcvt h1, s1
291 ; CHECK-NOFP16-NONEON-NEXT: fcvt h2, s2
292 ; CHECK-NOFP16-NONEON-NEXT: fcvt h3, s3
293 ; CHECK-NOFP16-NONEON-NEXT: fcvt h4, s4
294 ; CHECK-NOFP16-NONEON-NEXT: fcvt h5, s5
295 ; CHECK-NOFP16-NONEON-NEXT: fcvt h6, s6
296 ; CHECK-NOFP16-NONEON-NEXT: fcvt h7, s7
297 ; CHECK-NOFP16-NONEON-NEXT: ret
299 ; CHECK-FP16-NONEON-LABEL: fcanonicalize_v8f16_nnan:
300 ; CHECK-FP16-NONEON: // %bb.0:
301 ; CHECK-FP16-NONEON-NEXT: fminnm h0, h0, h0
302 ; CHECK-FP16-NONEON-NEXT: fminnm h1, h1, h1
303 ; CHECK-FP16-NONEON-NEXT: fminnm h2, h2, h2
304 ; CHECK-FP16-NONEON-NEXT: fminnm h3, h3, h3
305 ; CHECK-FP16-NONEON-NEXT: fminnm h4, h4, h4
306 ; CHECK-FP16-NONEON-NEXT: fminnm h5, h5, h5
307 ; CHECK-FP16-NONEON-NEXT: fminnm h6, h6, h6
308 ; CHECK-FP16-NONEON-NEXT: fminnm h7, h7, h7
309 ; CHECK-FP16-NONEON-NEXT: ret
311 ; CHECK-NOFP16-NEON-LABEL: fcanonicalize_v8f16_nnan:
312 ; CHECK-NOFP16-NEON: // %bb.0:
313 ; CHECK-NOFP16-NEON-NEXT: fcvtl v1.4s, v0.4h
314 ; CHECK-NOFP16-NEON-NEXT: fcvtl2 v2.4s, v0.8h
315 ; CHECK-NOFP16-NEON-NEXT: fminnm v1.4s, v1.4s, v1.4s
316 ; CHECK-NOFP16-NEON-NEXT: fcvtn v0.4h, v1.4s
317 ; CHECK-NOFP16-NEON-NEXT: fminnm v1.4s, v2.4s, v2.4s
318 ; CHECK-NOFP16-NEON-NEXT: fcvtn2 v0.8h, v1.4s
319 ; CHECK-NOFP16-NEON-NEXT: ret
321 ; CHECK-FP16-NEON-LABEL: fcanonicalize_v8f16_nnan:
322 ; CHECK-FP16-NEON: // %bb.0:
323 ; CHECK-FP16-NEON-NEXT: fminnm v0.8h, v0.8h, v0.8h
324 ; CHECK-FP16-NEON-NEXT: ret
325 %z = call nnan <8 x half> @llvm.canonicalize.v8f16(<8 x half> %x)
329 define float @fcanonicalize_f32(float %x) {
330 ; CHECK-NOFP16-NONEON-LABEL: fcanonicalize_f32:
331 ; CHECK-NOFP16-NONEON: // %bb.0:
332 ; CHECK-NOFP16-NONEON-NEXT: fminnm s0, s0, s0
333 ; CHECK-NOFP16-NONEON-NEXT: ret
335 ; CHECK-FP16-NONEON-LABEL: fcanonicalize_f32:
336 ; CHECK-FP16-NONEON: // %bb.0:
337 ; CHECK-FP16-NONEON-NEXT: fminnm s0, s0, s0
338 ; CHECK-FP16-NONEON-NEXT: ret
340 ; CHECK-NOFP16-NEON-LABEL: fcanonicalize_f32:
341 ; CHECK-NOFP16-NEON: // %bb.0:
342 ; CHECK-NOFP16-NEON-NEXT: fminnm s0, s0, s0
343 ; CHECK-NOFP16-NEON-NEXT: ret
345 ; CHECK-FP16-NEON-LABEL: fcanonicalize_f32:
346 ; CHECK-FP16-NEON: // %bb.0:
347 ; CHECK-FP16-NEON-NEXT: fminnm s0, s0, s0
348 ; CHECK-FP16-NEON-NEXT: ret
349 %z = call float @llvm.canonicalize.f32(float %x)
353 define float @fcanonicalize_f32_nnan(float %x) {
354 ; CHECK-NOFP16-NONEON-LABEL: fcanonicalize_f32_nnan:
355 ; CHECK-NOFP16-NONEON: // %bb.0:
356 ; CHECK-NOFP16-NONEON-NEXT: fminnm s0, s0, s0
357 ; CHECK-NOFP16-NONEON-NEXT: ret
359 ; CHECK-FP16-NONEON-LABEL: fcanonicalize_f32_nnan:
360 ; CHECK-FP16-NONEON: // %bb.0:
361 ; CHECK-FP16-NONEON-NEXT: fminnm s0, s0, s0
362 ; CHECK-FP16-NONEON-NEXT: ret
364 ; CHECK-NOFP16-NEON-LABEL: fcanonicalize_f32_nnan:
365 ; CHECK-NOFP16-NEON: // %bb.0:
366 ; CHECK-NOFP16-NEON-NEXT: fminnm s0, s0, s0
367 ; CHECK-NOFP16-NEON-NEXT: ret
369 ; CHECK-FP16-NEON-LABEL: fcanonicalize_f32_nnan:
370 ; CHECK-FP16-NEON: // %bb.0:
371 ; CHECK-FP16-NEON-NEXT: fminnm s0, s0, s0
372 ; CHECK-FP16-NEON-NEXT: ret
373 %z = call nnan float @llvm.canonicalize.f32(float %x)
377 define <2 x float> @fcanonicalize_v2f32(<2 x float> %x) {
378 ; CHECK-NOFP16-NONEON-LABEL: fcanonicalize_v2f32:
379 ; CHECK-NOFP16-NONEON: // %bb.0:
380 ; CHECK-NOFP16-NONEON-NEXT: fminnm s0, s0, s0
381 ; CHECK-NOFP16-NONEON-NEXT: fminnm s1, s1, s1
382 ; CHECK-NOFP16-NONEON-NEXT: ret
384 ; CHECK-FP16-NONEON-LABEL: fcanonicalize_v2f32:
385 ; CHECK-FP16-NONEON: // %bb.0:
386 ; CHECK-FP16-NONEON-NEXT: fminnm s0, s0, s0
387 ; CHECK-FP16-NONEON-NEXT: fminnm s1, s1, s1
388 ; CHECK-FP16-NONEON-NEXT: ret
390 ; CHECK-NOFP16-NEON-LABEL: fcanonicalize_v2f32:
391 ; CHECK-NOFP16-NEON: // %bb.0:
392 ; CHECK-NOFP16-NEON-NEXT: fminnm v0.2s, v0.2s, v0.2s
393 ; CHECK-NOFP16-NEON-NEXT: ret
395 ; CHECK-FP16-NEON-LABEL: fcanonicalize_v2f32:
396 ; CHECK-FP16-NEON: // %bb.0:
397 ; CHECK-FP16-NEON-NEXT: fminnm v0.2s, v0.2s, v0.2s
398 ; CHECK-FP16-NEON-NEXT: ret
399 %z = call <2 x float> @llvm.canonicalize.v2f32(<2 x float> %x)
403 define <2 x float> @fcanonicalize_v2f32_nnan(<2 x float> %x) {
404 ; CHECK-NOFP16-NONEON-LABEL: fcanonicalize_v2f32_nnan:
405 ; CHECK-NOFP16-NONEON: // %bb.0:
406 ; CHECK-NOFP16-NONEON-NEXT: fminnm s0, s0, s0
407 ; CHECK-NOFP16-NONEON-NEXT: fminnm s1, s1, s1
408 ; CHECK-NOFP16-NONEON-NEXT: ret
410 ; CHECK-FP16-NONEON-LABEL: fcanonicalize_v2f32_nnan:
411 ; CHECK-FP16-NONEON: // %bb.0:
412 ; CHECK-FP16-NONEON-NEXT: fminnm s0, s0, s0
413 ; CHECK-FP16-NONEON-NEXT: fminnm s1, s1, s1
414 ; CHECK-FP16-NONEON-NEXT: ret
416 ; CHECK-NOFP16-NEON-LABEL: fcanonicalize_v2f32_nnan:
417 ; CHECK-NOFP16-NEON: // %bb.0:
418 ; CHECK-NOFP16-NEON-NEXT: fminnm v0.2s, v0.2s, v0.2s
419 ; CHECK-NOFP16-NEON-NEXT: ret
421 ; CHECK-FP16-NEON-LABEL: fcanonicalize_v2f32_nnan:
422 ; CHECK-FP16-NEON: // %bb.0:
423 ; CHECK-FP16-NEON-NEXT: fminnm v0.2s, v0.2s, v0.2s
424 ; CHECK-FP16-NEON-NEXT: ret
425 %z = call nnan <2 x float> @llvm.canonicalize.v2f32(<2 x float> %x)
429 define <4 x float> @fcanonicalize_v4f32(<4 x float> %x) {
430 ; CHECK-NOFP16-NONEON-LABEL: fcanonicalize_v4f32:
431 ; CHECK-NOFP16-NONEON: // %bb.0:
432 ; CHECK-NOFP16-NONEON-NEXT: fminnm s0, s0, s0
433 ; CHECK-NOFP16-NONEON-NEXT: fminnm s1, s1, s1
434 ; CHECK-NOFP16-NONEON-NEXT: fminnm s2, s2, s2
435 ; CHECK-NOFP16-NONEON-NEXT: fminnm s3, s3, s3
436 ; CHECK-NOFP16-NONEON-NEXT: ret
438 ; CHECK-FP16-NONEON-LABEL: fcanonicalize_v4f32:
439 ; CHECK-FP16-NONEON: // %bb.0:
440 ; CHECK-FP16-NONEON-NEXT: fminnm s0, s0, s0
441 ; CHECK-FP16-NONEON-NEXT: fminnm s1, s1, s1
442 ; CHECK-FP16-NONEON-NEXT: fminnm s2, s2, s2
443 ; CHECK-FP16-NONEON-NEXT: fminnm s3, s3, s3
444 ; CHECK-FP16-NONEON-NEXT: ret
446 ; CHECK-NOFP16-NEON-LABEL: fcanonicalize_v4f32:
447 ; CHECK-NOFP16-NEON: // %bb.0:
448 ; CHECK-NOFP16-NEON-NEXT: fminnm v0.4s, v0.4s, v0.4s
449 ; CHECK-NOFP16-NEON-NEXT: ret
451 ; CHECK-FP16-NEON-LABEL: fcanonicalize_v4f32:
452 ; CHECK-FP16-NEON: // %bb.0:
453 ; CHECK-FP16-NEON-NEXT: fminnm v0.4s, v0.4s, v0.4s
454 ; CHECK-FP16-NEON-NEXT: ret
455 %z = call <4 x float> @llvm.canonicalize.v4f32(<4 x float> %x)
459 define <4 x float> @fcanonicalize_v4f32_nnan(<4 x float> %x) {
460 ; CHECK-NOFP16-NONEON-LABEL: fcanonicalize_v4f32_nnan:
461 ; CHECK-NOFP16-NONEON: // %bb.0:
462 ; CHECK-NOFP16-NONEON-NEXT: fminnm s0, s0, s0
463 ; CHECK-NOFP16-NONEON-NEXT: fminnm s1, s1, s1
464 ; CHECK-NOFP16-NONEON-NEXT: fminnm s2, s2, s2
465 ; CHECK-NOFP16-NONEON-NEXT: fminnm s3, s3, s3
466 ; CHECK-NOFP16-NONEON-NEXT: ret
468 ; CHECK-FP16-NONEON-LABEL: fcanonicalize_v4f32_nnan:
469 ; CHECK-FP16-NONEON: // %bb.0:
470 ; CHECK-FP16-NONEON-NEXT: fminnm s0, s0, s0
471 ; CHECK-FP16-NONEON-NEXT: fminnm s1, s1, s1
472 ; CHECK-FP16-NONEON-NEXT: fminnm s2, s2, s2
473 ; CHECK-FP16-NONEON-NEXT: fminnm s3, s3, s3
474 ; CHECK-FP16-NONEON-NEXT: ret
476 ; CHECK-NOFP16-NEON-LABEL: fcanonicalize_v4f32_nnan:
477 ; CHECK-NOFP16-NEON: // %bb.0:
478 ; CHECK-NOFP16-NEON-NEXT: fminnm v0.4s, v0.4s, v0.4s
479 ; CHECK-NOFP16-NEON-NEXT: ret
481 ; CHECK-FP16-NEON-LABEL: fcanonicalize_v4f32_nnan:
482 ; CHECK-FP16-NEON: // %bb.0:
483 ; CHECK-FP16-NEON-NEXT: fminnm v0.4s, v0.4s, v0.4s
484 ; CHECK-FP16-NEON-NEXT: ret
485 %z = call nnan <4 x float> @llvm.canonicalize.v4f32(<4 x float> %x)
489 define double @fcanonicalize_f64(double %x) {
490 ; CHECK-NOFP16-NONEON-LABEL: fcanonicalize_f64:
491 ; CHECK-NOFP16-NONEON: // %bb.0:
492 ; CHECK-NOFP16-NONEON-NEXT: fminnm d0, d0, d0
493 ; CHECK-NOFP16-NONEON-NEXT: ret
495 ; CHECK-FP16-NONEON-LABEL: fcanonicalize_f64:
496 ; CHECK-FP16-NONEON: // %bb.0:
497 ; CHECK-FP16-NONEON-NEXT: fminnm d0, d0, d0
498 ; CHECK-FP16-NONEON-NEXT: ret
500 ; CHECK-NOFP16-NEON-LABEL: fcanonicalize_f64:
501 ; CHECK-NOFP16-NEON: // %bb.0:
502 ; CHECK-NOFP16-NEON-NEXT: fminnm d0, d0, d0
503 ; CHECK-NOFP16-NEON-NEXT: ret
505 ; CHECK-FP16-NEON-LABEL: fcanonicalize_f64:
506 ; CHECK-FP16-NEON: // %bb.0:
507 ; CHECK-FP16-NEON-NEXT: fminnm d0, d0, d0
508 ; CHECK-FP16-NEON-NEXT: ret
509 %z = call double @llvm.canonicalize.f64(double %x)
513 define double @fcanonicalize_f64_nnan(double %x) {
514 ; CHECK-NOFP16-NONEON-LABEL: fcanonicalize_f64_nnan:
515 ; CHECK-NOFP16-NONEON: // %bb.0:
516 ; CHECK-NOFP16-NONEON-NEXT: fminnm d0, d0, d0
517 ; CHECK-NOFP16-NONEON-NEXT: ret
519 ; CHECK-FP16-NONEON-LABEL: fcanonicalize_f64_nnan:
520 ; CHECK-FP16-NONEON: // %bb.0:
521 ; CHECK-FP16-NONEON-NEXT: fminnm d0, d0, d0
522 ; CHECK-FP16-NONEON-NEXT: ret
524 ; CHECK-NOFP16-NEON-LABEL: fcanonicalize_f64_nnan:
525 ; CHECK-NOFP16-NEON: // %bb.0:
526 ; CHECK-NOFP16-NEON-NEXT: fminnm d0, d0, d0
527 ; CHECK-NOFP16-NEON-NEXT: ret
529 ; CHECK-FP16-NEON-LABEL: fcanonicalize_f64_nnan:
530 ; CHECK-FP16-NEON: // %bb.0:
531 ; CHECK-FP16-NEON-NEXT: fminnm d0, d0, d0
532 ; CHECK-FP16-NEON-NEXT: ret
533 %z = call nnan double @llvm.canonicalize.f64(double %x)
537 define <2 x double> @fcanonicalize_v2f64(<2 x double> %x) {
538 ; CHECK-NOFP16-NONEON-LABEL: fcanonicalize_v2f64:
539 ; CHECK-NOFP16-NONEON: // %bb.0:
540 ; CHECK-NOFP16-NONEON-NEXT: fminnm d0, d0, d0
541 ; CHECK-NOFP16-NONEON-NEXT: fminnm d1, d1, d1
542 ; CHECK-NOFP16-NONEON-NEXT: ret
544 ; CHECK-FP16-NONEON-LABEL: fcanonicalize_v2f64:
545 ; CHECK-FP16-NONEON: // %bb.0:
546 ; CHECK-FP16-NONEON-NEXT: fminnm d0, d0, d0
547 ; CHECK-FP16-NONEON-NEXT: fminnm d1, d1, d1
548 ; CHECK-FP16-NONEON-NEXT: ret
550 ; CHECK-NOFP16-NEON-LABEL: fcanonicalize_v2f64:
551 ; CHECK-NOFP16-NEON: // %bb.0:
552 ; CHECK-NOFP16-NEON-NEXT: fminnm v0.2d, v0.2d, v0.2d
553 ; CHECK-NOFP16-NEON-NEXT: ret
555 ; CHECK-FP16-NEON-LABEL: fcanonicalize_v2f64:
556 ; CHECK-FP16-NEON: // %bb.0:
557 ; CHECK-FP16-NEON-NEXT: fminnm v0.2d, v0.2d, v0.2d
558 ; CHECK-FP16-NEON-NEXT: ret
559 %z = call <2 x double> @llvm.canonicalize.v2f64(<2 x double> %x)
563 define <2 x double> @fcanonicalize_v2f64_nnan(<2 x double> %x) {
564 ; CHECK-NOFP16-NONEON-LABEL: fcanonicalize_v2f64_nnan:
565 ; CHECK-NOFP16-NONEON: // %bb.0:
566 ; CHECK-NOFP16-NONEON-NEXT: fminnm d0, d0, d0
567 ; CHECK-NOFP16-NONEON-NEXT: fminnm d1, d1, d1
568 ; CHECK-NOFP16-NONEON-NEXT: ret
570 ; CHECK-FP16-NONEON-LABEL: fcanonicalize_v2f64_nnan:
571 ; CHECK-FP16-NONEON: // %bb.0:
572 ; CHECK-FP16-NONEON-NEXT: fminnm d0, d0, d0
573 ; CHECK-FP16-NONEON-NEXT: fminnm d1, d1, d1
574 ; CHECK-FP16-NONEON-NEXT: ret
576 ; CHECK-NOFP16-NEON-LABEL: fcanonicalize_v2f64_nnan:
577 ; CHECK-NOFP16-NEON: // %bb.0:
578 ; CHECK-NOFP16-NEON-NEXT: fminnm v0.2d, v0.2d, v0.2d
579 ; CHECK-NOFP16-NEON-NEXT: ret
581 ; CHECK-FP16-NEON-LABEL: fcanonicalize_v2f64_nnan:
582 ; CHECK-FP16-NEON: // %bb.0:
583 ; CHECK-FP16-NEON-NEXT: fminnm v0.2d, v0.2d, v0.2d
584 ; CHECK-FP16-NEON-NEXT: ret
585 %z = call nnan <2 x double> @llvm.canonicalize.v2f64(<2 x double> %x)