[TTI] getTypeBasedIntrinsicInstrCost - add basic handling for strided load/store...
[llvm-project.git] / llvm / test / CodeGen / X86 / canonicalize-vars.ll
blob67213b38277dcb2b786e6f876290ee16c3a8d854
1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --default-march x86_64-unknown-linux-gnu --version 5
2 ; RUN: llc -mtriple=i686-- < %s | FileCheck %s -check-prefixes=X87
3 ; RUN: llc -mattr=+sse2 -mtriple=i686-- < %s | FileCheck %s -check-prefixes=X86-SSE
4 ; RUN: llc -mattr=+avx -mtriple=i686-- < %s | FileCheck %s -check-prefixes=X86-AVX
5 ; RUN: llc -mattr=+sse2 -mtriple=x86_64 < %s | FileCheck %s -check-prefixes=SSE
6 ; RUN: llc -mattr=+avx -mtriple=x86_64 < %s | FileCheck %s -check-prefixes=AVX,AVX1
7 ; RUN: llc -mattr=+avx2 -mtriple=x86_64 < %s | FileCheck %s -check-prefixes=AVX,AVX2
8 ; RUN: llc -mattr=+avx512f -mtriple=x86_64 < %s | FileCheck %s -check-prefixes=AVX,AVX512F
10 define float @canon_fp32_varargsf32(float %a) {
11 ; X87-LABEL: canon_fp32_varargsf32:
12 ; X87:       # %bb.0:
13 ; X87-NEXT:    fld1
14 ; X87-NEXT:    fmuls {{[0-9]+}}(%esp)
15 ; X87-NEXT:    retl
17 ; X86-SSE-LABEL: canon_fp32_varargsf32:
18 ; X86-SSE:       # %bb.0:
19 ; X86-SSE-NEXT:    pushl %eax
20 ; X86-SSE-NEXT:    .cfi_def_cfa_offset 8
21 ; X86-SSE-NEXT:    movss {{.*#+}} xmm0 = mem[0],zero,zero,zero
22 ; X86-SSE-NEXT:    mulss {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0
23 ; X86-SSE-NEXT:    movss %xmm0, (%esp)
24 ; X86-SSE-NEXT:    flds (%esp)
25 ; X86-SSE-NEXT:    popl %eax
26 ; X86-SSE-NEXT:    .cfi_def_cfa_offset 4
27 ; X86-SSE-NEXT:    retl
29 ; X86-AVX-LABEL: canon_fp32_varargsf32:
30 ; X86-AVX:       # %bb.0:
31 ; X86-AVX-NEXT:    pushl %eax
32 ; X86-AVX-NEXT:    .cfi_def_cfa_offset 8
33 ; X86-AVX-NEXT:    vmovss {{.*#+}} xmm0 = mem[0],zero,zero,zero
34 ; X86-AVX-NEXT:    vmulss {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0, %xmm0
35 ; X86-AVX-NEXT:    vmovss %xmm0, (%esp)
36 ; X86-AVX-NEXT:    flds (%esp)
37 ; X86-AVX-NEXT:    popl %eax
38 ; X86-AVX-NEXT:    .cfi_def_cfa_offset 4
39 ; X86-AVX-NEXT:    retl
41 ; SSE-LABEL: canon_fp32_varargsf32:
42 ; SSE:       # %bb.0:
43 ; SSE-NEXT:    mulss {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
44 ; SSE-NEXT:    retq
46 ; AVX-LABEL: canon_fp32_varargsf32:
47 ; AVX:       # %bb.0:
48 ; AVX-NEXT:    vmulss {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0
49 ; AVX-NEXT:    retq
50   %canonicalized = call float @llvm.canonicalize.f32(float %a)
51   ret float %canonicalized
54 define x86_fp80 @canon_fp32_varargsf80(x86_fp80 %a) {
55 ; X87-LABEL: canon_fp32_varargsf80:
56 ; X87:       # %bb.0:
57 ; X87-NEXT:    fldt {{[0-9]+}}(%esp)
58 ; X87-NEXT:    fld1
59 ; X87-NEXT:    fmulp %st, %st(1)
60 ; X87-NEXT:    retl
62 ; X86-SSE-LABEL: canon_fp32_varargsf80:
63 ; X86-SSE:       # %bb.0:
64 ; X86-SSE-NEXT:    fldt {{[0-9]+}}(%esp)
65 ; X86-SSE-NEXT:    fld1
66 ; X86-SSE-NEXT:    fmulp %st, %st(1)
67 ; X86-SSE-NEXT:    retl
69 ; X86-AVX-LABEL: canon_fp32_varargsf80:
70 ; X86-AVX:       # %bb.0:
71 ; X86-AVX-NEXT:    fldt {{[0-9]+}}(%esp)
72 ; X86-AVX-NEXT:    fld1
73 ; X86-AVX-NEXT:    fmulp %st, %st(1)
74 ; X86-AVX-NEXT:    retl
76 ; SSE-LABEL: canon_fp32_varargsf80:
77 ; SSE:       # %bb.0:
78 ; SSE-NEXT:    fldt {{[0-9]+}}(%rsp)
79 ; SSE-NEXT:    fld1
80 ; SSE-NEXT:    fmulp %st, %st(1)
81 ; SSE-NEXT:    retq
83 ; AVX-LABEL: canon_fp32_varargsf80:
84 ; AVX:       # %bb.0:
85 ; AVX-NEXT:    fldt {{[0-9]+}}(%rsp)
86 ; AVX-NEXT:    fld1
87 ; AVX-NEXT:    fmulp %st, %st(1)
88 ; AVX-NEXT:    retq
89   %canonicalized = call x86_fp80 @llvm.canonicalize.f80(x86_fp80 %a)
90   ret x86_fp80 %canonicalized
93 define x86_fp80 @complex_canonicalize_fmul_x86_fp80(x86_fp80 %a, x86_fp80 %b) {
94 ; X87-LABEL: complex_canonicalize_fmul_x86_fp80:
95 ; X87:       # %bb.0: # %entry
96 ; X87-NEXT:    fldt {{[0-9]+}}(%esp)
97 ; X87-NEXT:    fldt {{[0-9]+}}(%esp)
98 ; X87-NEXT:    fsub %st(1), %st
99 ; X87-NEXT:    fld %st(0)
100 ; X87-NEXT:    fadd %st(2), %st
101 ; X87-NEXT:    fsubp %st, %st(1)
102 ; X87-NEXT:    fld1
103 ; X87-NEXT:    fmulp %st, %st(1)
104 ; X87-NEXT:    fsubp %st, %st(1)
105 ; X87-NEXT:    retl
107 ; X86-SSE-LABEL: complex_canonicalize_fmul_x86_fp80:
108 ; X86-SSE:       # %bb.0: # %entry
109 ; X86-SSE-NEXT:    fldt {{[0-9]+}}(%esp)
110 ; X86-SSE-NEXT:    fldt {{[0-9]+}}(%esp)
111 ; X86-SSE-NEXT:    fsub %st(1), %st
112 ; X86-SSE-NEXT:    fld %st(0)
113 ; X86-SSE-NEXT:    fadd %st(2), %st
114 ; X86-SSE-NEXT:    fsubp %st, %st(1)
115 ; X86-SSE-NEXT:    fld1
116 ; X86-SSE-NEXT:    fmulp %st, %st(1)
117 ; X86-SSE-NEXT:    fsubp %st, %st(1)
118 ; X86-SSE-NEXT:    retl
120 ; X86-AVX-LABEL: complex_canonicalize_fmul_x86_fp80:
121 ; X86-AVX:       # %bb.0: # %entry
122 ; X86-AVX-NEXT:    fldt {{[0-9]+}}(%esp)
123 ; X86-AVX-NEXT:    fldt {{[0-9]+}}(%esp)
124 ; X86-AVX-NEXT:    fsub %st(1), %st
125 ; X86-AVX-NEXT:    fld %st(0)
126 ; X86-AVX-NEXT:    fadd %st(2), %st
127 ; X86-AVX-NEXT:    fsubp %st, %st(1)
128 ; X86-AVX-NEXT:    fld1
129 ; X86-AVX-NEXT:    fmulp %st, %st(1)
130 ; X86-AVX-NEXT:    fsubp %st, %st(1)
131 ; X86-AVX-NEXT:    retl
133 ; SSE-LABEL: complex_canonicalize_fmul_x86_fp80:
134 ; SSE:       # %bb.0: # %entry
135 ; SSE-NEXT:    fldt {{[0-9]+}}(%rsp)
136 ; SSE-NEXT:    fldt {{[0-9]+}}(%rsp)
137 ; SSE-NEXT:    fsub %st(1), %st
138 ; SSE-NEXT:    fld %st(0)
139 ; SSE-NEXT:    fadd %st(2), %st
140 ; SSE-NEXT:    fsubp %st, %st(1)
141 ; SSE-NEXT:    fld1
142 ; SSE-NEXT:    fmulp %st, %st(1)
143 ; SSE-NEXT:    fsubp %st, %st(1)
144 ; SSE-NEXT:    retq
146 ; AVX-LABEL: complex_canonicalize_fmul_x86_fp80:
147 ; AVX:       # %bb.0: # %entry
148 ; AVX-NEXT:    fldt {{[0-9]+}}(%rsp)
149 ; AVX-NEXT:    fldt {{[0-9]+}}(%rsp)
150 ; AVX-NEXT:    fsub %st(1), %st
151 ; AVX-NEXT:    fld %st(0)
152 ; AVX-NEXT:    fadd %st(2), %st
153 ; AVX-NEXT:    fsubp %st, %st(1)
154 ; AVX-NEXT:    fld1
155 ; AVX-NEXT:    fmulp %st, %st(1)
156 ; AVX-NEXT:    fsubp %st, %st(1)
157 ; AVX-NEXT:    retq
158 entry:
159   %mul1 = fsub x86_fp80 %a, %b
160   %add = fadd x86_fp80 %mul1, %b
161   %mul2 = fsub x86_fp80 %add, %mul1
162   %canonicalized = call x86_fp80 @llvm.canonicalize.f80(x86_fp80 %mul2)
163   %result = fsub x86_fp80 %canonicalized, %b
164   ret x86_fp80 %result
167 define double @canonicalize_fp64(double %a, double %b) unnamed_addr #0 {
168 ; X87-LABEL: canonicalize_fp64:
169 ; X87:       # %bb.0: # %start
170 ; X87-NEXT:    fldl {{[0-9]+}}(%esp)
171 ; X87-NEXT:    fldl {{[0-9]+}}(%esp)
172 ; X87-NEXT:    fucom %st(1)
173 ; X87-NEXT:    fnstsw %ax
174 ; X87-NEXT:    # kill: def $ah killed $ah killed $ax
175 ; X87-NEXT:    sahf
176 ; X87-NEXT:    fxch %st(1)
177 ; X87-NEXT:    fucom %st(0)
178 ; X87-NEXT:    fnstsw %ax
179 ; X87-NEXT:    fld %st(1)
180 ; X87-NEXT:    ja .LBB3_2
181 ; X87-NEXT:  # %bb.1: # %start
182 ; X87-NEXT:    fstp %st(0)
183 ; X87-NEXT:    fldz
184 ; X87-NEXT:    fxch %st(1)
185 ; X87-NEXT:  .LBB3_2: # %start
186 ; X87-NEXT:    fstp %st(1)
187 ; X87-NEXT:    # kill: def $ah killed $ah killed $ax
188 ; X87-NEXT:    sahf
189 ; X87-NEXT:    jp .LBB3_4
190 ; X87-NEXT:  # %bb.3: # %start
191 ; X87-NEXT:    fstp %st(1)
192 ; X87-NEXT:    fldz
193 ; X87-NEXT:  .LBB3_4: # %start
194 ; X87-NEXT:    fstp %st(0)
195 ; X87-NEXT:    fld1
196 ; X87-NEXT:    fmulp %st, %st(1)
197 ; X87-NEXT:    retl
199 ; X86-SSE-LABEL: canonicalize_fp64:
200 ; X86-SSE:       # %bb.0: # %start
201 ; X86-SSE-NEXT:    pushl %ebp
202 ; X86-SSE-NEXT:    .cfi_def_cfa_offset 8
203 ; X86-SSE-NEXT:    .cfi_offset %ebp, -8
204 ; X86-SSE-NEXT:    movl %esp, %ebp
205 ; X86-SSE-NEXT:    .cfi_def_cfa_register %ebp
206 ; X86-SSE-NEXT:    andl $-8, %esp
207 ; X86-SSE-NEXT:    subl $8, %esp
208 ; X86-SSE-NEXT:    movsd {{.*#+}} xmm0 = mem[0],zero
209 ; X86-SSE-NEXT:    movsd {{.*#+}} xmm1 = mem[0],zero
210 ; X86-SSE-NEXT:    movapd %xmm0, %xmm2
211 ; X86-SSE-NEXT:    cmpunordsd %xmm0, %xmm2
212 ; X86-SSE-NEXT:    movapd %xmm2, %xmm3
213 ; X86-SSE-NEXT:    andpd %xmm1, %xmm3
214 ; X86-SSE-NEXT:    maxsd %xmm0, %xmm1
215 ; X86-SSE-NEXT:    andnpd %xmm1, %xmm2
216 ; X86-SSE-NEXT:    orpd %xmm3, %xmm2
217 ; X86-SSE-NEXT:    mulsd {{\.?LCPI[0-9]+_[0-9]+}}, %xmm2
218 ; X86-SSE-NEXT:    movsd %xmm2, (%esp)
219 ; X86-SSE-NEXT:    fldl (%esp)
220 ; X86-SSE-NEXT:    movl %ebp, %esp
221 ; X86-SSE-NEXT:    popl %ebp
222 ; X86-SSE-NEXT:    .cfi_def_cfa %esp, 4
223 ; X86-SSE-NEXT:    retl
225 ; X86-AVX-LABEL: canonicalize_fp64:
226 ; X86-AVX:       # %bb.0: # %start
227 ; X86-AVX-NEXT:    pushl %ebp
228 ; X86-AVX-NEXT:    .cfi_def_cfa_offset 8
229 ; X86-AVX-NEXT:    .cfi_offset %ebp, -8
230 ; X86-AVX-NEXT:    movl %esp, %ebp
231 ; X86-AVX-NEXT:    .cfi_def_cfa_register %ebp
232 ; X86-AVX-NEXT:    andl $-8, %esp
233 ; X86-AVX-NEXT:    subl $8, %esp
234 ; X86-AVX-NEXT:    vmovsd {{.*#+}} xmm0 = mem[0],zero
235 ; X86-AVX-NEXT:    vmovsd {{.*#+}} xmm1 = mem[0],zero
236 ; X86-AVX-NEXT:    vmaxsd %xmm0, %xmm1, %xmm2
237 ; X86-AVX-NEXT:    vcmpunordsd %xmm0, %xmm0, %xmm0
238 ; X86-AVX-NEXT:    vblendvpd %xmm0, %xmm1, %xmm2, %xmm0
239 ; X86-AVX-NEXT:    vmulsd {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0, %xmm0
240 ; X86-AVX-NEXT:    vmovsd %xmm0, (%esp)
241 ; X86-AVX-NEXT:    fldl (%esp)
242 ; X86-AVX-NEXT:    movl %ebp, %esp
243 ; X86-AVX-NEXT:    popl %ebp
244 ; X86-AVX-NEXT:    .cfi_def_cfa %esp, 4
245 ; X86-AVX-NEXT:    retl
247 ; SSE-LABEL: canonicalize_fp64:
248 ; SSE:       # %bb.0: # %start
249 ; SSE-NEXT:    movapd %xmm0, %xmm2
250 ; SSE-NEXT:    cmpunordsd %xmm0, %xmm2
251 ; SSE-NEXT:    movapd %xmm2, %xmm3
252 ; SSE-NEXT:    andpd %xmm1, %xmm3
253 ; SSE-NEXT:    maxsd %xmm0, %xmm1
254 ; SSE-NEXT:    andnpd %xmm1, %xmm2
255 ; SSE-NEXT:    orpd %xmm3, %xmm2
256 ; SSE-NEXT:    mulsd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm2
257 ; SSE-NEXT:    movapd %xmm2, %xmm0
258 ; SSE-NEXT:    retq
260 ; AVX1-LABEL: canonicalize_fp64:
261 ; AVX1:       # %bb.0: # %start
262 ; AVX1-NEXT:    vmaxsd %xmm0, %xmm1, %xmm2
263 ; AVX1-NEXT:    vcmpunordsd %xmm0, %xmm0, %xmm0
264 ; AVX1-NEXT:    vblendvpd %xmm0, %xmm1, %xmm2, %xmm0
265 ; AVX1-NEXT:    vmulsd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0
266 ; AVX1-NEXT:    retq
268 ; AVX2-LABEL: canonicalize_fp64:
269 ; AVX2:       # %bb.0: # %start
270 ; AVX2-NEXT:    vmaxsd %xmm0, %xmm1, %xmm2
271 ; AVX2-NEXT:    vcmpunordsd %xmm0, %xmm0, %xmm0
272 ; AVX2-NEXT:    vblendvpd %xmm0, %xmm1, %xmm2, %xmm0
273 ; AVX2-NEXT:    vmulsd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0
274 ; AVX2-NEXT:    retq
276 ; AVX512F-LABEL: canonicalize_fp64:
277 ; AVX512F:       # %bb.0: # %start
278 ; AVX512F-NEXT:    vmaxsd %xmm0, %xmm1, %xmm2
279 ; AVX512F-NEXT:    vcmpunordsd %xmm0, %xmm0, %k1
280 ; AVX512F-NEXT:    vmovsd %xmm1, %xmm2, %xmm2 {%k1}
281 ; AVX512F-NEXT:    vmulsd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm2, %xmm0
282 ; AVX512F-NEXT:    retq
283 start:
284   %c = fcmp olt double %a, %b
285   %d = fcmp uno double %a, 0.000000e+00
286   %or.cond.i.i = or i1 %d, %c
287   %e = select i1 %or.cond.i.i, double %b, double %a
288   %f = tail call double @llvm.canonicalize.f64(double %e) #2
289   ret double %f
292 define float @canonicalize_fp32(float %aa, float %bb) unnamed_addr #0 {
293 ; X87-LABEL: canonicalize_fp32:
294 ; X87:       # %bb.0: # %start
295 ; X87-NEXT:    flds {{[0-9]+}}(%esp)
296 ; X87-NEXT:    flds {{[0-9]+}}(%esp)
297 ; X87-NEXT:    fucom %st(1)
298 ; X87-NEXT:    fnstsw %ax
299 ; X87-NEXT:    # kill: def $ah killed $ah killed $ax
300 ; X87-NEXT:    sahf
301 ; X87-NEXT:    fxch %st(1)
302 ; X87-NEXT:    fucom %st(0)
303 ; X87-NEXT:    fnstsw %ax
304 ; X87-NEXT:    fld %st(1)
305 ; X87-NEXT:    ja .LBB4_2
306 ; X87-NEXT:  # %bb.1: # %start
307 ; X87-NEXT:    fstp %st(0)
308 ; X87-NEXT:    fldz
309 ; X87-NEXT:    fxch %st(1)
310 ; X87-NEXT:  .LBB4_2: # %start
311 ; X87-NEXT:    fstp %st(1)
312 ; X87-NEXT:    # kill: def $ah killed $ah killed $ax
313 ; X87-NEXT:    sahf
314 ; X87-NEXT:    jp .LBB4_4
315 ; X87-NEXT:  # %bb.3: # %start
316 ; X87-NEXT:    fstp %st(1)
317 ; X87-NEXT:    fldz
318 ; X87-NEXT:  .LBB4_4: # %start
319 ; X87-NEXT:    fstp %st(0)
320 ; X87-NEXT:    fld1
321 ; X87-NEXT:    fmulp %st, %st(1)
322 ; X87-NEXT:    retl
324 ; X86-SSE-LABEL: canonicalize_fp32:
325 ; X86-SSE:       # %bb.0: # %start
326 ; X86-SSE-NEXT:    pushl %eax
327 ; X86-SSE-NEXT:    .cfi_def_cfa_offset 8
328 ; X86-SSE-NEXT:    movss {{.*#+}} xmm0 = mem[0],zero,zero,zero
329 ; X86-SSE-NEXT:    movss {{.*#+}} xmm1 = mem[0],zero,zero,zero
330 ; X86-SSE-NEXT:    movaps %xmm0, %xmm2
331 ; X86-SSE-NEXT:    cmpunordss %xmm0, %xmm2
332 ; X86-SSE-NEXT:    movaps %xmm2, %xmm3
333 ; X86-SSE-NEXT:    andps %xmm1, %xmm3
334 ; X86-SSE-NEXT:    maxss %xmm0, %xmm1
335 ; X86-SSE-NEXT:    andnps %xmm1, %xmm2
336 ; X86-SSE-NEXT:    orps %xmm3, %xmm2
337 ; X86-SSE-NEXT:    mulss {{\.?LCPI[0-9]+_[0-9]+}}, %xmm2
338 ; X86-SSE-NEXT:    movss %xmm2, (%esp)
339 ; X86-SSE-NEXT:    flds (%esp)
340 ; X86-SSE-NEXT:    popl %eax
341 ; X86-SSE-NEXT:    .cfi_def_cfa_offset 4
342 ; X86-SSE-NEXT:    retl
344 ; X86-AVX-LABEL: canonicalize_fp32:
345 ; X86-AVX:       # %bb.0: # %start
346 ; X86-AVX-NEXT:    pushl %eax
347 ; X86-AVX-NEXT:    .cfi_def_cfa_offset 8
348 ; X86-AVX-NEXT:    vmovss {{.*#+}} xmm0 = mem[0],zero,zero,zero
349 ; X86-AVX-NEXT:    vmovss {{.*#+}} xmm1 = mem[0],zero,zero,zero
350 ; X86-AVX-NEXT:    vmaxss %xmm0, %xmm1, %xmm2
351 ; X86-AVX-NEXT:    vcmpunordss %xmm0, %xmm0, %xmm0
352 ; X86-AVX-NEXT:    vblendvps %xmm0, %xmm1, %xmm2, %xmm0
353 ; X86-AVX-NEXT:    vmulss {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0, %xmm0
354 ; X86-AVX-NEXT:    vmovss %xmm0, (%esp)
355 ; X86-AVX-NEXT:    flds (%esp)
356 ; X86-AVX-NEXT:    popl %eax
357 ; X86-AVX-NEXT:    .cfi_def_cfa_offset 4
358 ; X86-AVX-NEXT:    retl
360 ; SSE-LABEL: canonicalize_fp32:
361 ; SSE:       # %bb.0: # %start
362 ; SSE-NEXT:    movaps %xmm0, %xmm2
363 ; SSE-NEXT:    cmpunordss %xmm0, %xmm2
364 ; SSE-NEXT:    movaps %xmm2, %xmm3
365 ; SSE-NEXT:    andps %xmm1, %xmm3
366 ; SSE-NEXT:    maxss %xmm0, %xmm1
367 ; SSE-NEXT:    andnps %xmm1, %xmm2
368 ; SSE-NEXT:    orps %xmm3, %xmm2
369 ; SSE-NEXT:    mulss {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm2
370 ; SSE-NEXT:    movaps %xmm2, %xmm0
371 ; SSE-NEXT:    retq
373 ; AVX1-LABEL: canonicalize_fp32:
374 ; AVX1:       # %bb.0: # %start
375 ; AVX1-NEXT:    vmaxss %xmm0, %xmm1, %xmm2
376 ; AVX1-NEXT:    vcmpunordss %xmm0, %xmm0, %xmm0
377 ; AVX1-NEXT:    vblendvps %xmm0, %xmm1, %xmm2, %xmm0
378 ; AVX1-NEXT:    vmulss {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0
379 ; AVX1-NEXT:    retq
381 ; AVX2-LABEL: canonicalize_fp32:
382 ; AVX2:       # %bb.0: # %start
383 ; AVX2-NEXT:    vmaxss %xmm0, %xmm1, %xmm2
384 ; AVX2-NEXT:    vcmpunordss %xmm0, %xmm0, %xmm0
385 ; AVX2-NEXT:    vblendvps %xmm0, %xmm1, %xmm2, %xmm0
386 ; AVX2-NEXT:    vmulss {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0
387 ; AVX2-NEXT:    retq
389 ; AVX512F-LABEL: canonicalize_fp32:
390 ; AVX512F:       # %bb.0: # %start
391 ; AVX512F-NEXT:    vmaxss %xmm0, %xmm1, %xmm2
392 ; AVX512F-NEXT:    vcmpunordss %xmm0, %xmm0, %k1
393 ; AVX512F-NEXT:    vmovss %xmm1, %xmm2, %xmm2 {%k1}
394 ; AVX512F-NEXT:    vmulss {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm2, %xmm0
395 ; AVX512F-NEXT:    retq
396 start:
397   %cc = fcmp olt float %aa, %bb
398   %dd = fcmp uno float %aa, 0.000000e+00
399   %or.cond.i.i.x = or i1 %dd, %cc
400   %ee = select i1 %or.cond.i.i.x, float %bb, float %aa
401   %ff = tail call float @llvm.canonicalize.f32(float %ee) #2
402   ret float %ff
405 define void @v_test_canonicalize_var_f32(float addrspace(1)* %out) #1 {
406 ; X87-LABEL: v_test_canonicalize_var_f32:
407 ; X87:       # %bb.0:
408 ; X87-NEXT:    movl {{[0-9]+}}(%esp), %eax
409 ; X87-NEXT:    fld1
410 ; X87-NEXT:    fmuls (%eax)
411 ; X87-NEXT:    fstps (%eax)
412 ; X87-NEXT:    retl
414 ; X86-SSE-LABEL: v_test_canonicalize_var_f32:
415 ; X86-SSE:       # %bb.0:
416 ; X86-SSE-NEXT:    movl {{[0-9]+}}(%esp), %eax
417 ; X86-SSE-NEXT:    movss {{.*#+}} xmm0 = mem[0],zero,zero,zero
418 ; X86-SSE-NEXT:    mulss {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0
419 ; X86-SSE-NEXT:    movss %xmm0, (%eax)
420 ; X86-SSE-NEXT:    retl
422 ; X86-AVX-LABEL: v_test_canonicalize_var_f32:
423 ; X86-AVX:       # %bb.0:
424 ; X86-AVX-NEXT:    movl {{[0-9]+}}(%esp), %eax
425 ; X86-AVX-NEXT:    vmovss {{.*#+}} xmm0 = mem[0],zero,zero,zero
426 ; X86-AVX-NEXT:    vmulss {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0, %xmm0
427 ; X86-AVX-NEXT:    vmovss %xmm0, (%eax)
428 ; X86-AVX-NEXT:    retl
430 ; SSE-LABEL: v_test_canonicalize_var_f32:
431 ; SSE:       # %bb.0:
432 ; SSE-NEXT:    movss {{.*#+}} xmm0 = mem[0],zero,zero,zero
433 ; SSE-NEXT:    mulss {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
434 ; SSE-NEXT:    movss %xmm0, (%rdi)
435 ; SSE-NEXT:    retq
437 ; AVX-LABEL: v_test_canonicalize_var_f32:
438 ; AVX:       # %bb.0:
439 ; AVX-NEXT:    vmovss {{.*#+}} xmm0 = mem[0],zero,zero,zero
440 ; AVX-NEXT:    vmulss {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0
441 ; AVX-NEXT:    vmovss %xmm0, (%rdi)
442 ; AVX-NEXT:    retq
443   %val = load float, float addrspace(1)* %out
444   %canonicalized = call float @llvm.canonicalize.f32(float %val)
445   store float %canonicalized, float addrspace(1)* %out
446   ret void
449 define void @v_test_canonicalize_x86_fp80(x86_fp80 addrspace(1)* %out) #1 {
450 ; X87-LABEL: v_test_canonicalize_x86_fp80:
451 ; X87:       # %bb.0:
452 ; X87-NEXT:    movl {{[0-9]+}}(%esp), %eax
453 ; X87-NEXT:    fldt (%eax)
454 ; X87-NEXT:    fld1
455 ; X87-NEXT:    fmulp %st, %st(1)
456 ; X87-NEXT:    fstpt (%eax)
457 ; X87-NEXT:    retl
459 ; X86-SSE-LABEL: v_test_canonicalize_x86_fp80:
460 ; X86-SSE:       # %bb.0:
461 ; X86-SSE-NEXT:    movl {{[0-9]+}}(%esp), %eax
462 ; X86-SSE-NEXT:    fldt (%eax)
463 ; X86-SSE-NEXT:    fld1
464 ; X86-SSE-NEXT:    fmulp %st, %st(1)
465 ; X86-SSE-NEXT:    fstpt (%eax)
466 ; X86-SSE-NEXT:    retl
468 ; X86-AVX-LABEL: v_test_canonicalize_x86_fp80:
469 ; X86-AVX:       # %bb.0:
470 ; X86-AVX-NEXT:    movl {{[0-9]+}}(%esp), %eax
471 ; X86-AVX-NEXT:    fldt (%eax)
472 ; X86-AVX-NEXT:    fld1
473 ; X86-AVX-NEXT:    fmulp %st, %st(1)
474 ; X86-AVX-NEXT:    fstpt (%eax)
475 ; X86-AVX-NEXT:    retl
477 ; SSE-LABEL: v_test_canonicalize_x86_fp80:
478 ; SSE:       # %bb.0:
479 ; SSE-NEXT:    fldt (%rdi)
480 ; SSE-NEXT:    fld1
481 ; SSE-NEXT:    fmulp %st, %st(1)
482 ; SSE-NEXT:    fstpt (%rdi)
483 ; SSE-NEXT:    retq
485 ; AVX-LABEL: v_test_canonicalize_x86_fp80:
486 ; AVX:       # %bb.0:
487 ; AVX-NEXT:    fldt (%rdi)
488 ; AVX-NEXT:    fld1
489 ; AVX-NEXT:    fmulp %st, %st(1)
490 ; AVX-NEXT:    fstpt (%rdi)
491 ; AVX-NEXT:    retq
492   %val = load x86_fp80, x86_fp80 addrspace(1)* %out
493   %canonicalized = call x86_fp80 @llvm.canonicalize.f80(x86_fp80 %val)
494   store x86_fp80 %canonicalized, x86_fp80 addrspace(1)* %out
495   ret void
498 define void @v_test_canonicalize_var_f64(double addrspace(1)* %out) #1 {
499 ; X87-LABEL: v_test_canonicalize_var_f64:
500 ; X87:       # %bb.0:
501 ; X87-NEXT:    movl {{[0-9]+}}(%esp), %eax
502 ; X87-NEXT:    fld1
503 ; X87-NEXT:    fmull (%eax)
504 ; X87-NEXT:    fstpl (%eax)
505 ; X87-NEXT:    retl
507 ; X86-SSE-LABEL: v_test_canonicalize_var_f64:
508 ; X86-SSE:       # %bb.0:
509 ; X86-SSE-NEXT:    movl {{[0-9]+}}(%esp), %eax
510 ; X86-SSE-NEXT:    movsd {{.*#+}} xmm0 = mem[0],zero
511 ; X86-SSE-NEXT:    mulsd {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0
512 ; X86-SSE-NEXT:    movsd %xmm0, (%eax)
513 ; X86-SSE-NEXT:    retl
515 ; X86-AVX-LABEL: v_test_canonicalize_var_f64:
516 ; X86-AVX:       # %bb.0:
517 ; X86-AVX-NEXT:    movl {{[0-9]+}}(%esp), %eax
518 ; X86-AVX-NEXT:    vmovsd {{.*#+}} xmm0 = mem[0],zero
519 ; X86-AVX-NEXT:    vmulsd {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0, %xmm0
520 ; X86-AVX-NEXT:    vmovsd %xmm0, (%eax)
521 ; X86-AVX-NEXT:    retl
523 ; SSE-LABEL: v_test_canonicalize_var_f64:
524 ; SSE:       # %bb.0:
525 ; SSE-NEXT:    movsd {{.*#+}} xmm0 = mem[0],zero
526 ; SSE-NEXT:    mulsd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
527 ; SSE-NEXT:    movsd %xmm0, (%rdi)
528 ; SSE-NEXT:    retq
530 ; AVX-LABEL: v_test_canonicalize_var_f64:
531 ; AVX:       # %bb.0:
532 ; AVX-NEXT:    vmovsd {{.*#+}} xmm0 = mem[0],zero
533 ; AVX-NEXT:    vmulsd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0
534 ; AVX-NEXT:    vmovsd %xmm0, (%rdi)
535 ; AVX-NEXT:    retq
536   %val = load double, double addrspace(1)* %out
537   %canonicalized = call double @llvm.canonicalize.f64(double %val)
538   store double %canonicalized, double addrspace(1)* %out
539   ret void
542 define void @canonicalize_undef(double addrspace(1)* %out) {
543 ; X87-LABEL: canonicalize_undef:
544 ; X87:       # %bb.0:
545 ; X87-NEXT:    movl {{[0-9]+}}(%esp), %eax
546 ; X87-NEXT:    movl $2146959360, 4(%eax) # imm = 0x7FF80000
547 ; X87-NEXT:    movl $0, (%eax)
548 ; X87-NEXT:    retl
550 ; X86-SSE-LABEL: canonicalize_undef:
551 ; X86-SSE:       # %bb.0:
552 ; X86-SSE-NEXT:    movl {{[0-9]+}}(%esp), %eax
553 ; X86-SSE-NEXT:    movl $2146959360, 4(%eax) # imm = 0x7FF80000
554 ; X86-SSE-NEXT:    movl $0, (%eax)
555 ; X86-SSE-NEXT:    retl
557 ; X86-AVX-LABEL: canonicalize_undef:
558 ; X86-AVX:       # %bb.0:
559 ; X86-AVX-NEXT:    movl {{[0-9]+}}(%esp), %eax
560 ; X86-AVX-NEXT:    movl $2146959360, 4(%eax) # imm = 0x7FF80000
561 ; X86-AVX-NEXT:    movl $0, (%eax)
562 ; X86-AVX-NEXT:    retl
564 ; SSE-LABEL: canonicalize_undef:
565 ; SSE:       # %bb.0:
566 ; SSE-NEXT:    movabsq $9221120237041090560, %rax # imm = 0x7FF8000000000000
567 ; SSE-NEXT:    movq %rax, (%rdi)
568 ; SSE-NEXT:    retq
570 ; AVX-LABEL: canonicalize_undef:
571 ; AVX:       # %bb.0:
572 ; AVX-NEXT:    movabsq $9221120237041090560, %rax # imm = 0x7FF8000000000000
573 ; AVX-NEXT:    movq %rax, (%rdi)
574 ; AVX-NEXT:    retq
575   %canonicalized = call double @llvm.canonicalize.f64(double undef)
576   store double %canonicalized, double addrspace(1)* %out
577   ret void
580 define <4 x float> @canon_fp32_varargsv4f32(<4 x float> %a) {
581 ; X87-LABEL: canon_fp32_varargsv4f32:
582 ; X87:       # %bb.0:
583 ; X87-NEXT:    movl {{[0-9]+}}(%esp), %eax
584 ; X87-NEXT:    fld1
585 ; X87-NEXT:    fld %st(0)
586 ; X87-NEXT:    fmuls {{[0-9]+}}(%esp)
587 ; X87-NEXT:    fld %st(1)
588 ; X87-NEXT:    fmuls {{[0-9]+}}(%esp)
589 ; X87-NEXT:    fld %st(2)
590 ; X87-NEXT:    fmuls {{[0-9]+}}(%esp)
591 ; X87-NEXT:    fxch %st(3)
592 ; X87-NEXT:    fmuls {{[0-9]+}}(%esp)
593 ; X87-NEXT:    fstps 12(%eax)
594 ; X87-NEXT:    fxch %st(2)
595 ; X87-NEXT:    fstps 8(%eax)
596 ; X87-NEXT:    fxch %st(1)
597 ; X87-NEXT:    fstps 4(%eax)
598 ; X87-NEXT:    fstps (%eax)
599 ; X87-NEXT:    retl $4
601 ; X86-SSE-LABEL: canon_fp32_varargsv4f32:
602 ; X86-SSE:       # %bb.0:
603 ; X86-SSE-NEXT:    mulps {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0
604 ; X86-SSE-NEXT:    retl
606 ; X86-AVX-LABEL: canon_fp32_varargsv4f32:
607 ; X86-AVX:       # %bb.0:
608 ; X86-AVX-NEXT:    vmulps {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0, %xmm0
609 ; X86-AVX-NEXT:    retl
611 ; SSE-LABEL: canon_fp32_varargsv4f32:
612 ; SSE:       # %bb.0:
613 ; SSE-NEXT:    mulps {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
614 ; SSE-NEXT:    retq
616 ; AVX1-LABEL: canon_fp32_varargsv4f32:
617 ; AVX1:       # %bb.0:
618 ; AVX1-NEXT:    vmulps {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0
619 ; AVX1-NEXT:    retq
621 ; AVX2-LABEL: canon_fp32_varargsv4f32:
622 ; AVX2:       # %bb.0:
623 ; AVX2-NEXT:    vbroadcastss {{.*#+}} xmm1 = [1.0E+0,1.0E+0,1.0E+0,1.0E+0]
624 ; AVX2-NEXT:    vmulps %xmm1, %xmm0, %xmm0
625 ; AVX2-NEXT:    retq
627 ; AVX512F-LABEL: canon_fp32_varargsv4f32:
628 ; AVX512F:       # %bb.0:
629 ; AVX512F-NEXT:    vbroadcastss {{.*#+}} xmm1 = [1.0E+0,1.0E+0,1.0E+0,1.0E+0]
630 ; AVX512F-NEXT:    vmulps %xmm1, %xmm0, %xmm0
631 ; AVX512F-NEXT:    retq
632   %canonicalized = call <4 x float> @llvm.canonicalize.v4f32(<4 x float> %a)
633   ret <4 x float> %canonicalized
636 define <4 x double> @canon_fp64_varargsv4f64(<4 x double> %a) {
637 ; X87-LABEL: canon_fp64_varargsv4f64:
638 ; X87:       # %bb.0:
639 ; X87-NEXT:    movl {{[0-9]+}}(%esp), %eax
640 ; X87-NEXT:    fld1
641 ; X87-NEXT:    fld %st(0)
642 ; X87-NEXT:    fmull {{[0-9]+}}(%esp)
643 ; X87-NEXT:    fld %st(1)
644 ; X87-NEXT:    fmull {{[0-9]+}}(%esp)
645 ; X87-NEXT:    fld %st(2)
646 ; X87-NEXT:    fmull {{[0-9]+}}(%esp)
647 ; X87-NEXT:    fxch %st(3)
648 ; X87-NEXT:    fmull {{[0-9]+}}(%esp)
649 ; X87-NEXT:    fstpl 24(%eax)
650 ; X87-NEXT:    fxch %st(2)
651 ; X87-NEXT:    fstpl 16(%eax)
652 ; X87-NEXT:    fxch %st(1)
653 ; X87-NEXT:    fstpl 8(%eax)
654 ; X87-NEXT:    fstpl (%eax)
655 ; X87-NEXT:    retl $4
657 ; X86-SSE-LABEL: canon_fp64_varargsv4f64:
658 ; X86-SSE:       # %bb.0:
659 ; X86-SSE-NEXT:    movapd {{.*#+}} xmm2 = [1.0E+0,1.0E+0]
660 ; X86-SSE-NEXT:    mulpd %xmm2, %xmm0
661 ; X86-SSE-NEXT:    mulpd %xmm2, %xmm1
662 ; X86-SSE-NEXT:    retl
664 ; X86-AVX-LABEL: canon_fp64_varargsv4f64:
665 ; X86-AVX:       # %bb.0:
666 ; X86-AVX-NEXT:    vmulpd {{\.?LCPI[0-9]+_[0-9]+}}, %ymm0, %ymm0
667 ; X86-AVX-NEXT:    retl
669 ; SSE-LABEL: canon_fp64_varargsv4f64:
670 ; SSE:       # %bb.0:
671 ; SSE-NEXT:    movapd {{.*#+}} xmm2 = [1.0E+0,1.0E+0]
672 ; SSE-NEXT:    mulpd %xmm2, %xmm0
673 ; SSE-NEXT:    mulpd %xmm2, %xmm1
674 ; SSE-NEXT:    retq
676 ; AVX1-LABEL: canon_fp64_varargsv4f64:
677 ; AVX1:       # %bb.0:
678 ; AVX1-NEXT:    vmulpd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm0
679 ; AVX1-NEXT:    retq
681 ; AVX2-LABEL: canon_fp64_varargsv4f64:
682 ; AVX2:       # %bb.0:
683 ; AVX2-NEXT:    vbroadcastsd {{.*#+}} ymm1 = [1.0E+0,1.0E+0,1.0E+0,1.0E+0]
684 ; AVX2-NEXT:    vmulpd %ymm1, %ymm0, %ymm0
685 ; AVX2-NEXT:    retq
687 ; AVX512F-LABEL: canon_fp64_varargsv4f64:
688 ; AVX512F:       # %bb.0:
689 ; AVX512F-NEXT:    vbroadcastsd {{.*#+}} ymm1 = [1.0E+0,1.0E+0,1.0E+0,1.0E+0]
690 ; AVX512F-NEXT:    vmulpd %ymm1, %ymm0, %ymm0
691 ; AVX512F-NEXT:    retq
692   %canonicalized = call <4 x double> @llvm.canonicalize.v4f32(<4 x double> %a)
693   ret <4 x double> %canonicalized
696 define <2 x x86_fp80> @canon_fp80_varargsv2fp80(<2 x x86_fp80> %a) {
697 ; X87-LABEL: canon_fp80_varargsv2fp80:
698 ; X87:       # %bb.0:
699 ; X87-NEXT:    fldt {{[0-9]+}}(%esp)
700 ; X87-NEXT:    fldt {{[0-9]+}}(%esp)
701 ; X87-NEXT:    fld1
702 ; X87-NEXT:    fmul %st, %st(1)
703 ; X87-NEXT:    fmulp %st, %st(2)
704 ; X87-NEXT:    fxch %st(1)
705 ; X87-NEXT:    retl
707 ; X86-SSE-LABEL: canon_fp80_varargsv2fp80:
708 ; X86-SSE:       # %bb.0:
709 ; X86-SSE-NEXT:    fldt {{[0-9]+}}(%esp)
710 ; X86-SSE-NEXT:    fldt {{[0-9]+}}(%esp)
711 ; X86-SSE-NEXT:    fld1
712 ; X86-SSE-NEXT:    fmul %st, %st(1)
713 ; X86-SSE-NEXT:    fmulp %st, %st(2)
714 ; X86-SSE-NEXT:    fxch %st(1)
715 ; X86-SSE-NEXT:    retl
717 ; X86-AVX-LABEL: canon_fp80_varargsv2fp80:
718 ; X86-AVX:       # %bb.0:
719 ; X86-AVX-NEXT:    fldt {{[0-9]+}}(%esp)
720 ; X86-AVX-NEXT:    fldt {{[0-9]+}}(%esp)
721 ; X86-AVX-NEXT:    fld1
722 ; X86-AVX-NEXT:    fmul %st, %st(1)
723 ; X86-AVX-NEXT:    fmulp %st, %st(2)
724 ; X86-AVX-NEXT:    fxch %st(1)
725 ; X86-AVX-NEXT:    retl
727 ; SSE-LABEL: canon_fp80_varargsv2fp80:
728 ; SSE:       # %bb.0:
729 ; SSE-NEXT:    fldt {{[0-9]+}}(%rsp)
730 ; SSE-NEXT:    fldt {{[0-9]+}}(%rsp)
731 ; SSE-NEXT:    fld1
732 ; SSE-NEXT:    fmul %st, %st(1)
733 ; SSE-NEXT:    fmulp %st, %st(2)
734 ; SSE-NEXT:    fxch %st(1)
735 ; SSE-NEXT:    retq
737 ; AVX-LABEL: canon_fp80_varargsv2fp80:
738 ; AVX:       # %bb.0:
739 ; AVX-NEXT:    fldt {{[0-9]+}}(%rsp)
740 ; AVX-NEXT:    fldt {{[0-9]+}}(%rsp)
741 ; AVX-NEXT:    fld1
742 ; AVX-NEXT:    fmul %st, %st(1)
743 ; AVX-NEXT:    fmulp %st, %st(2)
744 ; AVX-NEXT:    fxch %st(1)
745 ; AVX-NEXT:    retq
746   %canonicalized = call <2 x x86_fp80> @llvm.canonicalize.v2f80(<2 x x86_fp80> %a)
747   ret <2 x x86_fp80> %canonicalized
750 define void @vec_canonicalize_var_v4f32(<4 x float> addrspace(1)* %out) #1 {
751 ; X87-LABEL: vec_canonicalize_var_v4f32:
752 ; X87:       # %bb.0:
753 ; X87-NEXT:    movl {{[0-9]+}}(%esp), %eax
754 ; X87-NEXT:    fld1
755 ; X87-NEXT:    fld %st(0)
756 ; X87-NEXT:    fmuls (%eax)
757 ; X87-NEXT:    fld %st(1)
758 ; X87-NEXT:    fmuls 4(%eax)
759 ; X87-NEXT:    fld %st(2)
760 ; X87-NEXT:    fmuls 8(%eax)
761 ; X87-NEXT:    fxch %st(3)
762 ; X87-NEXT:    fmuls 12(%eax)
763 ; X87-NEXT:    fstps 12(%eax)
764 ; X87-NEXT:    fxch %st(2)
765 ; X87-NEXT:    fstps 8(%eax)
766 ; X87-NEXT:    fxch %st(1)
767 ; X87-NEXT:    fstps 4(%eax)
768 ; X87-NEXT:    fstps (%eax)
769 ; X87-NEXT:    retl
771 ; X86-SSE-LABEL: vec_canonicalize_var_v4f32:
772 ; X86-SSE:       # %bb.0:
773 ; X86-SSE-NEXT:    movl {{[0-9]+}}(%esp), %eax
774 ; X86-SSE-NEXT:    movaps (%eax), %xmm0
775 ; X86-SSE-NEXT:    mulps {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0
776 ; X86-SSE-NEXT:    movaps %xmm0, (%eax)
777 ; X86-SSE-NEXT:    retl
779 ; X86-AVX-LABEL: vec_canonicalize_var_v4f32:
780 ; X86-AVX:       # %bb.0:
781 ; X86-AVX-NEXT:    movl {{[0-9]+}}(%esp), %eax
782 ; X86-AVX-NEXT:    vmovaps (%eax), %xmm0
783 ; X86-AVX-NEXT:    vmulps {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0, %xmm0
784 ; X86-AVX-NEXT:    vmovaps %xmm0, (%eax)
785 ; X86-AVX-NEXT:    retl
787 ; SSE-LABEL: vec_canonicalize_var_v4f32:
788 ; SSE:       # %bb.0:
789 ; SSE-NEXT:    movaps (%rdi), %xmm0
790 ; SSE-NEXT:    mulps {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
791 ; SSE-NEXT:    movaps %xmm0, (%rdi)
792 ; SSE-NEXT:    retq
794 ; AVX1-LABEL: vec_canonicalize_var_v4f32:
795 ; AVX1:       # %bb.0:
796 ; AVX1-NEXT:    vmovaps (%rdi), %xmm0
797 ; AVX1-NEXT:    vmulps {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0
798 ; AVX1-NEXT:    vmovaps %xmm0, (%rdi)
799 ; AVX1-NEXT:    retq
801 ; AVX2-LABEL: vec_canonicalize_var_v4f32:
802 ; AVX2:       # %bb.0:
803 ; AVX2-NEXT:    vbroadcastss {{.*#+}} xmm0 = [1.0E+0,1.0E+0,1.0E+0,1.0E+0]
804 ; AVX2-NEXT:    vmulps (%rdi), %xmm0, %xmm0
805 ; AVX2-NEXT:    vmovaps %xmm0, (%rdi)
806 ; AVX2-NEXT:    retq
808 ; AVX512F-LABEL: vec_canonicalize_var_v4f32:
809 ; AVX512F:       # %bb.0:
810 ; AVX512F-NEXT:    vbroadcastss {{.*#+}} xmm0 = [1.0E+0,1.0E+0,1.0E+0,1.0E+0]
811 ; AVX512F-NEXT:    vmulps (%rdi), %xmm0, %xmm0
812 ; AVX512F-NEXT:    vmovaps %xmm0, (%rdi)
813 ; AVX512F-NEXT:    retq
814   %val = load <4 x float>, <4 x float> addrspace(1)* %out
815   %canonicalized = call <4 x float> @llvm.canonicalize.v4f32(<4 x float> %val)
816   store <4 x float> %canonicalized, <4 x float> addrspace(1)* %out
817   ret void
820 define void @vec_canonicalize_var_v4f64(<4 x double> addrspace(1)* %out) #1 {
821 ; X87-LABEL: vec_canonicalize_var_v4f64:
822 ; X87:       # %bb.0:
823 ; X87-NEXT:    movl {{[0-9]+}}(%esp), %eax
824 ; X87-NEXT:    fld1
825 ; X87-NEXT:    fld %st(0)
826 ; X87-NEXT:    fmull (%eax)
827 ; X87-NEXT:    fld %st(1)
828 ; X87-NEXT:    fmull 8(%eax)
829 ; X87-NEXT:    fld %st(2)
830 ; X87-NEXT:    fmull 16(%eax)
831 ; X87-NEXT:    fxch %st(3)
832 ; X87-NEXT:    fmull 24(%eax)
833 ; X87-NEXT:    fstpl 24(%eax)
834 ; X87-NEXT:    fxch %st(2)
835 ; X87-NEXT:    fstpl 16(%eax)
836 ; X87-NEXT:    fxch %st(1)
837 ; X87-NEXT:    fstpl 8(%eax)
838 ; X87-NEXT:    fstpl (%eax)
839 ; X87-NEXT:    retl
841 ; X86-SSE-LABEL: vec_canonicalize_var_v4f64:
842 ; X86-SSE:       # %bb.0:
843 ; X86-SSE-NEXT:    movl {{[0-9]+}}(%esp), %eax
844 ; X86-SSE-NEXT:    movapd {{.*#+}} xmm0 = [1.0E+0,1.0E+0]
845 ; X86-SSE-NEXT:    movapd 16(%eax), %xmm1
846 ; X86-SSE-NEXT:    mulpd %xmm0, %xmm1
847 ; X86-SSE-NEXT:    mulpd (%eax), %xmm0
848 ; X86-SSE-NEXT:    movapd %xmm0, (%eax)
849 ; X86-SSE-NEXT:    movapd %xmm1, 16(%eax)
850 ; X86-SSE-NEXT:    retl
852 ; X86-AVX-LABEL: vec_canonicalize_var_v4f64:
853 ; X86-AVX:       # %bb.0:
854 ; X86-AVX-NEXT:    movl {{[0-9]+}}(%esp), %eax
855 ; X86-AVX-NEXT:    vmovapd (%eax), %ymm0
856 ; X86-AVX-NEXT:    vmulpd {{\.?LCPI[0-9]+_[0-9]+}}, %ymm0, %ymm0
857 ; X86-AVX-NEXT:    vmovapd %ymm0, (%eax)
858 ; X86-AVX-NEXT:    vzeroupper
859 ; X86-AVX-NEXT:    retl
861 ; SSE-LABEL: vec_canonicalize_var_v4f64:
862 ; SSE:       # %bb.0:
863 ; SSE-NEXT:    movapd {{.*#+}} xmm0 = [1.0E+0,1.0E+0]
864 ; SSE-NEXT:    movapd 16(%rdi), %xmm1
865 ; SSE-NEXT:    mulpd %xmm0, %xmm1
866 ; SSE-NEXT:    mulpd (%rdi), %xmm0
867 ; SSE-NEXT:    movapd %xmm0, (%rdi)
868 ; SSE-NEXT:    movapd %xmm1, 16(%rdi)
869 ; SSE-NEXT:    retq
871 ; AVX1-LABEL: vec_canonicalize_var_v4f64:
872 ; AVX1:       # %bb.0:
873 ; AVX1-NEXT:    vmovapd (%rdi), %ymm0
874 ; AVX1-NEXT:    vmulpd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm0
875 ; AVX1-NEXT:    vmovapd %ymm0, (%rdi)
876 ; AVX1-NEXT:    vzeroupper
877 ; AVX1-NEXT:    retq
879 ; AVX2-LABEL: vec_canonicalize_var_v4f64:
880 ; AVX2:       # %bb.0:
881 ; AVX2-NEXT:    vbroadcastsd {{.*#+}} ymm0 = [1.0E+0,1.0E+0,1.0E+0,1.0E+0]
882 ; AVX2-NEXT:    vmulpd (%rdi), %ymm0, %ymm0
883 ; AVX2-NEXT:    vmovapd %ymm0, (%rdi)
884 ; AVX2-NEXT:    vzeroupper
885 ; AVX2-NEXT:    retq
887 ; AVX512F-LABEL: vec_canonicalize_var_v4f64:
888 ; AVX512F:       # %bb.0:
889 ; AVX512F-NEXT:    vbroadcastsd {{.*#+}} ymm0 = [1.0E+0,1.0E+0,1.0E+0,1.0E+0]
890 ; AVX512F-NEXT:    vmulpd (%rdi), %ymm0, %ymm0
891 ; AVX512F-NEXT:    vmovapd %ymm0, (%rdi)
892 ; AVX512F-NEXT:    vzeroupper
893 ; AVX512F-NEXT:    retq
894   %val = load <4 x double>, <4 x double> addrspace(1)* %out
895   %canonicalized = call <4 x double> @llvm.canonicalize.v4f32(<4 x double> %val)
896   store <4 x double> %canonicalized, <4 x double> addrspace(1)* %out
897   ret void
900 define void @vec_canonicalize_x86_fp80(<4 x x86_fp80> addrspace(1)* %out) #1 {
901 ; X87-LABEL: vec_canonicalize_x86_fp80:
902 ; X87:       # %bb.0:
903 ; X87-NEXT:    movl {{[0-9]+}}(%esp), %eax
904 ; X87-NEXT:    fldt 30(%eax)
905 ; X87-NEXT:    fldt 20(%eax)
906 ; X87-NEXT:    fldt 10(%eax)
907 ; X87-NEXT:    fldt (%eax)
908 ; X87-NEXT:    fld1
909 ; X87-NEXT:    fmul %st, %st(1)
910 ; X87-NEXT:    fmul %st, %st(2)
911 ; X87-NEXT:    fmul %st, %st(3)
912 ; X87-NEXT:    fmulp %st, %st(4)
913 ; X87-NEXT:    fxch %st(3)
914 ; X87-NEXT:    fstpt 30(%eax)
915 ; X87-NEXT:    fxch %st(1)
916 ; X87-NEXT:    fstpt 20(%eax)
917 ; X87-NEXT:    fstpt 10(%eax)
918 ; X87-NEXT:    fstpt (%eax)
919 ; X87-NEXT:    retl
921 ; X86-SSE-LABEL: vec_canonicalize_x86_fp80:
922 ; X86-SSE:       # %bb.0:
923 ; X86-SSE-NEXT:    movl {{[0-9]+}}(%esp), %eax
924 ; X86-SSE-NEXT:    fldt 30(%eax)
925 ; X86-SSE-NEXT:    fldt 20(%eax)
926 ; X86-SSE-NEXT:    fldt 10(%eax)
927 ; X86-SSE-NEXT:    fldt (%eax)
928 ; X86-SSE-NEXT:    fld1
929 ; X86-SSE-NEXT:    fmul %st, %st(1)
930 ; X86-SSE-NEXT:    fmul %st, %st(2)
931 ; X86-SSE-NEXT:    fmul %st, %st(3)
932 ; X86-SSE-NEXT:    fmulp %st, %st(4)
933 ; X86-SSE-NEXT:    fxch %st(3)
934 ; X86-SSE-NEXT:    fstpt 30(%eax)
935 ; X86-SSE-NEXT:    fxch %st(1)
936 ; X86-SSE-NEXT:    fstpt 20(%eax)
937 ; X86-SSE-NEXT:    fstpt 10(%eax)
938 ; X86-SSE-NEXT:    fstpt (%eax)
939 ; X86-SSE-NEXT:    retl
941 ; X86-AVX-LABEL: vec_canonicalize_x86_fp80:
942 ; X86-AVX:       # %bb.0:
943 ; X86-AVX-NEXT:    movl {{[0-9]+}}(%esp), %eax
944 ; X86-AVX-NEXT:    fldt 30(%eax)
945 ; X86-AVX-NEXT:    fldt 20(%eax)
946 ; X86-AVX-NEXT:    fldt 10(%eax)
947 ; X86-AVX-NEXT:    fldt (%eax)
948 ; X86-AVX-NEXT:    fld1
949 ; X86-AVX-NEXT:    fmul %st, %st(1)
950 ; X86-AVX-NEXT:    fmul %st, %st(2)
951 ; X86-AVX-NEXT:    fmul %st, %st(3)
952 ; X86-AVX-NEXT:    fmulp %st, %st(4)
953 ; X86-AVX-NEXT:    fxch %st(3)
954 ; X86-AVX-NEXT:    fstpt 30(%eax)
955 ; X86-AVX-NEXT:    fxch %st(1)
956 ; X86-AVX-NEXT:    fstpt 20(%eax)
957 ; X86-AVX-NEXT:    fstpt 10(%eax)
958 ; X86-AVX-NEXT:    fstpt (%eax)
959 ; X86-AVX-NEXT:    retl
961 ; SSE-LABEL: vec_canonicalize_x86_fp80:
962 ; SSE:       # %bb.0:
963 ; SSE-NEXT:    fldt 30(%rdi)
964 ; SSE-NEXT:    fldt 20(%rdi)
965 ; SSE-NEXT:    fldt 10(%rdi)
966 ; SSE-NEXT:    fldt (%rdi)
967 ; SSE-NEXT:    fld1
968 ; SSE-NEXT:    fmul %st, %st(1)
969 ; SSE-NEXT:    fmul %st, %st(2)
970 ; SSE-NEXT:    fmul %st, %st(3)
971 ; SSE-NEXT:    fmulp %st, %st(4)
972 ; SSE-NEXT:    fxch %st(3)
973 ; SSE-NEXT:    fstpt 30(%rdi)
974 ; SSE-NEXT:    fxch %st(1)
975 ; SSE-NEXT:    fstpt 20(%rdi)
976 ; SSE-NEXT:    fstpt 10(%rdi)
977 ; SSE-NEXT:    fstpt (%rdi)
978 ; SSE-NEXT:    retq
980 ; AVX-LABEL: vec_canonicalize_x86_fp80:
981 ; AVX:       # %bb.0:
982 ; AVX-NEXT:    fldt 30(%rdi)
983 ; AVX-NEXT:    fldt 20(%rdi)
984 ; AVX-NEXT:    fldt 10(%rdi)
985 ; AVX-NEXT:    fldt (%rdi)
986 ; AVX-NEXT:    fld1
987 ; AVX-NEXT:    fmul %st, %st(1)
988 ; AVX-NEXT:    fmul %st, %st(2)
989 ; AVX-NEXT:    fmul %st, %st(3)
990 ; AVX-NEXT:    fmulp %st, %st(4)
991 ; AVX-NEXT:    fxch %st(3)
992 ; AVX-NEXT:    fstpt 30(%rdi)
993 ; AVX-NEXT:    fxch %st(1)
994 ; AVX-NEXT:    fstpt 20(%rdi)
995 ; AVX-NEXT:    fstpt 10(%rdi)
996 ; AVX-NEXT:    fstpt (%rdi)
997 ; AVX-NEXT:    retq
998   %val = load <4 x x86_fp80>, <4 x x86_fp80> addrspace(1)* %out
999   %canonicalized = call <4 x x86_fp80> @llvm.canonicalize.f80(<4 x x86_fp80> %val)
1000   store <4 x x86_fp80> %canonicalized, <4 x x86_fp80> addrspace(1)* %out
1001   ret void