File: _NumericsShims.h

package info (click to toggle)
swiftlang 6.0.3-2
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid, trixie
  • size: 2,519,992 kB
  • sloc: cpp: 9,107,863; ansic: 2,040,022; asm: 1,135,751; python: 296,500; objc: 82,456; f90: 60,502; lisp: 34,951; pascal: 19,946; sh: 18,133; perl: 7,482; ml: 4,937; javascript: 4,117; makefile: 3,840; awk: 3,535; xml: 914; fortran: 619; cs: 573; ruby: 573
file content (399 lines) | stat: -rw-r--r-- 8,906 bytes parent folder | download
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).