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