Run DCE after a LoopFlatten test to reduce spurious output [nfc]
[llvm-project.git] / llvm / test / CodeGen / X86 / fp128-libcalls.ll
blob4e7e6b4d01944f11d2c72c6476615c60a8442276
1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2 ; RUN: llc < %s -O2 -mtriple=x86_64-linux-android \
3 ; RUN:     -enable-legalize-types-checking | FileCheck %s
4 ; RUN: llc < %s -O2 -mtriple=x86_64-linux-gnu \
5 ; RUN:     -enable-legalize-types-checking | FileCheck %s
6 ; RUN: llc < %s -O2 -mtriple=i686-linux-gnu -mattr=sse2 \
7 ; RUN:     -enable-legalize-types-checking | FileCheck %s --check-prefix=X86
9 ; Check all soft floating point library function calls.
11 @vf64 = common dso_local global double 0.000000e+00, align 8
12 @vf128 = common dso_local global fp128 0xL00000000000000000000000000000000, align 16
14 define dso_local void @Test128Add(fp128 %d1, fp128 %d2) nounwind {
15 ; CHECK-LABEL: Test128Add:
16 ; CHECK:       # %bb.0: # %entry
17 ; CHECK-NEXT:    pushq %rax
18 ; CHECK-NEXT:    callq __addtf3@PLT
19 ; CHECK-NEXT:    movaps %xmm0, vf128(%rip)
20 ; CHECK-NEXT:    popq %rax
21 ; CHECK-NEXT:    retq
23 ; X86-LABEL: Test128Add:
24 ; X86:       # %bb.0: # %entry
25 ; X86-NEXT:    subl $40, %esp
26 ; X86-NEXT:    leal {{[0-9]+}}(%esp), %eax
27 ; X86-NEXT:    pushl {{[0-9]+}}(%esp)
28 ; X86-NEXT:    pushl {{[0-9]+}}(%esp)
29 ; X86-NEXT:    pushl {{[0-9]+}}(%esp)
30 ; X86-NEXT:    pushl {{[0-9]+}}(%esp)
31 ; X86-NEXT:    pushl {{[0-9]+}}(%esp)
32 ; X86-NEXT:    pushl {{[0-9]+}}(%esp)
33 ; X86-NEXT:    pushl {{[0-9]+}}(%esp)
34 ; X86-NEXT:    pushl {{[0-9]+}}(%esp)
35 ; X86-NEXT:    pushl %eax
36 ; X86-NEXT:    calll __addtf3
37 ; X86-NEXT:    addl $44, %esp
38 ; X86-NEXT:    movaps (%esp), %xmm0
39 ; X86-NEXT:    movaps %xmm0, vf128
40 ; X86-NEXT:    addl $28, %esp
41 ; X86-NEXT:    retl
42 entry:
43   %add = fadd fp128 %d1, %d2
44   store fp128 %add, ptr @vf128, align 16
45   ret void
48 define dso_local void @Test128_1Add(fp128 %d1) nounwind {
49 ; CHECK-LABEL: Test128_1Add:
50 ; CHECK:       # %bb.0: # %entry
51 ; CHECK-NEXT:    pushq %rax
52 ; CHECK-NEXT:    movaps %xmm0, %xmm1
53 ; CHECK-NEXT:    movaps vf128(%rip), %xmm0
54 ; CHECK-NEXT:    callq __addtf3@PLT
55 ; CHECK-NEXT:    movaps %xmm0, vf128(%rip)
56 ; CHECK-NEXT:    popq %rax
57 ; CHECK-NEXT:    retq
59 ; X86-LABEL: Test128_1Add:
60 ; X86:       # %bb.0: # %entry
61 ; X86-NEXT:    subl $40, %esp
62 ; X86-NEXT:    leal {{[0-9]+}}(%esp), %eax
63 ; X86-NEXT:    pushl {{[0-9]+}}(%esp)
64 ; X86-NEXT:    pushl {{[0-9]+}}(%esp)
65 ; X86-NEXT:    pushl {{[0-9]+}}(%esp)
66 ; X86-NEXT:    pushl {{[0-9]+}}(%esp)
67 ; X86-NEXT:    pushl vf128+12
68 ; X86-NEXT:    pushl vf128+8
69 ; X86-NEXT:    pushl vf128+4
70 ; X86-NEXT:    pushl vf128
71 ; X86-NEXT:    pushl %eax
72 ; X86-NEXT:    calll __addtf3
73 ; X86-NEXT:    addl $44, %esp
74 ; X86-NEXT:    movaps (%esp), %xmm0
75 ; X86-NEXT:    movaps %xmm0, vf128
76 ; X86-NEXT:    addl $28, %esp
77 ; X86-NEXT:    retl
78 entry:
79   %0 = load fp128, ptr @vf128, align 16
80   %add = fadd fp128 %0, %d1
81   store fp128 %add, ptr @vf128, align 16
82   ret void
85 define dso_local void @Test128Sub(fp128 %d1, fp128 %d2) nounwind {
86 ; CHECK-LABEL: Test128Sub:
87 ; CHECK:       # %bb.0: # %entry
88 ; CHECK-NEXT:    pushq %rax
89 ; CHECK-NEXT:    callq __subtf3@PLT
90 ; CHECK-NEXT:    movaps %xmm0, vf128(%rip)
91 ; CHECK-NEXT:    popq %rax
92 ; CHECK-NEXT:    retq
94 ; X86-LABEL: Test128Sub:
95 ; X86:       # %bb.0: # %entry
96 ; X86-NEXT:    subl $40, %esp
97 ; X86-NEXT:    leal {{[0-9]+}}(%esp), %eax
98 ; X86-NEXT:    pushl {{[0-9]+}}(%esp)
99 ; X86-NEXT:    pushl {{[0-9]+}}(%esp)
100 ; X86-NEXT:    pushl {{[0-9]+}}(%esp)
101 ; X86-NEXT:    pushl {{[0-9]+}}(%esp)
102 ; X86-NEXT:    pushl {{[0-9]+}}(%esp)
103 ; X86-NEXT:    pushl {{[0-9]+}}(%esp)
104 ; X86-NEXT:    pushl {{[0-9]+}}(%esp)
105 ; X86-NEXT:    pushl {{[0-9]+}}(%esp)
106 ; X86-NEXT:    pushl %eax
107 ; X86-NEXT:    calll __subtf3
108 ; X86-NEXT:    addl $44, %esp
109 ; X86-NEXT:    movaps (%esp), %xmm0
110 ; X86-NEXT:    movaps %xmm0, vf128
111 ; X86-NEXT:    addl $28, %esp
112 ; X86-NEXT:    retl
113 entry:
114   %sub = fsub fp128 %d1, %d2
115   store fp128 %sub, ptr @vf128, align 16
116   ret void
119 define dso_local void @Test128_1Sub(fp128 %d1) nounwind {
120 ; CHECK-LABEL: Test128_1Sub:
121 ; CHECK:       # %bb.0: # %entry
122 ; CHECK-NEXT:    pushq %rax
123 ; CHECK-NEXT:    movaps %xmm0, %xmm1
124 ; CHECK-NEXT:    movaps vf128(%rip), %xmm0
125 ; CHECK-NEXT:    callq __subtf3@PLT
126 ; CHECK-NEXT:    movaps %xmm0, vf128(%rip)
127 ; CHECK-NEXT:    popq %rax
128 ; CHECK-NEXT:    retq
130 ; X86-LABEL: Test128_1Sub:
131 ; X86:       # %bb.0: # %entry
132 ; X86-NEXT:    subl $40, %esp
133 ; X86-NEXT:    leal {{[0-9]+}}(%esp), %eax
134 ; X86-NEXT:    pushl {{[0-9]+}}(%esp)
135 ; X86-NEXT:    pushl {{[0-9]+}}(%esp)
136 ; X86-NEXT:    pushl {{[0-9]+}}(%esp)
137 ; X86-NEXT:    pushl {{[0-9]+}}(%esp)
138 ; X86-NEXT:    pushl vf128+12
139 ; X86-NEXT:    pushl vf128+8
140 ; X86-NEXT:    pushl vf128+4
141 ; X86-NEXT:    pushl vf128
142 ; X86-NEXT:    pushl %eax
143 ; X86-NEXT:    calll __subtf3
144 ; X86-NEXT:    addl $44, %esp
145 ; X86-NEXT:    movaps (%esp), %xmm0
146 ; X86-NEXT:    movaps %xmm0, vf128
147 ; X86-NEXT:    addl $28, %esp
148 ; X86-NEXT:    retl
149 entry:
150   %0 = load fp128, ptr @vf128, align 16
151   %sub = fsub fp128 %0, %d1
152   store fp128 %sub, ptr @vf128, align 16
153   ret void
156 define dso_local void @Test128Mul(fp128 %d1, fp128 %d2) nounwind {
157 ; CHECK-LABEL: Test128Mul:
158 ; CHECK:       # %bb.0: # %entry
159 ; CHECK-NEXT:    pushq %rax
160 ; CHECK-NEXT:    callq __multf3@PLT
161 ; CHECK-NEXT:    movaps %xmm0, vf128(%rip)
162 ; CHECK-NEXT:    popq %rax
163 ; CHECK-NEXT:    retq
165 ; X86-LABEL: Test128Mul:
166 ; X86:       # %bb.0: # %entry
167 ; X86-NEXT:    subl $40, %esp
168 ; X86-NEXT:    leal {{[0-9]+}}(%esp), %eax
169 ; X86-NEXT:    pushl {{[0-9]+}}(%esp)
170 ; X86-NEXT:    pushl {{[0-9]+}}(%esp)
171 ; X86-NEXT:    pushl {{[0-9]+}}(%esp)
172 ; X86-NEXT:    pushl {{[0-9]+}}(%esp)
173 ; X86-NEXT:    pushl {{[0-9]+}}(%esp)
174 ; X86-NEXT:    pushl {{[0-9]+}}(%esp)
175 ; X86-NEXT:    pushl {{[0-9]+}}(%esp)
176 ; X86-NEXT:    pushl {{[0-9]+}}(%esp)
177 ; X86-NEXT:    pushl %eax
178 ; X86-NEXT:    calll __multf3
179 ; X86-NEXT:    addl $44, %esp
180 ; X86-NEXT:    movaps (%esp), %xmm0
181 ; X86-NEXT:    movaps %xmm0, vf128
182 ; X86-NEXT:    addl $28, %esp
183 ; X86-NEXT:    retl
184 entry:
185   %mul = fmul fp128 %d1, %d2
186   store fp128 %mul, ptr @vf128, align 16
187   ret void
190 define dso_local void @Test128_1Mul(fp128 %d1) nounwind {
191 ; CHECK-LABEL: Test128_1Mul:
192 ; CHECK:       # %bb.0: # %entry
193 ; CHECK-NEXT:    pushq %rax
194 ; CHECK-NEXT:    movaps %xmm0, %xmm1
195 ; CHECK-NEXT:    movaps vf128(%rip), %xmm0
196 ; CHECK-NEXT:    callq __multf3@PLT
197 ; CHECK-NEXT:    movaps %xmm0, vf128(%rip)
198 ; CHECK-NEXT:    popq %rax
199 ; CHECK-NEXT:    retq
201 ; X86-LABEL: Test128_1Mul:
202 ; X86:       # %bb.0: # %entry
203 ; X86-NEXT:    subl $40, %esp
204 ; X86-NEXT:    leal {{[0-9]+}}(%esp), %eax
205 ; X86-NEXT:    pushl {{[0-9]+}}(%esp)
206 ; X86-NEXT:    pushl {{[0-9]+}}(%esp)
207 ; X86-NEXT:    pushl {{[0-9]+}}(%esp)
208 ; X86-NEXT:    pushl {{[0-9]+}}(%esp)
209 ; X86-NEXT:    pushl vf128+12
210 ; X86-NEXT:    pushl vf128+8
211 ; X86-NEXT:    pushl vf128+4
212 ; X86-NEXT:    pushl vf128
213 ; X86-NEXT:    pushl %eax
214 ; X86-NEXT:    calll __multf3
215 ; X86-NEXT:    addl $44, %esp
216 ; X86-NEXT:    movaps (%esp), %xmm0
217 ; X86-NEXT:    movaps %xmm0, vf128
218 ; X86-NEXT:    addl $28, %esp
219 ; X86-NEXT:    retl
220 entry:
221   %0 = load fp128, ptr @vf128, align 16
222   %mul = fmul fp128 %0, %d1
223   store fp128 %mul, ptr @vf128, align 16
224   ret void
227 define dso_local void @Test128Div(fp128 %d1, fp128 %d2) nounwind {
228 ; CHECK-LABEL: Test128Div:
229 ; CHECK:       # %bb.0: # %entry
230 ; CHECK-NEXT:    pushq %rax
231 ; CHECK-NEXT:    callq __divtf3@PLT
232 ; CHECK-NEXT:    movaps %xmm0, vf128(%rip)
233 ; CHECK-NEXT:    popq %rax
234 ; CHECK-NEXT:    retq
236 ; X86-LABEL: Test128Div:
237 ; X86:       # %bb.0: # %entry
238 ; X86-NEXT:    subl $40, %esp
239 ; X86-NEXT:    leal {{[0-9]+}}(%esp), %eax
240 ; X86-NEXT:    pushl {{[0-9]+}}(%esp)
241 ; X86-NEXT:    pushl {{[0-9]+}}(%esp)
242 ; X86-NEXT:    pushl {{[0-9]+}}(%esp)
243 ; X86-NEXT:    pushl {{[0-9]+}}(%esp)
244 ; X86-NEXT:    pushl {{[0-9]+}}(%esp)
245 ; X86-NEXT:    pushl {{[0-9]+}}(%esp)
246 ; X86-NEXT:    pushl {{[0-9]+}}(%esp)
247 ; X86-NEXT:    pushl {{[0-9]+}}(%esp)
248 ; X86-NEXT:    pushl %eax
249 ; X86-NEXT:    calll __divtf3
250 ; X86-NEXT:    addl $44, %esp
251 ; X86-NEXT:    movaps (%esp), %xmm0
252 ; X86-NEXT:    movaps %xmm0, vf128
253 ; X86-NEXT:    addl $28, %esp
254 ; X86-NEXT:    retl
255 entry:
256   %div = fdiv fp128 %d1, %d2
257   store fp128 %div, ptr @vf128, align 16
258   ret void
261 define dso_local void @Test128_1Div(fp128 %d1) nounwind {
262 ; CHECK-LABEL: Test128_1Div:
263 ; CHECK:       # %bb.0: # %entry
264 ; CHECK-NEXT:    pushq %rax
265 ; CHECK-NEXT:    movaps %xmm0, %xmm1
266 ; CHECK-NEXT:    movaps vf128(%rip), %xmm0
267 ; CHECK-NEXT:    callq __divtf3@PLT
268 ; CHECK-NEXT:    movaps %xmm0, vf128(%rip)
269 ; CHECK-NEXT:    popq %rax
270 ; CHECK-NEXT:    retq
272 ; X86-LABEL: Test128_1Div:
273 ; X86:       # %bb.0: # %entry
274 ; X86-NEXT:    subl $40, %esp
275 ; X86-NEXT:    leal {{[0-9]+}}(%esp), %eax
276 ; X86-NEXT:    pushl {{[0-9]+}}(%esp)
277 ; X86-NEXT:    pushl {{[0-9]+}}(%esp)
278 ; X86-NEXT:    pushl {{[0-9]+}}(%esp)
279 ; X86-NEXT:    pushl {{[0-9]+}}(%esp)
280 ; X86-NEXT:    pushl vf128+12
281 ; X86-NEXT:    pushl vf128+8
282 ; X86-NEXT:    pushl vf128+4
283 ; X86-NEXT:    pushl vf128
284 ; X86-NEXT:    pushl %eax
285 ; X86-NEXT:    calll __divtf3
286 ; X86-NEXT:    addl $44, %esp
287 ; X86-NEXT:    movaps (%esp), %xmm0
288 ; X86-NEXT:    movaps %xmm0, vf128
289 ; X86-NEXT:    addl $28, %esp
290 ; X86-NEXT:    retl
291 entry:
292   %0 = load fp128, ptr @vf128, align 16
293   %div = fdiv fp128 %0, %d1
294   store fp128 %div, ptr @vf128, align 16
295   ret void
298 define dso_local void @Test128Rem(fp128 %d1, fp128 %d2) nounwind {
299 ; CHECK-LABEL: Test128Rem:
300 ; CHECK:       # %bb.0: # %entry
301 ; CHECK-NEXT:    pushq %rax
302 ; CHECK-NEXT:    callq fmodl@PLT
303 ; CHECK-NEXT:    movaps %xmm0, vf128(%rip)
304 ; CHECK-NEXT:    popq %rax
305 ; CHECK-NEXT:    retq
307 ; X86-LABEL: Test128Rem:
308 ; X86:       # %bb.0: # %entry
309 ; X86-NEXT:    subl $40, %esp
310 ; X86-NEXT:    leal {{[0-9]+}}(%esp), %eax
311 ; X86-NEXT:    pushl {{[0-9]+}}(%esp)
312 ; X86-NEXT:    pushl {{[0-9]+}}(%esp)
313 ; X86-NEXT:    pushl {{[0-9]+}}(%esp)
314 ; X86-NEXT:    pushl {{[0-9]+}}(%esp)
315 ; X86-NEXT:    pushl {{[0-9]+}}(%esp)
316 ; X86-NEXT:    pushl {{[0-9]+}}(%esp)
317 ; X86-NEXT:    pushl {{[0-9]+}}(%esp)
318 ; X86-NEXT:    pushl {{[0-9]+}}(%esp)
319 ; X86-NEXT:    pushl %eax
320 ; X86-NEXT:    calll fmodl
321 ; X86-NEXT:    addl $44, %esp
322 ; X86-NEXT:    movaps (%esp), %xmm0
323 ; X86-NEXT:    movaps %xmm0, vf128
324 ; X86-NEXT:    addl $28, %esp
325 ; X86-NEXT:    retl
326 entry:
327   %div = frem fp128 %d1, %d2
328   store fp128 %div, ptr @vf128, align 16
329   ret void
332 define dso_local void @Test128_1Rem(fp128 %d1) nounwind {
333 ; CHECK-LABEL: Test128_1Rem:
334 ; CHECK:       # %bb.0: # %entry
335 ; CHECK-NEXT:    pushq %rax
336 ; CHECK-NEXT:    movaps %xmm0, %xmm1
337 ; CHECK-NEXT:    movaps vf128(%rip), %xmm0
338 ; CHECK-NEXT:    callq fmodl@PLT
339 ; CHECK-NEXT:    movaps %xmm0, vf128(%rip)
340 ; CHECK-NEXT:    popq %rax
341 ; CHECK-NEXT:    retq
343 ; X86-LABEL: Test128_1Rem:
344 ; X86:       # %bb.0: # %entry
345 ; X86-NEXT:    subl $40, %esp
346 ; X86-NEXT:    leal {{[0-9]+}}(%esp), %eax
347 ; X86-NEXT:    pushl {{[0-9]+}}(%esp)
348 ; X86-NEXT:    pushl {{[0-9]+}}(%esp)
349 ; X86-NEXT:    pushl {{[0-9]+}}(%esp)
350 ; X86-NEXT:    pushl {{[0-9]+}}(%esp)
351 ; X86-NEXT:    pushl vf128+12
352 ; X86-NEXT:    pushl vf128+8
353 ; X86-NEXT:    pushl vf128+4
354 ; X86-NEXT:    pushl vf128
355 ; X86-NEXT:    pushl %eax
356 ; X86-NEXT:    calll fmodl
357 ; X86-NEXT:    addl $44, %esp
358 ; X86-NEXT:    movaps (%esp), %xmm0
359 ; X86-NEXT:    movaps %xmm0, vf128
360 ; X86-NEXT:    addl $28, %esp
361 ; X86-NEXT:    retl
362 entry:
363   %0 = load fp128, ptr @vf128, align 16
364   %div = frem fp128 %0, %d1
365   store fp128 %div, ptr @vf128, align 16
366   ret void
369 define dso_local void @Test128Sqrt(fp128 %d1) nounwind {
370 ; CHECK-LABEL: Test128Sqrt:
371 ; CHECK:       # %bb.0: # %entry
372 ; CHECK-NEXT:    pushq %rax
373 ; CHECK-NEXT:    callq sqrtl@PLT
374 ; CHECK-NEXT:    movaps %xmm0, vf128(%rip)
375 ; CHECK-NEXT:    popq %rax
376 ; CHECK-NEXT:    retq
378 ; X86-LABEL: Test128Sqrt:
379 ; X86:       # %bb.0: # %entry
380 ; X86-NEXT:    subl $40, %esp
381 ; X86-NEXT:    leal {{[0-9]+}}(%esp), %eax
382 ; X86-NEXT:    pushl {{[0-9]+}}(%esp)
383 ; X86-NEXT:    pushl {{[0-9]+}}(%esp)
384 ; X86-NEXT:    pushl {{[0-9]+}}(%esp)
385 ; X86-NEXT:    pushl {{[0-9]+}}(%esp)
386 ; X86-NEXT:    pushl %eax
387 ; X86-NEXT:    calll sqrtl
388 ; X86-NEXT:    addl $28, %esp
389 ; X86-NEXT:    movaps (%esp), %xmm0
390 ; X86-NEXT:    movaps %xmm0, vf128
391 ; X86-NEXT:    addl $28, %esp
392 ; X86-NEXT:    retl
393 entry:
394   %sqrt = call fp128 @llvm.sqrt.f128(fp128 %d1)
395   store fp128 %sqrt, ptr @vf128, align 16
396   ret void
398 declare fp128 @llvm.sqrt.f128(fp128)
400 define dso_local void @Test128Sin(fp128 %d1) nounwind {
401 ; CHECK-LABEL: Test128Sin:
402 ; CHECK:       # %bb.0: # %entry
403 ; CHECK-NEXT:    pushq %rax
404 ; CHECK-NEXT:    callq sinl@PLT
405 ; CHECK-NEXT:    movaps %xmm0, vf128(%rip)
406 ; CHECK-NEXT:    popq %rax
407 ; CHECK-NEXT:    retq
409 ; X86-LABEL: Test128Sin:
410 ; X86:       # %bb.0: # %entry
411 ; X86-NEXT:    subl $40, %esp
412 ; X86-NEXT:    leal {{[0-9]+}}(%esp), %eax
413 ; X86-NEXT:    pushl {{[0-9]+}}(%esp)
414 ; X86-NEXT:    pushl {{[0-9]+}}(%esp)
415 ; X86-NEXT:    pushl {{[0-9]+}}(%esp)
416 ; X86-NEXT:    pushl {{[0-9]+}}(%esp)
417 ; X86-NEXT:    pushl %eax
418 ; X86-NEXT:    calll sinl
419 ; X86-NEXT:    addl $28, %esp
420 ; X86-NEXT:    movaps (%esp), %xmm0
421 ; X86-NEXT:    movaps %xmm0, vf128
422 ; X86-NEXT:    addl $28, %esp
423 ; X86-NEXT:    retl
424 entry:
425   %sqrt = call fp128 @llvm.sin.f128(fp128 %d1)
426   store fp128 %sqrt, ptr @vf128, align 16
427   ret void
429 declare fp128 @llvm.sin.f128(fp128)
431 define dso_local void @Test128Cos(fp128 %d1) nounwind {
432 ; CHECK-LABEL: Test128Cos:
433 ; CHECK:       # %bb.0: # %entry
434 ; CHECK-NEXT:    pushq %rax
435 ; CHECK-NEXT:    callq cosl@PLT
436 ; CHECK-NEXT:    movaps %xmm0, vf128(%rip)
437 ; CHECK-NEXT:    popq %rax
438 ; CHECK-NEXT:    retq
440 ; X86-LABEL: Test128Cos:
441 ; X86:       # %bb.0: # %entry
442 ; X86-NEXT:    subl $40, %esp
443 ; X86-NEXT:    leal {{[0-9]+}}(%esp), %eax
444 ; X86-NEXT:    pushl {{[0-9]+}}(%esp)
445 ; X86-NEXT:    pushl {{[0-9]+}}(%esp)
446 ; X86-NEXT:    pushl {{[0-9]+}}(%esp)
447 ; X86-NEXT:    pushl {{[0-9]+}}(%esp)
448 ; X86-NEXT:    pushl %eax
449 ; X86-NEXT:    calll cosl
450 ; X86-NEXT:    addl $28, %esp
451 ; X86-NEXT:    movaps (%esp), %xmm0
452 ; X86-NEXT:    movaps %xmm0, vf128
453 ; X86-NEXT:    addl $28, %esp
454 ; X86-NEXT:    retl
455 entry:
456   %sqrt = call fp128 @llvm.cos.f128(fp128 %d1)
457   store fp128 %sqrt, ptr @vf128, align 16
458   ret void
460 declare fp128 @llvm.cos.f128(fp128)
462 define dso_local void @Test128Ceil(fp128 %d1) nounwind {
463 ; CHECK-LABEL: Test128Ceil:
464 ; CHECK:       # %bb.0: # %entry
465 ; CHECK-NEXT:    pushq %rax
466 ; CHECK-NEXT:    callq ceill@PLT
467 ; CHECK-NEXT:    movaps %xmm0, vf128(%rip)
468 ; CHECK-NEXT:    popq %rax
469 ; CHECK-NEXT:    retq
471 ; X86-LABEL: Test128Ceil:
472 ; X86:       # %bb.0: # %entry
473 ; X86-NEXT:    subl $40, %esp
474 ; X86-NEXT:    leal {{[0-9]+}}(%esp), %eax
475 ; X86-NEXT:    pushl {{[0-9]+}}(%esp)
476 ; X86-NEXT:    pushl {{[0-9]+}}(%esp)
477 ; X86-NEXT:    pushl {{[0-9]+}}(%esp)
478 ; X86-NEXT:    pushl {{[0-9]+}}(%esp)
479 ; X86-NEXT:    pushl %eax
480 ; X86-NEXT:    calll ceill
481 ; X86-NEXT:    addl $28, %esp
482 ; X86-NEXT:    movaps (%esp), %xmm0
483 ; X86-NEXT:    movaps %xmm0, vf128
484 ; X86-NEXT:    addl $28, %esp
485 ; X86-NEXT:    retl
486 entry:
487   %sqrt = call fp128 @llvm.ceil.f128(fp128 %d1)
488   store fp128 %sqrt, ptr @vf128, align 16
489   ret void
491 declare fp128 @llvm.ceil.f128(fp128)
493 define dso_local void @Test128Floor(fp128 %d1) nounwind {
494 ; CHECK-LABEL: Test128Floor:
495 ; CHECK:       # %bb.0: # %entry
496 ; CHECK-NEXT:    pushq %rax
497 ; CHECK-NEXT:    callq floorl@PLT
498 ; CHECK-NEXT:    movaps %xmm0, vf128(%rip)
499 ; CHECK-NEXT:    popq %rax
500 ; CHECK-NEXT:    retq
502 ; X86-LABEL: Test128Floor:
503 ; X86:       # %bb.0: # %entry
504 ; X86-NEXT:    subl $40, %esp
505 ; X86-NEXT:    leal {{[0-9]+}}(%esp), %eax
506 ; X86-NEXT:    pushl {{[0-9]+}}(%esp)
507 ; X86-NEXT:    pushl {{[0-9]+}}(%esp)
508 ; X86-NEXT:    pushl {{[0-9]+}}(%esp)
509 ; X86-NEXT:    pushl {{[0-9]+}}(%esp)
510 ; X86-NEXT:    pushl %eax
511 ; X86-NEXT:    calll floorl
512 ; X86-NEXT:    addl $28, %esp
513 ; X86-NEXT:    movaps (%esp), %xmm0
514 ; X86-NEXT:    movaps %xmm0, vf128
515 ; X86-NEXT:    addl $28, %esp
516 ; X86-NEXT:    retl
517 entry:
518   %sqrt = call fp128 @llvm.floor.f128(fp128 %d1)
519   store fp128 %sqrt, ptr @vf128, align 16
520   ret void
522 declare fp128 @llvm.floor.f128(fp128)
524 define dso_local void @Test128Trunc(fp128 %d1) nounwind {
525 ; CHECK-LABEL: Test128Trunc:
526 ; CHECK:       # %bb.0: # %entry
527 ; CHECK-NEXT:    pushq %rax
528 ; CHECK-NEXT:    callq truncl@PLT
529 ; CHECK-NEXT:    movaps %xmm0, vf128(%rip)
530 ; CHECK-NEXT:    popq %rax
531 ; CHECK-NEXT:    retq
533 ; X86-LABEL: Test128Trunc:
534 ; X86:       # %bb.0: # %entry
535 ; X86-NEXT:    subl $40, %esp
536 ; X86-NEXT:    leal {{[0-9]+}}(%esp), %eax
537 ; X86-NEXT:    pushl {{[0-9]+}}(%esp)
538 ; X86-NEXT:    pushl {{[0-9]+}}(%esp)
539 ; X86-NEXT:    pushl {{[0-9]+}}(%esp)
540 ; X86-NEXT:    pushl {{[0-9]+}}(%esp)
541 ; X86-NEXT:    pushl %eax
542 ; X86-NEXT:    calll truncl
543 ; X86-NEXT:    addl $28, %esp
544 ; X86-NEXT:    movaps (%esp), %xmm0
545 ; X86-NEXT:    movaps %xmm0, vf128
546 ; X86-NEXT:    addl $28, %esp
547 ; X86-NEXT:    retl
548 entry:
549   %sqrt = call fp128 @llvm.trunc.f128(fp128 %d1)
550   store fp128 %sqrt, ptr @vf128, align 16
551   ret void
553 declare fp128 @llvm.trunc.f128(fp128)
555 define dso_local void @Test128Nearbyint(fp128 %d1) nounwind {
556 ; CHECK-LABEL: Test128Nearbyint:
557 ; CHECK:       # %bb.0: # %entry
558 ; CHECK-NEXT:    pushq %rax
559 ; CHECK-NEXT:    callq nearbyintl@PLT
560 ; CHECK-NEXT:    movaps %xmm0, vf128(%rip)
561 ; CHECK-NEXT:    popq %rax
562 ; CHECK-NEXT:    retq
564 ; X86-LABEL: Test128Nearbyint:
565 ; X86:       # %bb.0: # %entry
566 ; X86-NEXT:    subl $40, %esp
567 ; X86-NEXT:    leal {{[0-9]+}}(%esp), %eax
568 ; X86-NEXT:    pushl {{[0-9]+}}(%esp)
569 ; X86-NEXT:    pushl {{[0-9]+}}(%esp)
570 ; X86-NEXT:    pushl {{[0-9]+}}(%esp)
571 ; X86-NEXT:    pushl {{[0-9]+}}(%esp)
572 ; X86-NEXT:    pushl %eax
573 ; X86-NEXT:    calll nearbyintl
574 ; X86-NEXT:    addl $28, %esp
575 ; X86-NEXT:    movaps (%esp), %xmm0
576 ; X86-NEXT:    movaps %xmm0, vf128
577 ; X86-NEXT:    addl $28, %esp
578 ; X86-NEXT:    retl
579 entry:
580   %sqrt = call fp128 @llvm.nearbyint.f128(fp128 %d1)
581   store fp128 %sqrt, ptr @vf128, align 16
582   ret void
584 declare fp128 @llvm.nearbyint.f128(fp128)
586 define dso_local void @Test128Rint(fp128 %d1) nounwind {
587 ; CHECK-LABEL: Test128Rint:
588 ; CHECK:       # %bb.0: # %entry
589 ; CHECK-NEXT:    pushq %rax
590 ; CHECK-NEXT:    callq rintl@PLT
591 ; CHECK-NEXT:    movaps %xmm0, vf128(%rip)
592 ; CHECK-NEXT:    popq %rax
593 ; CHECK-NEXT:    retq
595 ; X86-LABEL: Test128Rint:
596 ; X86:       # %bb.0: # %entry
597 ; X86-NEXT:    subl $40, %esp
598 ; X86-NEXT:    leal {{[0-9]+}}(%esp), %eax
599 ; X86-NEXT:    pushl {{[0-9]+}}(%esp)
600 ; X86-NEXT:    pushl {{[0-9]+}}(%esp)
601 ; X86-NEXT:    pushl {{[0-9]+}}(%esp)
602 ; X86-NEXT:    pushl {{[0-9]+}}(%esp)
603 ; X86-NEXT:    pushl %eax
604 ; X86-NEXT:    calll rintl
605 ; X86-NEXT:    addl $28, %esp
606 ; X86-NEXT:    movaps (%esp), %xmm0
607 ; X86-NEXT:    movaps %xmm0, vf128
608 ; X86-NEXT:    addl $28, %esp
609 ; X86-NEXT:    retl
610 entry:
611   %sqrt = call fp128 @llvm.rint.f128(fp128 %d1)
612   store fp128 %sqrt, ptr @vf128, align 16
613   ret void
615 declare fp128 @llvm.rint.f128(fp128)
617 define dso_local void @Test128Round(fp128 %d1) nounwind {
618 ; CHECK-LABEL: Test128Round:
619 ; CHECK:       # %bb.0: # %entry
620 ; CHECK-NEXT:    pushq %rax
621 ; CHECK-NEXT:    callq roundl@PLT
622 ; CHECK-NEXT:    movaps %xmm0, vf128(%rip)
623 ; CHECK-NEXT:    popq %rax
624 ; CHECK-NEXT:    retq
626 ; X86-LABEL: Test128Round:
627 ; X86:       # %bb.0: # %entry
628 ; X86-NEXT:    subl $40, %esp
629 ; X86-NEXT:    leal {{[0-9]+}}(%esp), %eax
630 ; X86-NEXT:    pushl {{[0-9]+}}(%esp)
631 ; X86-NEXT:    pushl {{[0-9]+}}(%esp)
632 ; X86-NEXT:    pushl {{[0-9]+}}(%esp)
633 ; X86-NEXT:    pushl {{[0-9]+}}(%esp)
634 ; X86-NEXT:    pushl %eax
635 ; X86-NEXT:    calll roundl
636 ; X86-NEXT:    addl $28, %esp
637 ; X86-NEXT:    movaps (%esp), %xmm0
638 ; X86-NEXT:    movaps %xmm0, vf128
639 ; X86-NEXT:    addl $28, %esp
640 ; X86-NEXT:    retl
641 entry:
642   %sqrt = call fp128 @llvm.round.f128(fp128 %d1)
643   store fp128 %sqrt, ptr @vf128, align 16
644   ret void
646 declare fp128 @llvm.round.f128(fp128)
648 define fp128 @Test128FMA(fp128 %a, fp128 %b, fp128 %c) nounwind {
649 ; CHECK-LABEL: Test128FMA:
650 ; CHECK:       # %bb.0: # %entry
651 ; CHECK-NEXT:    jmp fmal@PLT # TAILCALL
653 ; X86-LABEL: Test128FMA:
654 ; X86:       # %bb.0: # %entry
655 ; X86-NEXT:    pushl %esi
656 ; X86-NEXT:    subl $24, %esp
657 ; X86-NEXT:    movl {{[0-9]+}}(%esp), %esi
658 ; X86-NEXT:    subl $12, %esp
659 ; X86-NEXT:    leal {{[0-9]+}}(%esp), %eax
660 ; X86-NEXT:    pushl {{[0-9]+}}(%esp)
661 ; X86-NEXT:    pushl {{[0-9]+}}(%esp)
662 ; X86-NEXT:    pushl {{[0-9]+}}(%esp)
663 ; X86-NEXT:    pushl {{[0-9]+}}(%esp)
664 ; X86-NEXT:    pushl {{[0-9]+}}(%esp)
665 ; X86-NEXT:    pushl {{[0-9]+}}(%esp)
666 ; X86-NEXT:    pushl {{[0-9]+}}(%esp)
667 ; X86-NEXT:    pushl {{[0-9]+}}(%esp)
668 ; X86-NEXT:    pushl {{[0-9]+}}(%esp)
669 ; X86-NEXT:    pushl {{[0-9]+}}(%esp)
670 ; X86-NEXT:    pushl {{[0-9]+}}(%esp)
671 ; X86-NEXT:    pushl {{[0-9]+}}(%esp)
672 ; X86-NEXT:    pushl %eax
673 ; X86-NEXT:    calll fmal
674 ; X86-NEXT:    addl $60, %esp
675 ; X86-NEXT:    movaps (%esp), %xmm0
676 ; X86-NEXT:    movaps %xmm0, (%esi)
677 ; X86-NEXT:    movl %esi, %eax
678 ; X86-NEXT:    addl $24, %esp
679 ; X86-NEXT:    popl %esi
680 ; X86-NEXT:    retl $4
681 entry:
682   %call = call fp128 @llvm.fma.f128(fp128 %a, fp128 %b, fp128 %c)
683   ret fp128 %call
685 declare fp128 @llvm.fma.f128(fp128, fp128, fp128)