1 ; RUN: llc < %s -mtriple armv8 -mattr=+neon,+fp-armv8 | FileCheck %s
2 ; RUN: llc < %s -mtriple armv8 -mattr=+neon,+fp-armv8 \
3 ; RUN: -enable-no-nans-fp-math -enable-unsafe-fp-math | FileCheck %s --check-prefix=CHECK-FAST
7 define <4 x float> @vmaxnmq(<4 x float>* %A, <4 x float>* %B) nounwind {
8 ; CHECK-LABEL: vmaxnmq:
9 ; CHECK: vmaxnm.f32 q{{[0-9]+}}, q{{[0-9]+}}, q{{[0-9]+}}
10 %tmp1 = load <4 x float>, <4 x float>* %A
11 %tmp2 = load <4 x float>, <4 x float>* %B
12 %tmp3 = call <4 x float> @llvm.arm.neon.vmaxnm.v4f32(<4 x float> %tmp1, <4 x float> %tmp2)
16 define <2 x float> @vmaxnmd(<2 x float>* %A, <2 x float>* %B) nounwind {
17 ; CHECK-LABEL: vmaxnmd:
18 ; CHECK: vmaxnm.f32 d{{[0-9]+}}, d{{[0-9]+}}, d{{[0-9]+}}
19 %tmp1 = load <2 x float>, <2 x float>* %A
20 %tmp2 = load <2 x float>, <2 x float>* %B
21 %tmp3 = call <2 x float> @llvm.arm.neon.vmaxnm.v2f32(<2 x float> %tmp1, <2 x float> %tmp2)
25 define <4 x float> @vminnmq(<4 x float>* %A, <4 x float>* %B) nounwind {
26 ; CHECK-LABEL: vminnmq:
27 ; CHECK: vminnm.f32 q{{[0-9]+}}, q{{[0-9]+}}, q{{[0-9]+}}
28 %tmp1 = load <4 x float>, <4 x float>* %A
29 %tmp2 = load <4 x float>, <4 x float>* %B
30 %tmp3 = call <4 x float> @llvm.arm.neon.vminnm.v4f32(<4 x float> %tmp1, <4 x float> %tmp2)
34 define <2 x float> @vminnmd(<2 x float>* %A, <2 x float>* %B) nounwind {
35 ; CHECK-LABEL: vminnmd:
36 ; CHECK: vminnm.f32 d{{[0-9]+}}, d{{[0-9]+}}, d{{[0-9]+}}
37 %tmp1 = load <2 x float>, <2 x float>* %A
38 %tmp2 = load <2 x float>, <2 x float>* %B
39 %tmp3 = call <2 x float> @llvm.arm.neon.vminnm.v2f32(<2 x float> %tmp1, <2 x float> %tmp2)
45 define float @fp-armv8_vminnm_o(float %a, float %b) {
46 ; CHECK-FAST-LABEL: "fp-armv8_vminnm_o":
47 ; CHECK-FAST-NOT: vcmp
48 ; CHECK-FAST: vminnm.f32
49 ; CHECK-LABEL: "fp-armv8_vminnm_o":
50 ; CHECK-NOT: vminnm.f32
51 %cmp = fcmp olt float %a, %b
52 %cond = select i1 %cmp, float %a, float %b
56 define double @fp-armv8_vminnm_ole(double %a, double %b) {
57 ; CHECK-FAST-LABEL: "fp-armv8_vminnm_ole":
58 ; CHECK-FAST-NOT: vcmp
59 ; CHECK-FAST: vminnm.f64
60 ; CHECK-LABEL: "fp-armv8_vminnm_ole":
61 ; CHECK-NOT: vminnm.f64
62 %cmp = fcmp ole double %a, %b
63 %cond = select i1 %cmp, double %a, double %b
67 define float @fp-armv8_vminnm_o_rev(float %a, float %b) {
68 ; CHECK-FAST-LABEL: "fp-armv8_vminnm_o_rev":
69 ; CHECK-FAST-NOT: vcmp
70 ; CHECK-FAST: vminnm.f32
71 ; CHECK-LABEL: "fp-armv8_vminnm_o_rev":
72 ; CHECK-NOT: vminnm.f32
73 %cmp = fcmp ogt float %a, %b
74 %cond = select i1 %cmp, float %b, float %a
78 define double @fp-armv8_vminnm_oge_rev(double %a, double %b) {
79 ; CHECK-FAST-LABEL: "fp-armv8_vminnm_oge_rev":
80 ; CHECK-FAST-NOT: vcmp
81 ; CHECK-FAST: vminnm.f64
82 ; CHECK-LABEL: "fp-armv8_vminnm_oge_rev":
83 ; CHECK-NOT: vminnm.f64
84 %cmp = fcmp oge double %a, %b
85 %cond = select i1 %cmp, double %b, double %a
89 define float @fp-armv8_vminnm_u(float %a, float %b) {
90 ; CHECK-FAST-LABEL: "fp-armv8_vminnm_u":
91 ; CHECK-FAST-NOT: vcmp
92 ; CHECK-FAST: vminnm.f32
93 ; CHECK-LABEL: "fp-armv8_vminnm_u":
94 ; CHECK-NOT: vminnm.f32
95 %cmp = fcmp ult float %a, %b
96 %cond = select i1 %cmp, float %a, float %b
100 define float @fp-armv8_vminnm_ule(float %a, float %b) {
101 ; CHECK-FAST-LABEL: "fp-armv8_vminnm_ule":
102 ; CHECK-FAST-NOT: vcmp
103 ; CHECK-FAST: vminnm.f32
104 ; CHECK-LABEL: "fp-armv8_vminnm_ule":
105 ; CHECK-NOT: vminnm.f32
106 %cmp = fcmp ule float %a, %b
107 %cond = select i1 %cmp, float %a, float %b
111 define float @fp-armv8_vminnm_u_rev(float %a, float %b) {
112 ; CHECK-FAST-LABEL: "fp-armv8_vminnm_u_rev":
113 ; CHECK-FAST-NOT: vcmp
114 ; CHECK-FAST: vminnm.f32
115 ; CHECK-LABEL: "fp-armv8_vminnm_u_rev":
116 ; CHECK-NOT: vminnm.f32
117 %cmp = fcmp ugt float %a, %b
118 %cond = select i1 %cmp, float %b, float %a
122 define double @fp-armv8_vminnm_uge_rev(double %a, double %b) {
123 ; CHECK-FAST-LABEL: "fp-armv8_vminnm_uge_rev":
124 ; CHECK-FAST-NOT: vcmp
125 ; CHECK-FAST: vminnm.f64
126 ; CHECK-LABEL: "fp-armv8_vminnm_uge_rev":
127 ; CHECK-NOT: vminnm.f64
128 %cmp = fcmp uge double %a, %b
129 %cond = select i1 %cmp, double %b, double %a
133 define float @fp-armv8_vmaxnm_o(float %a, float %b) {
134 ; CHECK-FAST-LABEL: "fp-armv8_vmaxnm_o":
135 ; CHECK-FAST-NOT: vcmp
136 ; CHECK-FAST: vmaxnm.f32
137 ; CHECK-LABEL: "fp-armv8_vmaxnm_o":
138 ; CHECK-NOT: vmaxnm.f32
139 %cmp = fcmp ogt float %a, %b
140 %cond = select i1 %cmp, float %a, float %b
144 define float @fp-armv8_vmaxnm_oge(float %a, float %b) {
145 ; CHECK-FAST-LABEL: "fp-armv8_vmaxnm_oge":
146 ; CHECK-FAST-NOT: vcmp
147 ; CHECK-FAST: vmaxnm.f32
148 ; CHECK-LABEL: "fp-armv8_vmaxnm_oge":
149 ; CHECK-NOT: vmaxnm.f32
150 %cmp = fcmp oge float %a, %b
151 %cond = select i1 %cmp, float %a, float %b
155 define float @fp-armv8_vmaxnm_o_rev(float %a, float %b) {
156 ; CHECK-FAST-LABEL: "fp-armv8_vmaxnm_o_rev":
157 ; CHECK-FAST-NOT: vcmp
158 ; CHECK-FAST: vmaxnm.f32
159 ; CHECK-LABEL: "fp-armv8_vmaxnm_o_rev":
160 ; CHECK-NOT: vmaxnm.f32
161 %cmp = fcmp olt float %a, %b
162 %cond = select i1 %cmp, float %b, float %a
166 define float @fp-armv8_vmaxnm_ole_rev(float %a, float %b) {
167 ; CHECK-FAST-LABEL: "fp-armv8_vmaxnm_ole_rev":
168 ; CHECK-FAST-NOT: vcmp
169 ; CHECK-FAST: vmaxnm.f32
170 ; CHECK-LABEL: "fp-armv8_vmaxnm_ole_rev":
171 ; CHECK-NOT: vmaxnm.f32
172 %cmp = fcmp ole float %a, %b
173 %cond = select i1 %cmp, float %b, float %a
177 define float @fp-armv8_vmaxnm_u(float %a, float %b) {
178 ; CHECK-FAST-LABEL: "fp-armv8_vmaxnm_u":
179 ; CHECK-FAST-NOT: vcmp
180 ; CHECK-FAST: vmaxnm.f32
181 ; CHECK-LABEL: "fp-armv8_vmaxnm_u":
182 ; CHECK-NOT: vmaxnm.f32
183 %cmp = fcmp ugt float %a, %b
184 %cond = select i1 %cmp, float %a, float %b
188 define float @fp-armv8_vmaxnm_uge(float %a, float %b) {
189 ; CHECK-FAST-LABEL: "fp-armv8_vmaxnm_uge":
190 ; CHECK-FAST-NOT: vcmp
191 ; CHECK-FAST: vmaxnm.f32
192 ; CHECK-LABEL: "fp-armv8_vmaxnm_uge":
193 ; CHECK-NOT: vmaxnm.f32
194 %cmp = fcmp uge float %a, %b
195 %cond = select i1 %cmp, float %a, float %b
199 define float @fp-armv8_vmaxnm_u_rev(float %a, float %b) {
200 ; CHECK-FAST-LABEL: "fp-armv8_vmaxnm_u_rev":
201 ; CHECK-FAST-NOT: vcmp
202 ; CHECK-FAST: vmaxnm.f32
203 ; CHECK-LABEL: "fp-armv8_vmaxnm_u_rev":
204 ; CHECK-NOT: vmaxnm.f32
205 %cmp = fcmp ult float %a, %b
206 %cond = select i1 %cmp, float %b, float %a
210 define double @fp-armv8_vmaxnm_ule_rev(double %a, double %b) {
211 ; CHECK-FAST-LABEL: "fp-armv8_vmaxnm_ule_rev":
212 ; CHECK-FAST-NOT: vcmp
213 ; CHECK-FAST: vmaxnm.f64
214 ; CHECK-LABEL: "fp-armv8_vmaxnm_ule_rev":
215 ; CHECK-NOT: vmaxnm.f64
216 %cmp = fcmp ule double %a, %b
217 %cond = select i1 %cmp, double %b, double %a
223 define float @fp-armv8_vminnm_NNNo(float %a) {
224 ; CHECK-FAST-LABEL: "fp-armv8_vminnm_NNNo":
225 ; CHECK-FAST: vminnm.f32
226 ; CHECK-FAST: vminnm.f32
227 ; CHECK-LABEL: "fp-armv8_vminnm_NNNo":
229 ; CHECK-NOT: vminnm.f32
230 %cmp1 = fcmp olt float %a, 12.
231 %cond1 = select i1 %cmp1, float %a, float 12.
232 %cmp2 = fcmp olt float 34., %cond1
233 %cond2 = select i1 %cmp2, float 34., float %cond1
237 define double @fp-armv8_vminnm_NNNole(double %a) {
238 ; CHECK-FAST-LABEL: "fp-armv8_vminnm_NNNole":
239 ; CHECK-FAST: vminnm.f64
240 ; CHECK-FAST: vminnm.f64
241 ; CHECK-LABEL: "fp-armv8_vminnm_NNNole":
243 ; CHECK-NOT: vminnm.f64
244 %cmp1 = fcmp ole double %a, 34.
245 %cond1 = select i1 %cmp1, double %a, double 34.
246 %cmp2 = fcmp ole double 56., %cond1
247 %cond2 = select i1 %cmp2, double 56., double %cond1
251 define float @fp-armv8_vminnm_NNNo_rev(float %a) {
252 ; CHECK-FAST-LABEL: "fp-armv8_vminnm_NNNo_rev":
253 ; CHECK-FAST: vminnm.f32
254 ; CHECK-FAST: vminnm.f32
255 ; CHECK-LABEL: "fp-armv8_vminnm_NNNo_rev":
257 ; CHECK-NOT: vminnm.f32
258 %cmp1 = fcmp ogt float %a, 56.
259 %cond1 = select i1 %cmp1, float 56., float %a
260 %cmp2 = fcmp ogt float 78., %cond1
261 %cond2 = select i1 %cmp2, float %cond1, float 78.
265 define double @fp-armv8_vminnm_NNNoge_rev(double %a) {
266 ; CHECK-FAST-LABEL: "fp-armv8_vminnm_NNNoge_rev":
267 ; CHECK-FAST: vminnm.f64
268 ; CHECK-FAST: vminnm.f64
269 ; CHECK-LABEL: "fp-armv8_vminnm_NNNoge_rev":
271 ; CHECK-NOT: vminnm.f64
272 %cmp1 = fcmp oge double %a, 78.
273 %cond1 = select i1 %cmp1, double 78., double %a
274 %cmp2 = fcmp oge double 90., %cond1
275 %cond2 = select i1 %cmp2, double %cond1, double 90.
279 define float @fp-armv8_vminnm_NNNu(float %b) {
280 ; CHECK-FAST-LABEL: "fp-armv8_vminnm_NNNu":
281 ; CHECK-FAST: vminnm.f32
282 ; CHECK-FAST: vminnm.f32
283 ; CHECK-LABEL: "fp-armv8_vminnm_NNNu":
285 ; CHECK-NOT: vminnm.f32
286 %cmp1 = fcmp ult float 12., %b
287 %cond1 = select i1 %cmp1, float 12., float %b
288 %cmp2 = fcmp ult float %cond1, 34.
289 %cond2 = select i1 %cmp2, float %cond1, float 34.
293 define float @fp-armv8_vminnm_NNNule(float %b) {
294 ; CHECK-FAST-LABEL: "fp-armv8_vminnm_NNNule":
295 ; CHECK-FAST: vminnm.f32
296 ; CHECK-FAST: vminnm.f32
297 ; CHECK-LABEL: "fp-armv8_vminnm_NNNule":
299 ; CHECK-NOT: vminnm.f32
300 %cmp1 = fcmp ule float 34., %b
301 %cond1 = select i1 %cmp1, float 34., float %b
302 %cmp2 = fcmp ule float %cond1, 56.
303 %cond2 = select i1 %cmp2, float %cond1, float 56.
307 define float @fp-armv8_vminnm_NNNu_rev(float %b) {
308 ; CHECK-FAST-LABEL: "fp-armv8_vminnm_NNNu_rev":
309 ; CHECK-FAST: vminnm.f32
310 ; CHECK-FAST: vminnm.f32
311 ; CHECK-LABEL: "fp-armv8_vminnm_NNNu_rev":
313 ; CHECK-NOT: vminnm.f32
314 %cmp1 = fcmp ugt float 56., %b
315 %cond1 = select i1 %cmp1, float %b, float 56.
316 %cmp2 = fcmp ugt float %cond1, 78.
317 %cond2 = select i1 %cmp2, float 78., float %cond1
321 define double @fp-armv8_vminnm_NNNuge_rev(double %b) {
322 ; CHECK-FAST-LABEL: "fp-armv8_vminnm_NNNuge_rev":
323 ; CHECK-FAST: vminnm.f64
324 ; CHECK-FAST: vminnm.f64
325 ; CHECK-LABEL: "fp-armv8_vminnm_NNNuge_rev":
327 ; CHECK-NOT: vminnm.f64
328 %cmp1 = fcmp uge double 78., %b
329 %cond1 = select i1 %cmp1, double %b, double 78.
330 %cmp2 = fcmp uge double %cond1, 90.
331 %cond2 = select i1 %cmp2, double 90., double %cond1
335 define float @fp-armv8_vmaxnm_NNNo(float %a) {
336 ; CHECK-FAST-LABEL: "fp-armv8_vmaxnm_NNNo":
337 ; CHECK-FAST: vmaxnm.f32
338 ; CHECK-FAST: vmaxnm.f32
339 ; CHECK-LABEL: "fp-armv8_vmaxnm_NNNo":
341 ; CHECK-NOT: vmaxnm.f32
342 %cmp1 = fcmp ogt float %a, 12.
343 %cond1 = select i1 %cmp1, float %a, float 12.
344 %cmp2 = fcmp ogt float 34., %cond1
345 %cond2 = select i1 %cmp2, float 34., float %cond1
349 define float @fp-armv8_vmaxnm_NNNoge(float %a) {
350 ; CHECK-FAST-LABEL: "fp-armv8_vmaxnm_NNNoge":
351 ; CHECK-FAST: vmaxnm.f32
352 ; CHECK-FAST: vmaxnm.f32
353 ; CHECK-LABEL: "fp-armv8_vmaxnm_NNNoge":
355 ; CHECK-NOT: vmaxnm.f32
356 %cmp1 = fcmp oge float %a, 34.
357 %cond1 = select i1 %cmp1, float %a, float 34.
358 %cmp2 = fcmp oge float 56., %cond1
359 %cond2 = select i1 %cmp2, float 56., float %cond1
363 define float @fp-armv8_vmaxnm_NNNo_rev(float %a) {
364 ; CHECK-FAST-LABEL: "fp-armv8_vmaxnm_NNNo_rev":
365 ; CHECK-FAST: vmaxnm.f32
366 ; CHECK-FAST: vmaxnm.f32
367 ; CHECK-LABEL: "fp-armv8_vmaxnm_NNNo_rev":
369 ; CHECK-NOT: vmaxnm.f32
370 %cmp1 = fcmp olt float %a, 56.
371 %cond1 = select i1 %cmp1, float 56., float %a
372 %cmp2 = fcmp olt float 78., %cond1
373 %cond2 = select i1 %cmp2, float %cond1, float 78.
377 define float @fp-armv8_vmaxnm_NNNole_rev(float %a) {
378 ; CHECK-FAST-LABEL: "fp-armv8_vmaxnm_NNNole_rev":
379 ; CHECK-FAST: vmaxnm.f32
380 ; CHECK-FAST: vmaxnm.f32
381 ; CHECK-LABEL: "fp-armv8_vmaxnm_NNNole_rev":
383 ; CHECK-NOT: vmaxnm.f32
384 %cmp1 = fcmp ole float %a, 78.
385 %cond1 = select i1 %cmp1, float 78., float %a
386 %cmp2 = fcmp ole float 90., %cond1
387 %cond2 = select i1 %cmp2, float %cond1, float 90.
391 define float @fp-armv8_vmaxnm_NNNu(float %b) {
392 ; CHECK-FAST-LABEL: "fp-armv8_vmaxnm_NNNu":
393 ; CHECK-FAST: vmaxnm.f32
394 ; CHECK-FAST: vmaxnm.f32
395 ; CHECK-LABEL: "fp-armv8_vmaxnm_NNNu":
397 ; CHEC-NOT: vmaxnm.f32
398 %cmp1 = fcmp ugt float 12., %b
399 %cond1 = select i1 %cmp1, float 12., float %b
400 %cmp2 = fcmp ugt float %cond1, 34.
401 %cond2 = select i1 %cmp2, float %cond1, float 34.
405 define float @fp-armv8_vmaxnm_NNNuge(float %b) {
406 ; CHECK-FAST-LABEL: "fp-armv8_vmaxnm_NNNuge":
407 ; CHECK-FAST: vmaxnm.f32
408 ; CHECK-FAST: vmaxnm.f32
409 ; CHECK-LABEL: "fp-armv8_vmaxnm_NNNuge":
411 ; CHECK-NOT: vmaxnm.f32
412 %cmp1 = fcmp uge float 34., %b
413 %cond1 = select i1 %cmp1, float 34., float %b
414 %cmp2 = fcmp uge float %cond1, 56.
415 %cond2 = select i1 %cmp2, float %cond1, float 56.
419 define float @fp-armv8_vmaxnm_NNNu_rev(float %b) {
420 ; CHECK-FAST-LABEL: "fp-armv8_vmaxnm_NNNu_rev":
421 ; CHECK-FAST: vmaxnm.f32
422 ; CHECK-FAST: vmaxnm.f32
423 ; CHECK-LABEL: "fp-armv8_vmaxnm_NNNu_rev":
425 ; CHECK-NOT: vmaxnm.f32
426 %cmp1 = fcmp ult float 56., %b
427 %cond1 = select i1 %cmp1, float %b, float 56.
428 %cmp2 = fcmp ult float %cond1, 78.
429 %cond2 = select i1 %cmp2, float 78., float %cond1
433 define double @fp-armv8_vmaxnm_NNNule_rev( double %b) {
434 ; CHECK-FAST-LABEL: "fp-armv8_vmaxnm_NNNule_rev":
435 ; CHECK-FAST: vmaxnm.f64
436 ; CHECK-FAST: vmaxnm.f64
437 ; CHECK-LABEL: "fp-armv8_vmaxnm_NNNule_rev":
439 ; CHECK-NOT: vmaxnm.f64
440 %cmp1 = fcmp ule double 78., %b
441 %cond1 = select i1 %cmp1, double %b, double 78.
442 %cmp2 = fcmp ule double %cond1, 90.
443 %cond2 = select i1 %cmp2, double 90., double %cond1
447 define float @fp-armv8_vminmaxnm_0(float %a) {
448 ; CHECK-FAST-LABEL: "fp-armv8_vminmaxnm_0":
449 ; CHECK-FAST-NOT: vcmp
450 ; CHECK-FAST: vminnm.f32
451 ; CHECK-FAST: vmaxnm.f32
452 ; CHECK-LABEL: "fp-armv8_vminmaxnm_0":
453 ; CHECK-NOT: vminnm.f32
455 %cmp1 = fcmp olt float %a, 0.
456 %cond1 = select i1 %cmp1, float %a, float 0.
457 %cmp2 = fcmp ogt float %cond1, 0.
458 %cond2 = select i1 %cmp2, float %cond1, float 0.
462 define float @fp-armv8_vminmaxnm_neg0(float %a) {
463 ; CHECK-FAST-LABEL: "fp-armv8_vminmaxnm_neg0":
464 ; CHECK-FAST-NOT: vcmp
465 ; CHECK-FAST: vminnm.f32
466 ; CHECK-FAST: vmaxnm.f32
467 ; CHECK-LABEL: "fp-armv8_vminmaxnm_neg0":
469 ; CHECK-NOT: vmaxnm.f32
470 %cmp1 = fcmp olt float %a, -0.
471 %cond1 = select i1 %cmp1, float %a, float -0.
472 %cmp2 = fcmp ogt float %cond1, -0.
473 %cond2 = select i1 %cmp2, float %cond1, float -0.
477 define float @fp-armv8_vminmaxnm_e_0(float %a) {
478 ; CHECK-FAST-LABEL: "fp-armv8_vminmaxnm_e_0":
479 ; CHECK-FAST-NOT: vcmp
480 ; CHECK-FAST: vminnm.f32
481 ; CHECK-FAST: vmaxnm.f32
482 ; CHECK-LABEL: "fp-armv8_vminmaxnm_e_0":
483 ; CHECK-NOT: vminnm.f32
485 %cmp1 = fcmp ule float 0., %a
486 %cond1 = select i1 %cmp1, float 0., float %a
487 %cmp2 = fcmp uge float 0., %cond1
488 %cond2 = select i1 %cmp2, float 0., float %cond1
492 define float @fp-armv8_vminmaxnm_e_neg0(float %a) {
493 ; CHECK-FAST-LABEL: "fp-armv8_vminmaxnm_e_neg0":
494 ; CHECK-FAST-NOT: vcmp
495 ; CHECK-FAST: vminnm.f32
496 ; CHECK-FAST: vmaxnm.f32
497 ; CHECK-LABEL: "fp-armv8_vminmaxnm_e_neg0":
499 ; CHECK-NOT: vmaxnm.f32
500 %cmp1 = fcmp ule float -0., %a
501 %cond1 = select i1 %cmp1, float -0., float %a
502 %cmp2 = fcmp uge float -0., %cond1
503 %cond2 = select i1 %cmp2, float -0., float %cond1
507 declare <4 x float> @llvm.arm.neon.vminnm.v4f32(<4 x float>, <4 x float>) nounwind readnone
508 declare <2 x float> @llvm.arm.neon.vminnm.v2f32(<2 x float>, <2 x float>) nounwind readnone
509 declare <4 x float> @llvm.arm.neon.vmaxnm.v4f32(<4 x float>, <4 x float>) nounwind readnone
510 declare <2 x float> @llvm.arm.neon.vmaxnm.v2f32(<2 x float>, <2 x float>) nounwind readnone