1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399
|
//===--- NumericsShims.h --------------------------------------*- swift -*-===//
//
// This source file is part of the Swift Numerics open source project
//
// Copyright (c) 2019-2020 Apple Inc. and the Swift Numerics project authors
// Licensed under Apache License v2.0 with Runtime Library Exception
//
// See https://swift.org/LICENSE.txt for license information
//
//===----------------------------------------------------------------------===//
#define HEADER_SHIM static inline __attribute__((__always_inline__))
// This header uses most of the libm functions, but we don't want to end up
// exporting the libm declarations to modules that include NumericsShims, so
// we don't want to actually #include <math.h>.
//
// For most of the functions, we can get around this by using __builtin_func
// instead of func, since the compiler knows about these operations, but for
// the non-standard extensions, we need to include our own declarations. This
// is a little bit risky, in that we might end up missing an attribute that
// gets added and effects calling conventions, etc, but that's expected to be
// exceedingly rare.
//
// Still, we'll eventually want to find a better solution to this problem,
// especially if people start using this package on systems that are not
// Darwin or Ubuntu.
// MARK: - math functions for float
HEADER_SHIM float libm_cosf(float x) {
return __builtin_cosf(x);
}
HEADER_SHIM float libm_sinf(float x) {
return __builtin_sinf(x);
}
HEADER_SHIM float libm_tanf(float x) {
return __builtin_tanf(x);
}
HEADER_SHIM float libm_acosf(float x) {
return __builtin_acosf(x);
}
HEADER_SHIM float libm_asinf(float x) {
return __builtin_asinf(x);
}
HEADER_SHIM float libm_atanf(float x) {
return __builtin_atanf(x);
}
HEADER_SHIM float libm_coshf(float x) {
return __builtin_coshf(x);
}
HEADER_SHIM float libm_sinhf(float x) {
return __builtin_sinhf(x);
}
HEADER_SHIM float libm_tanhf(float x) {
return __builtin_tanhf(x);
}
HEADER_SHIM float libm_acoshf(float x) {
return __builtin_acoshf(x);
}
HEADER_SHIM float libm_asinhf(float x) {
return __builtin_asinhf(x);
}
HEADER_SHIM float libm_atanhf(float x) {
return __builtin_atanhf(x);
}
HEADER_SHIM float libm_expf(float x) {
return __builtin_expf(x);
}
HEADER_SHIM float libm_expm1f(float x) {
return __builtin_expm1f(x);
}
HEADER_SHIM float libm_logf(float x) {
return __builtin_logf(x);
}
HEADER_SHIM float libm_log1pf(float x) {
return __builtin_log1pf(x);
}
HEADER_SHIM float libm_powf(float x, float y) {
return __builtin_powf(x, y);
}
HEADER_SHIM float libm_cbrtf(float x) {
return __builtin_cbrtf(x);
}
HEADER_SHIM float libm_atan2f(float y, float x) {
return __builtin_atan2f(y, x);
}
HEADER_SHIM float libm_erff(float x) {
return __builtin_erff(x);
}
HEADER_SHIM float libm_erfcf(float x) {
return __builtin_erfcf(x);
}
HEADER_SHIM float libm_exp2f(float x) {
return __builtin_exp2f(x);
}
#if __APPLE__
HEADER_SHIM float libm_exp10f(float x) {
extern float __exp10f(float);
return __exp10f(x);
}
#endif
HEADER_SHIM float libm_hypotf(float x, float y) {
#if defined(_WIN32)
extern float _hypotf(float, float);
return _hypotf(x, y);
#else
return __builtin_hypotf(x, y);
#endif
}
HEADER_SHIM float libm_tgammaf(float x) {
return __builtin_tgammaf(x);
}
HEADER_SHIM float libm_log2f(float x) {
return __builtin_log2f(x);
}
HEADER_SHIM float libm_log10f(float x) {
return __builtin_log10f(x);
}
#if !defined _WIN32
HEADER_SHIM float libm_lgammaf(float x, int *signp) {
extern float lgammaf_r(float, int *);
return lgammaf_r(x, signp);
}
#endif
// MARK: - math functions for double
HEADER_SHIM double libm_cos(double x) {
return __builtin_cos(x);
}
HEADER_SHIM double libm_sin(double x) {
return __builtin_sin(x);
}
HEADER_SHIM double libm_tan(double x) {
return __builtin_tan(x);
}
HEADER_SHIM double libm_acos(double x) {
return __builtin_acos(x);
}
HEADER_SHIM double libm_asin(double x) {
return __builtin_asin(x);
}
HEADER_SHIM double libm_atan(double x) {
return __builtin_atan(x);
}
HEADER_SHIM double libm_cosh(double x) {
return __builtin_cosh(x);
}
HEADER_SHIM double libm_sinh(double x) {
return __builtin_sinh(x);
}
HEADER_SHIM double libm_tanh(double x) {
return __builtin_tanh(x);
}
HEADER_SHIM double libm_acosh(double x) {
return __builtin_acosh(x);
}
HEADER_SHIM double libm_asinh(double x) {
return __builtin_asinh(x);
}
HEADER_SHIM double libm_atanh(double x) {
return __builtin_atanh(x);
}
HEADER_SHIM double libm_exp(double x) {
return __builtin_exp(x);
}
HEADER_SHIM double libm_expm1(double x) {
return __builtin_expm1(x);
}
HEADER_SHIM double libm_log(double x) {
return __builtin_log(x);
}
HEADER_SHIM double libm_log1p(double x) {
return __builtin_log1p(x);
}
HEADER_SHIM double libm_pow(double x, double y) {
return __builtin_pow(x, y);
}
HEADER_SHIM double libm_cbrt(double x) {
return __builtin_cbrt(x);
}
HEADER_SHIM double libm_atan2(double y, double x) {
return __builtin_atan2(y, x);
}
HEADER_SHIM double libm_erf(double x) {
return __builtin_erf(x);
}
HEADER_SHIM double libm_erfc(double x) {
return __builtin_erfc(x);
}
HEADER_SHIM double libm_exp2(double x) {
return __builtin_exp2(x);
}
#if __APPLE__
HEADER_SHIM double libm_exp10(double x) {
extern double __exp10(double);
return __exp10(x);
}
#endif
HEADER_SHIM double libm_hypot(double x, double y) {
return __builtin_hypot(x, y);
}
HEADER_SHIM double libm_tgamma(double x) {
return __builtin_tgamma(x);
}
HEADER_SHIM double libm_log2(double x) {
return __builtin_log2(x);
}
HEADER_SHIM double libm_log10(double x) {
return __builtin_log10(x);
}
#if !defined _WIN32
HEADER_SHIM double libm_lgamma(double x, int *signp) {
extern double lgamma_r(double, int *);
return lgamma_r(x, signp);
}
#endif
// MARK: - math functions for float80
#if !defined _WIN32 && (defined __i386__ || defined __x86_64__)
HEADER_SHIM long double libm_cosl(long double x) {
return __builtin_cosl(x);
}
HEADER_SHIM long double libm_sinl(long double x) {
return __builtin_sinl(x);
}
HEADER_SHIM long double libm_tanl(long double x) {
return __builtin_tanl(x);
}
HEADER_SHIM long double libm_acosl(long double x) {
return __builtin_acosl(x);
}
HEADER_SHIM long double libm_asinl(long double x) {
return __builtin_asinl(x);
}
HEADER_SHIM long double libm_atanl(long double x) {
return __builtin_atanl(x);
}
HEADER_SHIM long double libm_coshl(long double x) {
return __builtin_coshl(x);
}
HEADER_SHIM long double libm_sinhl(long double x) {
return __builtin_sinhl(x);
}
HEADER_SHIM long double libm_tanhl(long double x) {
return __builtin_tanhl(x);
}
HEADER_SHIM long double libm_acoshl(long double x) {
return __builtin_acoshl(x);
}
HEADER_SHIM long double libm_asinhl(long double x) {
return __builtin_asinhl(x);
}
HEADER_SHIM long double libm_atanhl(long double x) {
return __builtin_atanhl(x);
}
HEADER_SHIM long double libm_expl(long double x) {
return __builtin_expl(x);
}
HEADER_SHIM long double libm_expm1l(long double x) {
return __builtin_expm1l(x);
}
HEADER_SHIM long double libm_logl(long double x) {
return __builtin_logl(x);
}
HEADER_SHIM long double libm_log1pl(long double x) {
return __builtin_log1pl(x);
}
HEADER_SHIM long double libm_powl(long double x, long double y) {
return __builtin_powl(x, y);
}
HEADER_SHIM long double libm_cbrtl(long double x) {
return __builtin_cbrtl(x);
}
HEADER_SHIM long double libm_atan2l(long double y, long double x) {
return __builtin_atan2l(y, x);
}
HEADER_SHIM long double libm_erfl(long double x) {
return __builtin_erfl(x);
}
HEADER_SHIM long double libm_erfcl(long double x) {
return __builtin_erfcl(x);
}
HEADER_SHIM long double libm_exp2l(long double x) {
return __builtin_exp2l(x);
}
HEADER_SHIM long double libm_hypotl(long double x, long double y) {
return __builtin_hypotl(x, y);
}
HEADER_SHIM long double libm_tgammal(long double x) {
return __builtin_tgammal(x);
}
HEADER_SHIM long double libm_log2l(long double x) {
return __builtin_log2l(x);
}
HEADER_SHIM long double libm_log10l(long double x) {
return __builtin_log10l(x);
}
HEADER_SHIM long double libm_lgammal(long double x, int *signp) {
extern long double lgammal_r(long double, int *);
return lgammal_r(x, signp);
}
#endif
// MARK: - fast mul-add inlines
/// a*b + c evaluated _either_ as two operations or fma, whichever is faster.
HEADER_SHIM float _numerics_muladdf(float a, float b, float c) {
#pragma STDC FP_CONTRACT ON
return a*b + c;
}
/// a*b + c evaluated _either_ as two operations or fma, whichever is faster.
HEADER_SHIM double _numerics_muladd(double a, double b, double c) {
#pragma STDC FP_CONTRACT ON
return a*b + c;
}
// No long-double muladd operation, because no one has built an FMA for it
// (except for Itanium, which Swift doesn't support).
|