1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2; RUN: llc < %s -mtriple=x86_64-pc-linux-gnu     | FileCheck %s --check-prefix=GNU
3; RUN: llc < %s -mtriple=x86_64-pc-windows-msvc  | FileCheck %s --check-prefix=WIN
4; RUN: llc < %s -mtriple=x86_64-apple-darwin     | FileCheck %s --check-prefix=MAC
5
6; PR35672 - https://bugs.llvm.org/show_bug.cgi?id=35672
7; FIXME: We would not need the function-level attributes if FMF were propagated to DAG nodes for this case.
8
9define float @exp_f32(float %x) #0 {
10; GNU-LABEL: exp_f32:
11; GNU:       # %bb.0:
12; GNU-NEXT:    jmp expf@PLT # TAILCALL
13;
14; WIN-LABEL: exp_f32:
15; WIN:       # %bb.0:
16; WIN-NEXT:    jmp expf # TAILCALL
17;
18; MAC-LABEL: exp_f32:
19; MAC:       ## %bb.0:
20; MAC-NEXT:    jmp _expf ## TAILCALL
21  %r = tail call nnan ninf float @llvm.exp.f32(float %x)
22  ret float %r
23}
24
25define double @exp_f64(double %x) #0 {
26; GNU-LABEL: exp_f64:
27; GNU:       # %bb.0:
28; GNU-NEXT:    jmp exp@PLT # TAILCALL
29;
30; WIN-LABEL: exp_f64:
31; WIN:       # %bb.0:
32; WIN-NEXT:    jmp exp # TAILCALL
33;
34; MAC-LABEL: exp_f64:
35; MAC:       ## %bb.0:
36; MAC-NEXT:    jmp _exp ## TAILCALL
37  %r = tail call nnan ninf double @llvm.exp.f64(double %x)
38  ret double %r
39}
40
41define x86_fp80 @exp_f80(x86_fp80 %x) #0 {
42; GNU-LABEL: exp_f80:
43; GNU:       # %bb.0:
44; GNU-NEXT:    subq $24, %rsp
45; GNU-NEXT:    fldt {{[0-9]+}}(%rsp)
46; GNU-NEXT:    fstpt (%rsp)
47; GNU-NEXT:    callq expl
48; GNU-NEXT:    addq $24, %rsp
49; GNU-NEXT:    retq
50;
51; WIN-LABEL: exp_f80:
52; WIN:       # %bb.0:
53; WIN-NEXT:    pushq %rsi
54; WIN-NEXT:    subq $64, %rsp
55; WIN-NEXT:    movq %rcx, %rsi
56; WIN-NEXT:    fldt (%rdx)
57; WIN-NEXT:    fstpt {{[0-9]+}}(%rsp)
58; WIN-NEXT:    leaq {{[0-9]+}}(%rsp), %rcx
59; WIN-NEXT:    leaq {{[0-9]+}}(%rsp), %rdx
60; WIN-NEXT:    callq expl
61; WIN-NEXT:    fldt {{[0-9]+}}(%rsp)
62; WIN-NEXT:    fstpt (%rsi)
63; WIN-NEXT:    movq %rsi, %rax
64; WIN-NEXT:    addq $64, %rsp
65; WIN-NEXT:    popq %rsi
66; WIN-NEXT:    retq
67;
68; MAC-LABEL: exp_f80:
69; MAC:       ## %bb.0:
70; MAC-NEXT:    subq $24, %rsp
71; MAC-NEXT:    fldt {{[0-9]+}}(%rsp)
72; MAC-NEXT:    fstpt (%rsp)
73; MAC-NEXT:    callq _expl
74; MAC-NEXT:    addq $24, %rsp
75; MAC-NEXT:    retq
76  %r = tail call nnan ninf x86_fp80 @llvm.exp.f80(x86_fp80 %x)
77  ret x86_fp80 %r
78}
79
80define float @exp2_f32(float %x) #0 {
81; GNU-LABEL: exp2_f32:
82; GNU:       # %bb.0:
83; GNU-NEXT:    jmp exp2f@PLT # TAILCALL
84;
85; WIN-LABEL: exp2_f32:
86; WIN:       # %bb.0:
87; WIN-NEXT:    jmp exp2f # TAILCALL
88;
89; MAC-LABEL: exp2_f32:
90; MAC:       ## %bb.0:
91; MAC-NEXT:    jmp _exp2f ## TAILCALL
92  %r = tail call nnan ninf float @llvm.exp2.f32(float %x)
93  ret float %r
94}
95
96define double @exp2_f64(double %x) #0 {
97; GNU-LABEL: exp2_f64:
98; GNU:       # %bb.0:
99; GNU-NEXT:    jmp exp2@PLT # TAILCALL
100;
101; WIN-LABEL: exp2_f64:
102; WIN:       # %bb.0:
103; WIN-NEXT:    jmp exp2 # TAILCALL
104;
105; MAC-LABEL: exp2_f64:
106; MAC:       ## %bb.0:
107; MAC-NEXT:    jmp _exp2 ## TAILCALL
108  %r = tail call nnan ninf double @llvm.exp2.f64(double %x)
109  ret double %r
110}
111
112define x86_fp80 @exp2_f80(x86_fp80 %x) #0 {
113; GNU-LABEL: exp2_f80:
114; GNU:       # %bb.0:
115; GNU-NEXT:    subq $24, %rsp
116; GNU-NEXT:    fldt {{[0-9]+}}(%rsp)
117; GNU-NEXT:    fstpt (%rsp)
118; GNU-NEXT:    callq exp2l
119; GNU-NEXT:    addq $24, %rsp
120; GNU-NEXT:    retq
121;
122; WIN-LABEL: exp2_f80:
123; WIN:       # %bb.0:
124; WIN-NEXT:    pushq %rsi
125; WIN-NEXT:    subq $64, %rsp
126; WIN-NEXT:    movq %rcx, %rsi
127; WIN-NEXT:    fldt (%rdx)
128; WIN-NEXT:    fstpt {{[0-9]+}}(%rsp)
129; WIN-NEXT:    leaq {{[0-9]+}}(%rsp), %rcx
130; WIN-NEXT:    leaq {{[0-9]+}}(%rsp), %rdx
131; WIN-NEXT:    callq exp2l
132; WIN-NEXT:    fldt {{[0-9]+}}(%rsp)
133; WIN-NEXT:    fstpt (%rsi)
134; WIN-NEXT:    movq %rsi, %rax
135; WIN-NEXT:    addq $64, %rsp
136; WIN-NEXT:    popq %rsi
137; WIN-NEXT:    retq
138;
139; MAC-LABEL: exp2_f80:
140; MAC:       ## %bb.0:
141; MAC-NEXT:    subq $24, %rsp
142; MAC-NEXT:    fldt {{[0-9]+}}(%rsp)
143; MAC-NEXT:    fstpt (%rsp)
144; MAC-NEXT:    callq _exp2l
145; MAC-NEXT:    addq $24, %rsp
146; MAC-NEXT:    retq
147  %r = tail call nnan ninf x86_fp80 @llvm.exp2.f80(x86_fp80 %x)
148  ret x86_fp80 %r
149}
150
151define float @log_f32(float %x) #0 {
152; GNU-LABEL: log_f32:
153; GNU:       # %bb.0:
154; GNU-NEXT:    jmp logf@PLT # TAILCALL
155;
156; WIN-LABEL: log_f32:
157; WIN:       # %bb.0:
158; WIN-NEXT:    jmp logf # TAILCALL
159;
160; MAC-LABEL: log_f32:
161; MAC:       ## %bb.0:
162; MAC-NEXT:    jmp _logf ## TAILCALL
163  %r = tail call nnan ninf float @llvm.log.f32(float %x)
164  ret float %r
165}
166
167define double @log_f64(double %x) #0 {
168; GNU-LABEL: log_f64:
169; GNU:       # %bb.0:
170; GNU-NEXT:    jmp log@PLT # TAILCALL
171;
172; WIN-LABEL: log_f64:
173; WIN:       # %bb.0:
174; WIN-NEXT:    jmp log # TAILCALL
175;
176; MAC-LABEL: log_f64:
177; MAC:       ## %bb.0:
178; MAC-NEXT:    jmp _log ## TAILCALL
179  %r = tail call nnan ninf double @llvm.log.f64(double %x)
180  ret double %r
181}
182
183define x86_fp80 @log_f80(x86_fp80 %x) #0 {
184; GNU-LABEL: log_f80:
185; GNU:       # %bb.0:
186; GNU-NEXT:    subq $24, %rsp
187; GNU-NEXT:    fldt {{[0-9]+}}(%rsp)
188; GNU-NEXT:    fstpt (%rsp)
189; GNU-NEXT:    callq logl
190; GNU-NEXT:    addq $24, %rsp
191; GNU-NEXT:    retq
192;
193; WIN-LABEL: log_f80:
194; WIN:       # %bb.0:
195; WIN-NEXT:    pushq %rsi
196; WIN-NEXT:    subq $64, %rsp
197; WIN-NEXT:    movq %rcx, %rsi
198; WIN-NEXT:    fldt (%rdx)
199; WIN-NEXT:    fstpt {{[0-9]+}}(%rsp)
200; WIN-NEXT:    leaq {{[0-9]+}}(%rsp), %rcx
201; WIN-NEXT:    leaq {{[0-9]+}}(%rsp), %rdx
202; WIN-NEXT:    callq logl
203; WIN-NEXT:    fldt {{[0-9]+}}(%rsp)
204; WIN-NEXT:    fstpt (%rsi)
205; WIN-NEXT:    movq %rsi, %rax
206; WIN-NEXT:    addq $64, %rsp
207; WIN-NEXT:    popq %rsi
208; WIN-NEXT:    retq
209;
210; MAC-LABEL: log_f80:
211; MAC:       ## %bb.0:
212; MAC-NEXT:    subq $24, %rsp
213; MAC-NEXT:    fldt {{[0-9]+}}(%rsp)
214; MAC-NEXT:    fstpt (%rsp)
215; MAC-NEXT:    callq _logl
216; MAC-NEXT:    addq $24, %rsp
217; MAC-NEXT:    retq
218  %r = tail call nnan ninf x86_fp80 @llvm.log.f80(x86_fp80 %x)
219  ret x86_fp80 %r
220}
221
222define float @log2_f32(float %x) #0 {
223; GNU-LABEL: log2_f32:
224; GNU:       # %bb.0:
225; GNU-NEXT:    jmp log2f@PLT # TAILCALL
226;
227; WIN-LABEL: log2_f32:
228; WIN:       # %bb.0:
229; WIN-NEXT:    jmp log2f # TAILCALL
230;
231; MAC-LABEL: log2_f32:
232; MAC:       ## %bb.0:
233; MAC-NEXT:    jmp _log2f ## TAILCALL
234  %r = tail call nnan ninf float @llvm.log2.f32(float %x)
235  ret float %r
236}
237
238define double @log2_f64(double %x) #0 {
239; GNU-LABEL: log2_f64:
240; GNU:       # %bb.0:
241; GNU-NEXT:    jmp log2@PLT # TAILCALL
242;
243; WIN-LABEL: log2_f64:
244; WIN:       # %bb.0:
245; WIN-NEXT:    jmp log2 # TAILCALL
246;
247; MAC-LABEL: log2_f64:
248; MAC:       ## %bb.0:
249; MAC-NEXT:    jmp _log2 ## TAILCALL
250  %r = tail call nnan ninf double @llvm.log2.f64(double %x)
251  ret double %r
252}
253
254define x86_fp80 @log2_f80(x86_fp80 %x) #0 {
255; GNU-LABEL: log2_f80:
256; GNU:       # %bb.0:
257; GNU-NEXT:    subq $24, %rsp
258; GNU-NEXT:    fldt {{[0-9]+}}(%rsp)
259; GNU-NEXT:    fstpt (%rsp)
260; GNU-NEXT:    callq log2l
261; GNU-NEXT:    addq $24, %rsp
262; GNU-NEXT:    retq
263;
264; WIN-LABEL: log2_f80:
265; WIN:       # %bb.0:
266; WIN-NEXT:    pushq %rsi
267; WIN-NEXT:    subq $64, %rsp
268; WIN-NEXT:    movq %rcx, %rsi
269; WIN-NEXT:    fldt (%rdx)
270; WIN-NEXT:    fstpt {{[0-9]+}}(%rsp)
271; WIN-NEXT:    leaq {{[0-9]+}}(%rsp), %rcx
272; WIN-NEXT:    leaq {{[0-9]+}}(%rsp), %rdx
273; WIN-NEXT:    callq log2l
274; WIN-NEXT:    fldt {{[0-9]+}}(%rsp)
275; WIN-NEXT:    fstpt (%rsi)
276; WIN-NEXT:    movq %rsi, %rax
277; WIN-NEXT:    addq $64, %rsp
278; WIN-NEXT:    popq %rsi
279; WIN-NEXT:    retq
280;
281; MAC-LABEL: log2_f80:
282; MAC:       ## %bb.0:
283; MAC-NEXT:    subq $24, %rsp
284; MAC-NEXT:    fldt {{[0-9]+}}(%rsp)
285; MAC-NEXT:    fstpt (%rsp)
286; MAC-NEXT:    callq _log2l
287; MAC-NEXT:    addq $24, %rsp
288; MAC-NEXT:    retq
289  %r = tail call nnan ninf x86_fp80 @llvm.log2.f80(x86_fp80 %x)
290  ret x86_fp80 %r
291}
292
293define float @log10_f32(float %x) #0 {
294; GNU-LABEL: log10_f32:
295; GNU:       # %bb.0:
296; GNU-NEXT:    jmp log10f@PLT # TAILCALL
297;
298; WIN-LABEL: log10_f32:
299; WIN:       # %bb.0:
300; WIN-NEXT:    jmp log10f # TAILCALL
301;
302; MAC-LABEL: log10_f32:
303; MAC:       ## %bb.0:
304; MAC-NEXT:    jmp _log10f ## TAILCALL
305  %r = tail call nnan ninf float @llvm.log10.f32(float %x)
306  ret float %r
307}
308
309define double @log10_f64(double %x) #0 {
310; GNU-LABEL: log10_f64:
311; GNU:       # %bb.0:
312; GNU-NEXT:    jmp log10@PLT # TAILCALL
313;
314; WIN-LABEL: log10_f64:
315; WIN:       # %bb.0:
316; WIN-NEXT:    jmp log10 # TAILCALL
317;
318; MAC-LABEL: log10_f64:
319; MAC:       ## %bb.0:
320; MAC-NEXT:    jmp _log10 ## TAILCALL
321  %r = tail call nnan ninf double @llvm.log10.f64(double %x)
322  ret double %r
323}
324
325define x86_fp80 @log10_f80(x86_fp80 %x) #0 {
326; GNU-LABEL: log10_f80:
327; GNU:       # %bb.0:
328; GNU-NEXT:    subq $24, %rsp
329; GNU-NEXT:    fldt {{[0-9]+}}(%rsp)
330; GNU-NEXT:    fstpt (%rsp)
331; GNU-NEXT:    callq log10l
332; GNU-NEXT:    addq $24, %rsp
333; GNU-NEXT:    retq
334;
335; WIN-LABEL: log10_f80:
336; WIN:       # %bb.0:
337; WIN-NEXT:    pushq %rsi
338; WIN-NEXT:    subq $64, %rsp
339; WIN-NEXT:    movq %rcx, %rsi
340; WIN-NEXT:    fldt (%rdx)
341; WIN-NEXT:    fstpt {{[0-9]+}}(%rsp)
342; WIN-NEXT:    leaq {{[0-9]+}}(%rsp), %rcx
343; WIN-NEXT:    leaq {{[0-9]+}}(%rsp), %rdx
344; WIN-NEXT:    callq log10l
345; WIN-NEXT:    fldt {{[0-9]+}}(%rsp)
346; WIN-NEXT:    fstpt (%rsi)
347; WIN-NEXT:    movq %rsi, %rax
348; WIN-NEXT:    addq $64, %rsp
349; WIN-NEXT:    popq %rsi
350; WIN-NEXT:    retq
351;
352; MAC-LABEL: log10_f80:
353; MAC:       ## %bb.0:
354; MAC-NEXT:    subq $24, %rsp
355; MAC-NEXT:    fldt {{[0-9]+}}(%rsp)
356; MAC-NEXT:    fstpt (%rsp)
357; MAC-NEXT:    callq _log10l
358; MAC-NEXT:    addq $24, %rsp
359; MAC-NEXT:    retq
360  %r = tail call nnan ninf x86_fp80 @llvm.log10.f80(x86_fp80 %x)
361  ret x86_fp80 %r
362}
363
364define float @pow_f32(float %x) #0 {
365; GNU-LABEL: pow_f32:
366; GNU:       # %bb.0:
367; GNU-NEXT:    movaps %xmm0, %xmm1
368; GNU-NEXT:    jmp powf@PLT # TAILCALL
369;
370; WIN-LABEL: pow_f32:
371; WIN:       # %bb.0:
372; WIN-NEXT:    movaps %xmm0, %xmm1
373; WIN-NEXT:    jmp powf # TAILCALL
374;
375; MAC-LABEL: pow_f32:
376; MAC:       ## %bb.0:
377; MAC-NEXT:    movaps %xmm0, %xmm1
378; MAC-NEXT:    jmp _powf ## TAILCALL
379  %r = tail call nnan ninf float @llvm.pow.f32(float %x, float %x)
380  ret float %r
381}
382
383define double @pow_f64(double %x) #0 {
384; GNU-LABEL: pow_f64:
385; GNU:       # %bb.0:
386; GNU-NEXT:    movaps %xmm0, %xmm1
387; GNU-NEXT:    jmp pow@PLT # TAILCALL
388;
389; WIN-LABEL: pow_f64:
390; WIN:       # %bb.0:
391; WIN-NEXT:    movaps %xmm0, %xmm1
392; WIN-NEXT:    jmp pow # TAILCALL
393;
394; MAC-LABEL: pow_f64:
395; MAC:       ## %bb.0:
396; MAC-NEXT:    movaps %xmm0, %xmm1
397; MAC-NEXT:    jmp _pow ## TAILCALL
398  %r = tail call nnan ninf double @llvm.pow.f64(double %x, double %x)
399  ret double %r
400}
401
402define x86_fp80 @pow_f80(x86_fp80 %x) #0 {
403; GNU-LABEL: pow_f80:
404; GNU:       # %bb.0:
405; GNU-NEXT:    subq $40, %rsp
406; GNU-NEXT:    fldt {{[0-9]+}}(%rsp)
407; GNU-NEXT:    fld %st(0)
408; GNU-NEXT:    fstpt {{[0-9]+}}(%rsp)
409; GNU-NEXT:    fstpt (%rsp)
410; GNU-NEXT:    callq powl
411; GNU-NEXT:    addq $40, %rsp
412; GNU-NEXT:    retq
413;
414; WIN-LABEL: pow_f80:
415; WIN:       # %bb.0:
416; WIN-NEXT:    pushq %rsi
417; WIN-NEXT:    subq $80, %rsp
418; WIN-NEXT:    movq %rcx, %rsi
419; WIN-NEXT:    fldt (%rdx)
420; WIN-NEXT:    fld %st(0)
421; WIN-NEXT:    fstpt {{[0-9]+}}(%rsp)
422; WIN-NEXT:    fstpt {{[0-9]+}}(%rsp)
423; WIN-NEXT:    leaq {{[0-9]+}}(%rsp), %rcx
424; WIN-NEXT:    leaq {{[0-9]+}}(%rsp), %rdx
425; WIN-NEXT:    leaq {{[0-9]+}}(%rsp), %r8
426; WIN-NEXT:    callq powl
427; WIN-NEXT:    fldt {{[0-9]+}}(%rsp)
428; WIN-NEXT:    fstpt (%rsi)
429; WIN-NEXT:    movq %rsi, %rax
430; WIN-NEXT:    addq $80, %rsp
431; WIN-NEXT:    popq %rsi
432; WIN-NEXT:    retq
433;
434; MAC-LABEL: pow_f80:
435; MAC:       ## %bb.0:
436; MAC-NEXT:    subq $40, %rsp
437; MAC-NEXT:    fldt {{[0-9]+}}(%rsp)
438; MAC-NEXT:    fld %st(0)
439; MAC-NEXT:    fstpt {{[0-9]+}}(%rsp)
440; MAC-NEXT:    fstpt (%rsp)
441; MAC-NEXT:    callq _powl
442; MAC-NEXT:    addq $40, %rsp
443; MAC-NEXT:    retq
444  %r = tail call nnan ninf x86_fp80 @llvm.pow.f80(x86_fp80 %x, x86_fp80 %x)
445  ret x86_fp80 %r
446}
447
448declare float @llvm.exp.f32(float) #1
449declare double @llvm.exp.f64(double) #1
450declare x86_fp80 @llvm.exp.f80(x86_fp80) #1
451
452declare float @llvm.exp2.f32(float) #1
453declare double @llvm.exp2.f64(double) #1
454declare x86_fp80 @llvm.exp2.f80(x86_fp80) #1
455
456declare float @llvm.log.f32(float) #1
457declare double @llvm.log.f64(double) #1
458declare x86_fp80 @llvm.log.f80(x86_fp80) #1
459
460declare float @llvm.log2.f32(float) #1
461declare double @llvm.log2.f64(double) #1
462declare x86_fp80 @llvm.log2.f80(x86_fp80) #1
463
464declare float @llvm.log10.f32(float) #1
465declare double @llvm.log10.f64(double) #1
466declare x86_fp80 @llvm.log10.f80(x86_fp80) #1
467
468declare float @llvm.pow.f32(float, float) #1
469declare double @llvm.pow.f64(double, double) #1
470declare x86_fp80 @llvm.pow.f80(x86_fp80, x86_fp80) #1
471
472attributes #0 = { nounwind "no-infs-fp-math"="true" "no-nans-fp-math"="true" }
473attributes #1 = { nounwind readnone speculatable }
474
475