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
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.
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
15 %1 = fpext float %x to double
16 %2 = call double @acos(double %1)
17 %3 = fptrunc double %2 to float
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
26 %1 = fpext float %x to double
27 %2 = call double @asin(double %1)
28 %3 = fptrunc double %2 to float
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
37 %1 = fpext float %x to double
38 %2 = call double @atan(double %1)
39 %3 = fptrunc double %2 to float
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
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
60 ; WIN64-LABEL: @float_ceil(
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
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
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
92 %1 = fpext float %x to double
93 %2 = call double @cos(double %1)
94 %3 = fptrunc double %2 to float
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
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
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
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
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
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
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
173 %1 = fpext float %x to double
174 %2 = call double @log(double %1)
175 %3 = fptrunc double %2 to float
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
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
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
196 %1 = fpext float %x to double
197 %2 = call double @sin(double %1)
198 %3 = fptrunc double %2 to float
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
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
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
238 %1 = fpext float %x to double
239 %2 = call double @tan(double %1)
240 %3 = fptrunc double %2 to float
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
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
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
282 ; WIN64-LABEL: @float_powsqrt(
283 ; WIN64-NOT: float @sqrtf
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)