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 {
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 {
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 {
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 {
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 {
58 ; WIN32-NOT: float @ceilf
62 ; WIN64-NOT: double @ceil
63 ; MINGW32: @float_ceil
64 ; MINGW32: float @ceilf
65 ; MINGW32-NOT: double @ceil
66 ; MINGW64: @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: @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 {
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 {
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 {
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 {
124 ; WIN32-NOT: float @fabsf
125 ; WIN32: double @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: @float_floor
139 ; WIN32-NOT: float @floorf
140 ; WIN32: double @floor
141 ; WIN64: @float_floor
142 ; WIN64: float @floorf
143 ; WIN64-NOT: double @floor
144 ; MINGW32: @float_floor
145 ; MINGW32: float @floorf
146 ; MINGW32-NOT: double @floor
147 ; MINGW64: @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 {
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 {
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 {
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 {
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 {
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 {
216 ; WIN32-NOT: float @sqrtf
217 ; WIN32: double @sqrt
219 ; WIN64: float @sqrtf
220 ; WIN64-NOT: double @sqrt
221 ; MINGW32: @float_sqrt
222 ; MINGW32: float @sqrtf
223 ; MINGW32-NOT: double @sqrt
224 ; MINGW64: @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 {
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 {
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: @float_round
259 ; WIN32-NOT: float @roundf
260 ; WIN32: double @round
261 ; WIN64: @float_round
262 ; WIN64-NOT: float @roundf
263 ; WIN64: double @round
264 ; MINGW32: @float_round
265 ; MINGW32: float @roundf
266 ; MINGW32-NOT: double @round
267 ; MINGW64: @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