[SystemZ] Fix expansion of ISD::FPOW and ISD::FSINCOS
[oota-llvm.git] / test / CodeGen / SystemZ / fp-libcall.ll
1 ; Test that library calls are emitted for LLVM IR intrinsics
2 ;
3 ; RUN: llc < %s -mtriple=s390x-linux-gnu | FileCheck %s
4
5 define float @f1(float %x, i32 %y) {
6 ; CHECK-LABEL: f1:
7 ; CHECK: brasl %r14, __powisf2@PLT
8   %tmp = call float @llvm.powi.f32(float %x, i32 %y)
9   ret float %tmp
10 }
11
12 define double @f2(double %x, i32 %y) {
13 ; CHECK-LABEL: f2:
14 ; CHECK: brasl %r14, __powidf2@PLT
15   %tmp = call double @llvm.powi.f64(double %x, i32 %y)
16   ret double %tmp
17 }
18
19 define fp128 @f3(fp128 %x, i32 %y) {
20 ; CHECK-LABEL: f3:
21 ; CHECK: brasl %r14, __powitf2@PLT
22   %tmp = call fp128 @llvm.powi.f128(fp128 %x, i32 %y)
23   ret fp128 %tmp
24 }
25
26 define float @f4(float %x, float %y) {
27 ; CHECK-LABEL: f4:
28 ; CHECK: brasl %r14, powf@PLT
29   %tmp = call float @llvm.pow.f32(float %x, float %y)
30   ret float %tmp
31 }
32
33 define double @f5(double %x, double %y) {
34 ; CHECK-LABEL: f5:
35 ; CHECK: brasl %r14, pow@PLT
36   %tmp = call double @llvm.pow.f64(double %x, double %y)
37   ret double %tmp
38 }
39
40 define fp128 @f6(fp128 %x, fp128 %y) {
41 ; CHECK-LABEL: f6:
42 ; CHECK: brasl %r14, powl@PLT
43   %tmp = call fp128 @llvm.pow.f128(fp128 %x, fp128 %y)
44   ret fp128 %tmp
45 }
46
47 define float @f7(float %x) {
48 ; CHECK-LABEL: f7:
49 ; CHECK: brasl %r14, sinf@PLT
50   %tmp = call float @llvm.sin.f32(float %x)
51   ret float %tmp
52 }
53
54 define double @f8(double %x) {
55 ; CHECK-LABEL: f8:
56 ; CHECK: brasl %r14, sin@PLT
57   %tmp = call double @llvm.sin.f64(double %x)
58   ret double %tmp
59 }
60
61 define fp128 @f9(fp128 %x) {
62 ; CHECK-LABEL: f9:
63 ; CHECK: brasl %r14, sinl@PLT
64   %tmp = call fp128 @llvm.sin.f128(fp128 %x)
65   ret fp128 %tmp
66 }
67
68 define float @f10(float %x) {
69 ; CHECK-LABEL: f10:
70 ; CHECK: brasl %r14, cosf@PLT
71   %tmp = call float @llvm.cos.f32(float %x)
72   ret float %tmp
73 }
74
75 define double @f11(double %x) {
76 ; CHECK-LABEL: f11:
77 ; CHECK: brasl %r14, cos@PLT
78   %tmp = call double @llvm.cos.f64(double %x)
79   ret double %tmp
80 }
81
82 define fp128 @f12(fp128 %x) {
83 ; CHECK-LABEL: f12:
84 ; CHECK: brasl %r14, cosl@PLT
85   %tmp = call fp128 @llvm.cos.f128(fp128 %x)
86   ret fp128 %tmp
87 }
88
89 define float @f13(float %x) {
90 ; CHECK-LABEL: f13:
91 ; CHECK: brasl %r14, expf@PLT
92   %tmp = call float @llvm.exp.f32(float %x)
93   ret float %tmp
94 }
95
96 define double @f14(double %x) {
97 ; CHECK-LABEL: f14:
98 ; CHECK: brasl %r14, exp@PLT
99   %tmp = call double @llvm.exp.f64(double %x)
100   ret double %tmp
101 }
102
103 define fp128 @f15(fp128 %x) {
104 ; CHECK-LABEL: f15:
105 ; CHECK: brasl %r14, expl@PLT
106   %tmp = call fp128 @llvm.exp.f128(fp128 %x)
107   ret fp128 %tmp
108 }
109
110 define float @f16(float %x) {
111 ; CHECK-LABEL: f16:
112 ; CHECK: brasl %r14, exp2f@PLT
113   %tmp = call float @llvm.exp2.f32(float %x)
114   ret float %tmp
115 }
116
117 define double @f17(double %x) {
118 ; CHECK-LABEL: f17:
119 ; CHECK: brasl %r14, exp2@PLT
120   %tmp = call double @llvm.exp2.f64(double %x)
121   ret double %tmp
122 }
123
124 define fp128 @f18(fp128 %x) {
125 ; CHECK-LABEL: f18:
126 ; CHECK: brasl %r14, exp2l@PLT
127   %tmp = call fp128 @llvm.exp2.f128(fp128 %x)
128   ret fp128 %tmp
129 }
130
131 define float @f19(float %x) {
132 ; CHECK-LABEL: f19:
133 ; CHECK: brasl %r14, logf@PLT
134   %tmp = call float @llvm.log.f32(float %x)
135   ret float %tmp
136 }
137
138 define double @f20(double %x) {
139 ; CHECK-LABEL: f20:
140 ; CHECK: brasl %r14, log@PLT
141   %tmp = call double @llvm.log.f64(double %x)
142   ret double %tmp
143 }
144
145 define fp128 @f21(fp128 %x) {
146 ; CHECK-LABEL: f21:
147 ; CHECK: brasl %r14, logl@PLT
148   %tmp = call fp128 @llvm.log.f128(fp128 %x)
149   ret fp128 %tmp
150 }
151
152 define float @f22(float %x) {
153 ; CHECK-LABEL: f22:
154 ; CHECK: brasl %r14, log2f@PLT
155   %tmp = call float @llvm.log2.f32(float %x)
156   ret float %tmp
157 }
158
159 define double @f23(double %x) {
160 ; CHECK-LABEL: f23:
161 ; CHECK: brasl %r14, log2@PLT
162   %tmp = call double @llvm.log2.f64(double %x)
163   ret double %tmp
164 }
165
166 define fp128 @f24(fp128 %x) {
167 ; CHECK-LABEL: f24:
168 ; CHECK: brasl %r14, log2l@PLT
169   %tmp = call fp128 @llvm.log2.f128(fp128 %x)
170   ret fp128 %tmp
171 }
172
173 define float @f25(float %x) {
174 ; CHECK-LABEL: f25:
175 ; CHECK: brasl %r14, log10f@PLT
176   %tmp = call float @llvm.log10.f32(float %x)
177   ret float %tmp
178 }
179
180 define double @f26(double %x) {
181 ; CHECK-LABEL: f26:
182 ; CHECK: brasl %r14, log10@PLT
183   %tmp = call double @llvm.log10.f64(double %x)
184   ret double %tmp
185 }
186
187 define fp128 @f27(fp128 %x) {
188 ; CHECK-LABEL: f27:
189 ; CHECK: brasl %r14, log10l@PLT
190   %tmp = call fp128 @llvm.log10.f128(fp128 %x)
191   ret fp128 %tmp
192 }
193
194 define float @f28(float %x, float %y) {
195 ; CHECK-LABEL: f28:
196 ; CHECK: brasl %r14, fminf@PLT
197   %tmp = call float @llvm.minnum.f32(float %x, float %y)
198   ret float %tmp
199 }
200
201 define double @f29(double %x, double %y) {
202 ; CHECK-LABEL: f29:
203 ; CHECK: brasl %r14, fmin@PLT
204   %tmp = call double @llvm.minnum.f64(double %x, double %y)
205   ret double %tmp
206 }
207
208 define fp128 @f30(fp128 %x, fp128 %y) {
209 ; CHECK-LABEL: f30:
210 ; CHECK: brasl %r14, fminl@PLT
211   %tmp = call fp128 @llvm.minnum.f128(fp128 %x, fp128 %y)
212   ret fp128 %tmp
213 }
214
215 define float @f31(float %x, float %y) {
216 ; CHECK-LABEL: f31:
217 ; CHECK: brasl %r14, fmaxf@PLT
218   %tmp = call float @llvm.maxnum.f32(float %x, float %y)
219   ret float %tmp
220 }
221
222 define double @f32(double %x, double %y) {
223 ; CHECK-LABEL: f32:
224 ; CHECK: brasl %r14, fmax@PLT
225   %tmp = call double @llvm.maxnum.f64(double %x, double %y)
226   ret double %tmp
227 }
228
229 define fp128 @f33(fp128 %x, fp128 %y) {
230 ; CHECK-LABEL: f33:
231 ; CHECK: brasl %r14, fmaxl@PLT
232   %tmp = call fp128 @llvm.maxnum.f128(fp128 %x, fp128 %y)
233   ret fp128 %tmp
234 }
235
236 declare float @llvm.powi.f32(float, i32)
237 declare double @llvm.powi.f64(double, i32)
238 declare fp128 @llvm.powi.f128(fp128, i32)
239 declare float @llvm.pow.f32(float, float)
240 declare double @llvm.pow.f64(double, double)
241 declare fp128 @llvm.pow.f128(fp128, fp128)
242
243 declare float @llvm.sin.f32(float)
244 declare double @llvm.sin.f64(double)
245 declare fp128 @llvm.sin.f128(fp128)
246 declare float @llvm.cos.f32(float)
247 declare double @llvm.cos.f64(double)
248 declare fp128 @llvm.cos.f128(fp128)
249
250 declare float @llvm.exp.f32(float)
251 declare double @llvm.exp.f64(double)
252 declare fp128 @llvm.exp.f128(fp128)
253 declare float @llvm.exp2.f32(float)
254 declare double @llvm.exp2.f64(double)
255 declare fp128 @llvm.exp2.f128(fp128)
256
257 declare float @llvm.log.f32(float)
258 declare double @llvm.log.f64(double)
259 declare fp128 @llvm.log.f128(fp128)
260 declare float @llvm.log2.f32(float)
261 declare double @llvm.log2.f64(double)
262 declare fp128 @llvm.log2.f128(fp128)
263 declare float @llvm.log10.f32(float)
264 declare double @llvm.log10.f64(double)
265 declare fp128 @llvm.log10.f128(fp128)
266
267 declare float @llvm.minnum.f32(float, float)
268 declare double @llvm.minnum.f64(double, double)
269 declare fp128 @llvm.minnum.f128(fp128, fp128)
270 declare float @llvm.maxnum.f32(float, float)
271 declare double @llvm.maxnum.f64(double, double)
272 declare fp128 @llvm.maxnum.f128(fp128, fp128)
273