[SimplifyLibCalls] Remove useless bits of this tests.
[oota-llvm.git] / test / Transforms / InstCombine / win-math.ll
1 ; RUN: opt -O2 -S -mtriple=i386-pc-win32 < %s | FileCheck %s -check-prefix=WIN32
2 ; RUN: opt -O2 -S -mtriple=x86_64-pc-win32 < %s | FileCheck %s -check-prefix=WIN64
3 ; RUN: opt -O2 -S -mtriple=i386-pc-mingw32 < %s | FileCheck %s -check-prefix=MINGW32
4 ; RUN: opt -O2 -S -mtriple=x86_64-pc-mingw32 < %s | FileCheck %s -check-prefix=MINGW64
5
6 ; x86 win32 msvcrt does not provide entry points for single-precision libm.
7 ; x86-64 win32 msvcrt does (except for fabsf)
8 ; msvcrt does not provide C99 math, but mingw32 does.
9
10 declare double @acos(double %x)
11 define float @float_acos(float %x) nounwind readnone {
12 ; WIN32-LABEL: @float_acos(
13 ; WIN32-NOT: float @acosf
14 ; WIN32: double @acos
15     %1 = fpext float %x to double
16     %2 = call double @acos(double %1)
17     %3 = fptrunc double %2 to float
18     ret float %3
19 }
20
21 declare double @asin(double %x)
22 define float @float_asin(float %x) nounwind readnone {
23 ; WIN32-LABEL: @float_asin(
24 ; WIN32-NOT: float @asinf
25 ; WIN32: double @asin
26     %1 = fpext float %x to double
27     %2 = call double @asin(double %1)
28     %3 = fptrunc double %2 to float
29     ret float %3
30 }
31
32 declare double @atan(double %x)
33 define float @float_atan(float %x) nounwind readnone {
34 ; WIN32-LABEL: @float_atan(
35 ; WIN32-NOT: float @atanf
36 ; WIN32: double @atan
37     %1 = fpext float %x to double
38     %2 = call double @atan(double %1)
39     %3 = fptrunc double %2 to float
40     ret float %3
41 }
42
43 declare double @atan2(double %x, double %y)
44 define float @float_atan2(float %x, float %y) nounwind readnone {
45 ; WIN32-LABEL: @float_atan2(
46 ; WIN32-NOT: float @atan2f
47 ; WIN32: double @atan2
48     %1 = fpext float %x to double
49     %2 = fpext float %y to double
50     %3 = call double @atan2(double %1, double %2)
51     %4 = fptrunc double %3 to float
52     ret float %4
53 }
54
55 declare double @ceil(double %x)
56 define float @float_ceil(float %x) nounwind readnone {
57 ; WIN32-LABEL: @float_ceil(
58 ; WIN32-NOT: float @ceilf
59 ; WIN32: double @ceil
60 ; WIN64-LABEL: @float_ceil(
61 ; WIN64: float @ceilf
62 ; WIN64-NOT: double @ceil
63 ; MINGW32-LABEL: @float_ceil(
64 ; MINGW32: float @ceilf
65 ; MINGW32-NOT: double @ceil
66 ; MINGW64-LABEL: @float_ceil(
67 ; MINGW64: float @ceilf
68 ; MINGW64-NOT: double @ceil
69     %1 = fpext float %x to double
70     %2 = call double @ceil(double %1)
71     %3 = fptrunc double %2 to float
72     ret float %3
73 }
74
75 declare double @_copysign(double %x)
76 define float @float_copysign(float %x) nounwind readnone {
77 ; WIN32-LABEL: @float_copysign(
78 ; WIN32-NOT: float @copysignf
79 ; WIN32-NOT: float @_copysignf
80 ; WIN32: double @_copysign
81     %1 = fpext float %x to double
82     %2 = call double @_copysign(double %1)
83     %3 = fptrunc double %2 to float
84     ret float %3
85 }
86
87 declare double @cos(double %x)
88 define float @float_cos(float %x) nounwind readnone {
89 ; WIN32-LABEL: @float_cos(
90 ; WIN32-NOT: float @cosf
91 ; WIN32: double @cos
92     %1 = fpext float %x to double
93     %2 = call double @cos(double %1)
94     %3 = fptrunc double %2 to float
95     ret float %3
96 }
97
98 declare double @cosh(double %x)
99 define float @float_cosh(float %x) nounwind readnone {
100 ; WIN32-LABEL: @float_cosh(
101 ; WIN32-NOT: float @coshf
102 ; WIN32: double @cosh
103     %1 = fpext float %x to double
104     %2 = call double @cosh(double %1)
105     %3 = fptrunc double %2 to float
106     ret float %3
107 }
108
109 declare double @exp(double %x, double %y)
110 define float @float_exp(float %x, float %y) nounwind readnone {
111 ; WIN32-LABEL: @float_exp(
112 ; WIN32-NOT: float @expf
113 ; WIN32: double @exp
114     %1 = fpext float %x to double
115     %2 = fpext float %y to double
116     %3 = call double @exp(double %1, double %2)
117     %4 = fptrunc double %3 to float
118     ret float %4
119 }
120
121 declare double @fabs(double %x, double %y)
122 define float @float_fabs(float %x, float %y) nounwind readnone {
123 ; WIN32-LABEL: @float_fabs(
124 ; WIN32-NOT: float @fabsf
125 ; WIN32: double @fabs
126 ; WIN64-LABEL: @float_fabs(
127 ; WIN64-NOT: float @fabsf
128 ; WIN64: double @fabs
129     %1 = fpext float %x to double
130     %2 = fpext float %y to double
131     %3 = call double @fabs(double %1, double %2)
132     %4 = fptrunc double %3 to float
133     ret float %4
134 }
135
136 declare double @floor(double %x)
137 define float @float_floor(float %x) nounwind readnone {
138 ; WIN32-LABEL: @float_floor(
139 ; WIN32-NOT: float @floorf
140 ; WIN32: double @floor
141 ; WIN64-LABEL: @float_floor(
142 ; WIN64: float @floorf
143 ; WIN64-NOT: double @floor
144 ; MINGW32-LABEL: @float_floor(
145 ; MINGW32: float @floorf
146 ; MINGW32-NOT: double @floor
147 ; MINGW64-LABEL: @float_floor(
148 ; MINGW64: float @floorf
149 ; MINGW64-NOT: double @floor
150     %1 = fpext float %x to double
151     %2 = call double @floor(double %1)
152     %3 = fptrunc double %2 to float
153     ret float %3
154 }
155
156 declare double @fmod(double %x, double %y)
157 define float @float_fmod(float %x, float %y) nounwind readnone {
158 ; WIN32-LABEL: @float_fmod(
159 ; WIN32-NOT: float @fmodf
160 ; WIN32: double @fmod
161     %1 = fpext float %x to double
162     %2 = fpext float %y to double
163     %3 = call double @fmod(double %1, double %2)
164     %4 = fptrunc double %3 to float
165     ret float %4
166 }
167
168 declare double @log(double %x)
169 define float @float_log(float %x) nounwind readnone {
170 ; WIN32-LABEL: @float_log(
171 ; WIN32-NOT: float @logf
172 ; WIN32: double @log
173     %1 = fpext float %x to double
174     %2 = call double @log(double %1)
175     %3 = fptrunc double %2 to float
176     ret float %3
177 }
178
179 declare double @pow(double %x, double %y)
180 define float @float_pow(float %x, float %y) nounwind readnone {
181 ; WIN32-LABEL: @float_pow(
182 ; WIN32-NOT: float @powf
183 ; WIN32: double @pow
184     %1 = fpext float %x to double
185     %2 = fpext float %y to double
186     %3 = call double @pow(double %1, double %2)
187     %4 = fptrunc double %3 to float
188     ret float %4
189 }
190
191 declare double @sin(double %x)
192 define float @float_sin(float %x) nounwind readnone {
193 ; WIN32-LABEL: @float_sin(
194 ; WIN32-NOT: float @sinf
195 ; WIN32: double @sin
196     %1 = fpext float %x to double
197     %2 = call double @sin(double %1)
198     %3 = fptrunc double %2 to float
199     ret float %3
200 }
201
202 declare double @sinh(double %x)
203 define float @float_sinh(float %x) nounwind readnone {
204 ; WIN32-LABEL: @float_sinh(
205 ; WIN32-NOT: float @sinhf
206 ; WIN32: double @sinh
207     %1 = fpext float %x to double
208     %2 = call double @sinh(double %1)
209     %3 = fptrunc double %2 to float
210     ret float %3
211 }
212
213 declare double @sqrt(double %x)
214 define float @float_sqrt(float %x) nounwind readnone {
215 ; WIN32-LABEL: @float_sqrt(
216 ; WIN32-NOT: float @sqrtf
217 ; WIN32: double @sqrt
218 ; WIN64-LABEL: @float_sqrt(
219 ; WIN64: float @sqrtf
220 ; WIN64-NOT: double @sqrt
221 ; MINGW32-LABEL: @float_sqrt(
222 ; MINGW32: float @sqrtf
223 ; MINGW32-NOT: double @sqrt
224 ; MINGW64-LABEL: @float_sqrt(
225 ; MINGW64: float @sqrtf
226 ; MINGW64-NOT: double @sqrt
227     %1 = fpext float %x to double
228     %2 = call double @sqrt(double %1)
229     %3 = fptrunc double %2 to float
230     ret float %3
231 }
232
233 declare double @tan(double %x)
234 define float @float_tan(float %x) nounwind readnone {
235 ; WIN32-LABEL: @float_tan(
236 ; WIN32-NOT: float @tanf
237 ; WIN32: double @tan
238     %1 = fpext float %x to double
239     %2 = call double @tan(double %1)
240     %3 = fptrunc double %2 to float
241     ret float %3
242 }
243
244 declare double @tanh(double %x)
245 define float @float_tanh(float %x) nounwind readnone {
246 ; WIN32-LABEL: @float_tanh(
247 ; WIN32-NOT: float @tanhf
248 ; WIN32: double @tanh
249     %1 = fpext float %x to double
250     %2 = call double @tanh(double %1)
251     %3 = fptrunc double %2 to float
252     ret float %3
253 }
254
255 ; win32 does not have round; mingw32 does
256 declare double @round(double %x)
257 define float @float_round(float %x) nounwind readnone {
258 ; WIN32-LABEL: @float_round(
259 ; WIN32-NOT: float @roundf
260 ; WIN32: double @round
261 ; WIN64-LABEL: @float_round(
262 ; WIN64-NOT: float @roundf
263 ; WIN64: double @round
264 ; MINGW32-LABEL: @float_round(
265 ; MINGW32: float @roundf
266 ; MINGW32-NOT: double @round
267 ; MINGW64-LABEL: @float_round(
268 ; MINGW64: float @roundf
269 ; MINGW64-NOT: double @round
270     %1 = fpext float %x to double
271     %2 = call double @round(double %1)
272     %3 = fptrunc double %2 to float
273     ret float %3
274 }
275
276 declare float @powf(float, float)
277 ; win32 lacks sqrtf&fabsf, win64 lacks fabsf
278 define float @float_powsqrt(float %x) nounwind readnone {
279 ; WIN32-LABEL: @float_powsqrt(
280 ; WIN32-NOT: float @sqrtf
281 ; WIN32: float @powf
282 ; WIN64-LABEL: @float_powsqrt(
283 ; WIN64-NOT: float @sqrtf
284 ; WIN64: float @powf
285 ; MINGW32-LABEL: @float_powsqrt(
286 ; MINGW32: float @sqrtf
287 ; MINGW32: float @fabsf
288 ; MINGW32-NOT: float @powf
289 ; MINGW64-LABEL: @float_powsqrt(
290 ; MINGW64: float @sqrtf
291 ; MINGW64: float @fabsf
292 ; MINGW64-NOT: float @powf
293     %1 = call float @powf(float %x, float 0.5)
294     ret float %1
295 }