]> git.proxmox.com Git - rustc.git/blob - vendor/compiler_builtins/libm/src/math/mod.rs
New upstream version 1.41.1+dfsg1
[rustc.git] / vendor / compiler_builtins / libm / src / math / mod.rs
1 macro_rules! force_eval {
2 ($e:expr) => {
3 unsafe {
4 ::core::ptr::read_volatile(&$e);
5 }
6 };
7 }
8
9 #[cfg(not(debug_assertions))]
10 macro_rules! i {
11 ($array:expr, $index:expr) => {
12 unsafe { *$array.get_unchecked($index) }
13 };
14 ($array:expr, $index:expr, = , $rhs:expr) => {
15 unsafe {
16 *$array.get_unchecked_mut($index) = $rhs;
17 }
18 };
19 ($array:expr, $index:expr, += , $rhs:expr) => {
20 unsafe {
21 *$array.get_unchecked_mut($index) += $rhs;
22 }
23 };
24 ($array:expr, $index:expr, -= , $rhs:expr) => {
25 unsafe {
26 *$array.get_unchecked_mut($index) -= $rhs;
27 }
28 };
29 ($array:expr, $index:expr, &= , $rhs:expr) => {
30 unsafe {
31 *$array.get_unchecked_mut($index) &= $rhs;
32 }
33 };
34 ($array:expr, $index:expr, == , $rhs:expr) => {
35 unsafe { *$array.get_unchecked_mut($index) == $rhs }
36 };
37 }
38
39 #[cfg(debug_assertions)]
40 macro_rules! i {
41 ($array:expr, $index:expr) => {
42 *$array.get($index).unwrap()
43 };
44 ($array:expr, $index:expr, = , $rhs:expr) => {
45 *$array.get_mut($index).unwrap() = $rhs;
46 };
47 ($array:expr, $index:expr, -= , $rhs:expr) => {
48 *$array.get_mut($index).unwrap() -= $rhs;
49 };
50 ($array:expr, $index:expr, += , $rhs:expr) => {
51 *$array.get_mut($index).unwrap() += $rhs;
52 };
53 ($array:expr, $index:expr, &= , $rhs:expr) => {
54 *$array.get_mut($index).unwrap() &= $rhs;
55 };
56 ($array:expr, $index:expr, == , $rhs:expr) => {
57 *$array.get_mut($index).unwrap() == $rhs
58 };
59 }
60
61 macro_rules! llvm_intrinsically_optimized {
62 (#[cfg($($clause:tt)*)] $e:expr) => {
63 #[cfg(all(feature = "unstable", $($clause)*))]
64 {
65 if true { // thwart the dead code lint
66 $e
67 }
68 }
69 };
70 }
71
72 // Public modules
73 mod acos;
74 mod acosf;
75 mod acosh;
76 mod acoshf;
77 mod asin;
78 mod asinf;
79 mod asinh;
80 mod asinhf;
81 mod atan;
82 mod atan2;
83 mod atan2f;
84 mod atanf;
85 mod atanh;
86 mod atanhf;
87 mod cbrt;
88 mod cbrtf;
89 mod ceil;
90 mod ceilf;
91 mod copysign;
92 mod copysignf;
93 mod cos;
94 mod cosf;
95 mod cosh;
96 mod coshf;
97 mod erf;
98 mod erff;
99 mod exp;
100 mod exp10;
101 mod exp10f;
102 mod exp2;
103 mod exp2f;
104 mod expf;
105 mod expm1;
106 mod expm1f;
107 mod fabs;
108 mod fabsf;
109 mod fdim;
110 mod fdimf;
111 mod floor;
112 mod floorf;
113 mod fma;
114 mod fmaf;
115 mod fmax;
116 mod fmaxf;
117 mod fmin;
118 mod fminf;
119 mod fmod;
120 mod fmodf;
121 mod frexp;
122 mod frexpf;
123 mod hypot;
124 mod hypotf;
125 mod ilogb;
126 mod ilogbf;
127 mod j0;
128 mod j0f;
129 mod j1;
130 mod j1f;
131 mod jn;
132 mod jnf;
133 mod ldexp;
134 mod ldexpf;
135 mod lgamma;
136 mod lgamma_r;
137 mod lgammaf;
138 mod lgammaf_r;
139 mod log;
140 mod log10;
141 mod log10f;
142 mod log1p;
143 mod log1pf;
144 mod log2;
145 mod log2f;
146 mod logf;
147 mod modf;
148 mod modff;
149 mod nextafter;
150 mod nextafterf;
151 mod pow;
152 mod powf;
153 mod remainder;
154 mod remainderf;
155 mod remquo;
156 mod remquof;
157 mod round;
158 mod roundf;
159 mod scalbn;
160 mod scalbnf;
161 mod sin;
162 mod sincos;
163 mod sincosf;
164 mod sinf;
165 mod sinh;
166 mod sinhf;
167 mod sqrt;
168 mod sqrtf;
169 mod tan;
170 mod tanf;
171 mod tanh;
172 mod tanhf;
173 mod tgamma;
174 mod tgammaf;
175 mod trunc;
176 mod truncf;
177
178 // Use separated imports instead of {}-grouped imports for easier merging.
179 pub use self::acos::acos;
180 pub use self::acosf::acosf;
181 pub use self::acosh::acosh;
182 pub use self::acoshf::acoshf;
183 pub use self::asin::asin;
184 pub use self::asinf::asinf;
185 pub use self::asinh::asinh;
186 pub use self::asinhf::asinhf;
187 pub use self::atan::atan;
188 pub use self::atan2::atan2;
189 pub use self::atan2f::atan2f;
190 pub use self::atanf::atanf;
191 pub use self::atanh::atanh;
192 pub use self::atanhf::atanhf;
193 pub use self::cbrt::cbrt;
194 pub use self::cbrtf::cbrtf;
195 pub use self::ceil::ceil;
196 pub use self::ceilf::ceilf;
197 pub use self::copysign::copysign;
198 pub use self::copysignf::copysignf;
199 pub use self::cos::cos;
200 pub use self::cosf::cosf;
201 pub use self::cosh::cosh;
202 pub use self::coshf::coshf;
203 pub use self::erf::erf;
204 pub use self::erf::erfc;
205 pub use self::erff::erfcf;
206 pub use self::erff::erff;
207 pub use self::exp::exp;
208 pub use self::exp10::exp10;
209 pub use self::exp10f::exp10f;
210 pub use self::exp2::exp2;
211 pub use self::exp2f::exp2f;
212 pub use self::expf::expf;
213 pub use self::expm1::expm1;
214 pub use self::expm1f::expm1f;
215 pub use self::fabs::fabs;
216 pub use self::fabsf::fabsf;
217 pub use self::fdim::fdim;
218 pub use self::fdimf::fdimf;
219 pub use self::floor::floor;
220 pub use self::floorf::floorf;
221 pub use self::fma::fma;
222 pub use self::fmaf::fmaf;
223 pub use self::fmax::fmax;
224 pub use self::fmaxf::fmaxf;
225 pub use self::fmin::fmin;
226 pub use self::fminf::fminf;
227 pub use self::fmod::fmod;
228 pub use self::fmodf::fmodf;
229 pub use self::frexp::frexp;
230 pub use self::frexpf::frexpf;
231 pub use self::hypot::hypot;
232 pub use self::hypotf::hypotf;
233 pub use self::ilogb::ilogb;
234 pub use self::ilogbf::ilogbf;
235 pub use self::j0::j0;
236 pub use self::j0::y0;
237 pub use self::j0f::j0f;
238 pub use self::j0f::y0f;
239 pub use self::j1::j1;
240 pub use self::j1::y1;
241 pub use self::j1f::j1f;
242 pub use self::j1f::y1f;
243 pub use self::jn::jn;
244 pub use self::jn::yn;
245 pub use self::jnf::jnf;
246 pub use self::jnf::ynf;
247 pub use self::ldexp::ldexp;
248 pub use self::ldexpf::ldexpf;
249 pub use self::lgamma::lgamma;
250 pub use self::lgamma_r::lgamma_r;
251 pub use self::lgammaf::lgammaf;
252 pub use self::lgammaf_r::lgammaf_r;
253 pub use self::log::log;
254 pub use self::log10::log10;
255 pub use self::log10f::log10f;
256 pub use self::log1p::log1p;
257 pub use self::log1pf::log1pf;
258 pub use self::log2::log2;
259 pub use self::log2f::log2f;
260 pub use self::logf::logf;
261 pub use self::modf::modf;
262 pub use self::modff::modff;
263 pub use self::nextafter::nextafter;
264 pub use self::nextafterf::nextafterf;
265 pub use self::pow::pow;
266 pub use self::powf::powf;
267 pub use self::remainder::remainder;
268 pub use self::remainderf::remainderf;
269 pub use self::remquo::remquo;
270 pub use self::remquof::remquof;
271 pub use self::round::round;
272 pub use self::roundf::roundf;
273 pub use self::scalbn::scalbn;
274 pub use self::scalbnf::scalbnf;
275 pub use self::sin::sin;
276 pub use self::sincos::sincos;
277 pub use self::sincosf::sincosf;
278 pub use self::sinf::sinf;
279 pub use self::sinh::sinh;
280 pub use self::sinhf::sinhf;
281 pub use self::sqrt::sqrt;
282 pub use self::sqrtf::sqrtf;
283 pub use self::tan::tan;
284 pub use self::tanf::tanf;
285 pub use self::tanh::tanh;
286 pub use self::tanhf::tanhf;
287 pub use self::tgamma::tgamma;
288 pub use self::tgammaf::tgammaf;
289 pub use self::trunc::trunc;
290 pub use self::truncf::truncf;
291
292 // Private modules
293 mod expo2;
294 mod fenv;
295 mod k_cos;
296 mod k_cosf;
297 mod k_expo2;
298 mod k_expo2f;
299 mod k_sin;
300 mod k_sinf;
301 mod k_tan;
302 mod k_tanf;
303 mod rem_pio2;
304 mod rem_pio2_large;
305 mod rem_pio2f;
306
307 // Private re-imports
308 use self::expo2::expo2;
309 use self::k_cos::k_cos;
310 use self::k_cosf::k_cosf;
311 use self::k_expo2::k_expo2;
312 use self::k_expo2f::k_expo2f;
313 use self::k_sin::k_sin;
314 use self::k_sinf::k_sinf;
315 use self::k_tan::k_tan;
316 use self::k_tanf::k_tanf;
317 use self::rem_pio2::rem_pio2;
318 use self::rem_pio2_large::rem_pio2_large;
319 use self::rem_pio2f::rem_pio2f;
320
321 #[inline]
322 fn get_high_word(x: f64) -> u32 {
323 (x.to_bits() >> 32) as u32
324 }
325
326 #[inline]
327 fn get_low_word(x: f64) -> u32 {
328 x.to_bits() as u32
329 }
330
331 #[inline]
332 fn with_set_high_word(f: f64, hi: u32) -> f64 {
333 let mut tmp = f.to_bits();
334 tmp &= 0x00000000_ffffffff;
335 tmp |= (hi as u64) << 32;
336 f64::from_bits(tmp)
337 }
338
339 #[inline]
340 fn with_set_low_word(f: f64, lo: u32) -> f64 {
341 let mut tmp = f.to_bits();
342 tmp &= 0xffffffff_00000000;
343 tmp |= lo as u64;
344 f64::from_bits(tmp)
345 }
346
347 #[inline]
348 fn combine_words(hi: u32, lo: u32) -> f64 {
349 f64::from_bits((hi as u64) << 32 | lo as u64)
350 }