compiler_builtins/math/libm_math/
mod.rs1macro_rules! force_eval {
2 ($e:expr) => {
3 unsafe { ::core::ptr::read_volatile(&$e) }
4 };
5}
6
7#[cfg(not(debug_assertions))]
8macro_rules! i {
9 ($array:expr, $index:expr) => {
10 unsafe { *$array.get_unchecked($index) }
11 };
12 ($array:expr, $index:expr, = , $rhs:expr) => {
13 unsafe {
14 *$array.get_unchecked_mut($index) = $rhs;
15 }
16 };
17 ($array:expr, $index:expr, += , $rhs:expr) => {
18 unsafe {
19 *$array.get_unchecked_mut($index) += $rhs;
20 }
21 };
22 ($array:expr, $index:expr, -= , $rhs:expr) => {
23 unsafe {
24 *$array.get_unchecked_mut($index) -= $rhs;
25 }
26 };
27 ($array:expr, $index:expr, &= , $rhs:expr) => {
28 unsafe {
29 *$array.get_unchecked_mut($index) &= $rhs;
30 }
31 };
32 ($array:expr, $index:expr, == , $rhs:expr) => {
33 unsafe { *$array.get_unchecked_mut($index) == $rhs }
34 };
35}
36
37#[cfg(debug_assertions)]
38macro_rules! i {
39 ($array:expr, $index:expr) => {
40 *$array.get($index).unwrap()
41 };
42 ($array:expr, $index:expr, = , $rhs:expr) => {
43 *$array.get_mut($index).unwrap() = $rhs;
44 };
45 ($array:expr, $index:expr, -= , $rhs:expr) => {
46 *$array.get_mut($index).unwrap() -= $rhs;
47 };
48 ($array:expr, $index:expr, += , $rhs:expr) => {
49 *$array.get_mut($index).unwrap() += $rhs;
50 };
51 ($array:expr, $index:expr, &= , $rhs:expr) => {
52 *$array.get_mut($index).unwrap() &= $rhs;
53 };
54 ($array:expr, $index:expr, == , $rhs:expr) => {
55 *$array.get_mut($index).unwrap() == $rhs
56 };
57}
58
59#[cfg(any(debug_assertions, not(intrinsics_enabled)))]
64macro_rules! div {
65 ($a:expr, $b:expr) => {
66 $a / $b
67 };
68}
69
70#[cfg(all(not(debug_assertions), intrinsics_enabled))]
71macro_rules! div {
72 ($a:expr, $b:expr) => {
73 unsafe { core::intrinsics::unchecked_div($a, $b) }
74 };
75}
76
77#[macro_use]
79#[cfg(feature = "unstable-public-internals")]
80pub mod support;
81
82#[macro_use]
83#[cfg(not(feature = "unstable-public-internals"))]
84pub(crate) mod support;
85
86cfg_if! {
87 if #[cfg(feature = "unstable-public-internals")] {
88 pub mod generic;
89 } else {
90 mod generic;
91 }
92}
93
94mod arch;
96mod expo2;
97mod k_cos;
98mod k_cosf;
99mod k_expo2;
100mod k_expo2f;
101mod k_sin;
102mod k_sinf;
103mod k_tan;
104mod k_tanf;
105mod rem_pio2;
106mod rem_pio2_large;
107mod rem_pio2f;
108
109use self::expo2::expo2;
111use self::k_cos::k_cos;
112use self::k_cosf::k_cosf;
113use self::k_expo2::k_expo2;
114use self::k_expo2f::k_expo2f;
115use self::k_sin::k_sin;
116use self::k_sinf::k_sinf;
117use self::k_tan::k_tan;
118use self::k_tanf::k_tanf;
119use self::rem_pio2::rem_pio2;
120use self::rem_pio2_large::rem_pio2_large;
121use self::rem_pio2f::rem_pio2f;
122#[allow(unused_imports)]
123use self::support::{CastFrom, CastInto, DFloat, DInt, Float, HFloat, HInt, Int, IntTy, MinInt};
124
125mod acos;
127mod acosf;
128mod acosh;
129mod acoshf;
130mod asin;
131mod asinf;
132mod asinh;
133mod asinhf;
134mod atan;
135mod atan2;
136mod atan2f;
137mod atanf;
138mod atanh;
139mod atanhf;
140mod cbrt;
141mod cbrtf;
142mod ceil;
143mod copysign;
144mod cos;
145mod cosf;
146mod cosh;
147mod coshf;
148mod erf;
149mod erff;
150mod exp;
151mod exp10;
152mod exp10f;
153mod exp2;
154mod exp2f;
155mod expf;
156mod expm1;
157mod expm1f;
158mod fabs;
159mod fdim;
160mod floor;
161mod fma;
162mod fmin_fmax;
163mod fminimum_fmaximum;
164mod fminimum_fmaximum_num;
165mod fmod;
166mod frexp;
167mod frexpf;
168mod hypot;
169mod hypotf;
170mod ilogb;
171mod ilogbf;
172mod j0;
173mod j0f;
174mod j1;
175mod j1f;
176mod jn;
177mod jnf;
178mod ldexp;
179mod lgamma;
180mod lgamma_r;
181mod lgammaf;
182mod lgammaf_r;
183mod log;
184mod log10;
185mod log10f;
186mod log1p;
187mod log1pf;
188mod log2;
189mod log2f;
190mod logf;
191mod modf;
192mod modff;
193mod nextafter;
194mod nextafterf;
195mod pow;
196mod powf;
197mod remainder;
198mod remainderf;
199mod remquo;
200mod remquof;
201mod rint;
202mod round;
203mod roundeven;
204mod scalbn;
205mod sin;
206mod sincos;
207mod sincosf;
208mod sinf;
209mod sinh;
210mod sinhf;
211mod sqrt;
212mod tan;
213mod tanf;
214mod tanh;
215mod tanhf;
216mod tgamma;
217mod tgammaf;
218mod trunc;
219
220pub use self::acos::acos;
222pub use self::acosf::acosf;
223pub use self::acosh::acosh;
224pub use self::acoshf::acoshf;
225pub use self::asin::asin;
226pub use self::asinf::asinf;
227pub use self::asinh::asinh;
228pub use self::asinhf::asinhf;
229pub use self::atan::atan;
230pub use self::atan2::atan2;
231pub use self::atan2f::atan2f;
232pub use self::atanf::atanf;
233pub use self::atanh::atanh;
234pub use self::atanhf::atanhf;
235pub use self::cbrt::cbrt;
236pub use self::cbrtf::cbrtf;
237pub use self::ceil::{ceil, ceilf};
238pub use self::copysign::{copysign, copysignf};
239pub use self::cos::cos;
240pub use self::cosf::cosf;
241pub use self::cosh::cosh;
242pub use self::coshf::coshf;
243pub use self::erf::{erf, erfc};
244pub use self::erff::{erfcf, erff};
245pub use self::exp::exp;
246pub use self::exp2::exp2;
247pub use self::exp2f::exp2f;
248pub use self::exp10::exp10;
249pub use self::exp10f::exp10f;
250pub use self::expf::expf;
251pub use self::expm1::expm1;
252pub use self::expm1f::expm1f;
253pub use self::fabs::{fabs, fabsf};
254pub use self::fdim::{fdim, fdimf};
255pub use self::floor::{floor, floorf};
256pub use self::fma::{fma, fmaf};
257pub use self::fmin_fmax::{fmax, fmaxf, fmin, fminf};
258pub use self::fminimum_fmaximum::{fmaximum, fmaximumf, fminimum, fminimumf};
259pub use self::fminimum_fmaximum_num::{fmaximum_num, fmaximum_numf, fminimum_num, fminimum_numf};
260pub use self::fmod::{fmod, fmodf};
261pub use self::frexp::frexp;
262pub use self::frexpf::frexpf;
263pub use self::hypot::hypot;
264pub use self::hypotf::hypotf;
265pub use self::ilogb::ilogb;
266pub use self::ilogbf::ilogbf;
267pub use self::j0::{j0, y0};
268pub use self::j0f::{j0f, y0f};
269pub use self::j1::{j1, y1};
270pub use self::j1f::{j1f, y1f};
271pub use self::jn::{jn, yn};
272pub use self::jnf::{jnf, ynf};
273pub use self::ldexp::{ldexp, ldexpf};
274pub use self::lgamma::lgamma;
275pub use self::lgamma_r::lgamma_r;
276pub use self::lgammaf::lgammaf;
277pub use self::lgammaf_r::lgammaf_r;
278pub use self::log::log;
279pub use self::log1p::log1p;
280pub use self::log1pf::log1pf;
281pub use self::log2::log2;
282pub use self::log2f::log2f;
283pub use self::log10::log10;
284pub use self::log10f::log10f;
285pub use self::logf::logf;
286pub use self::modf::modf;
287pub use self::modff::modff;
288pub use self::nextafter::nextafter;
289pub use self::nextafterf::nextafterf;
290pub use self::pow::pow;
291pub use self::powf::powf;
292pub use self::remainder::remainder;
293pub use self::remainderf::remainderf;
294pub use self::remquo::remquo;
295pub use self::remquof::remquof;
296pub use self::rint::{rint, rintf};
297pub use self::round::{round, roundf};
298pub use self::roundeven::{roundeven, roundevenf};
299pub use self::scalbn::{scalbn, scalbnf};
300pub use self::sin::sin;
301pub use self::sincos::sincos;
302pub use self::sincosf::sincosf;
303pub use self::sinf::sinf;
304pub use self::sinh::sinh;
305pub use self::sinhf::sinhf;
306pub use self::sqrt::{sqrt, sqrtf};
307pub use self::tan::tan;
308pub use self::tanf::tanf;
309pub use self::tanh::tanh;
310pub use self::tanhf::tanhf;
311pub use self::tgamma::tgamma;
312pub use self::tgammaf::tgammaf;
313pub use self::trunc::{trunc, truncf};
314
315cfg_if! {
316 if #[cfg(f16_enabled)] {
317 pub use self::ceil::ceilf16;
319 pub use self::copysign::copysignf16;
320 pub use self::fabs::fabsf16;
321 pub use self::fdim::fdimf16;
322 pub use self::floor::floorf16;
323 pub use self::fmin_fmax::{fmaxf16, fminf16};
324 pub use self::fminimum_fmaximum::{fmaximumf16, fminimumf16};
325 pub use self::fminimum_fmaximum_num::{fmaximum_numf16, fminimum_numf16};
326 pub use self::fmod::fmodf16;
327 pub use self::ldexp::ldexpf16;
328 pub use self::rint::rintf16;
329 pub use self::round::roundf16;
330 pub use self::roundeven::roundevenf16;
331 pub use self::scalbn::scalbnf16;
332 pub use self::sqrt::sqrtf16;
333 pub use self::trunc::truncf16;
334 #[allow(unused_imports)]
337 pub(crate) use self::fma::fmaf16;
338 }
339}
340
341cfg_if! {
342 if #[cfg(f128_enabled)] {
343 pub use self::ceil::ceilf128;
345 pub use self::copysign::copysignf128;
346 pub use self::fabs::fabsf128;
347 pub use self::fdim::fdimf128;
348 pub use self::floor::floorf128;
349 pub use self::fma::fmaf128;
350 pub use self::fmin_fmax::{fmaxf128, fminf128};
351 pub use self::fminimum_fmaximum::{fmaximumf128, fminimumf128};
352 pub use self::fminimum_fmaximum_num::{fmaximum_numf128, fminimum_numf128};
353 pub use self::fmod::fmodf128;
354 pub use self::ldexp::ldexpf128;
355 pub use self::rint::rintf128;
356 pub use self::round::roundf128;
357 pub use self::roundeven::roundevenf128;
358 pub use self::scalbn::scalbnf128;
359 pub use self::sqrt::sqrtf128;
360 pub use self::trunc::truncf128;
361 }
363}
364
365#[inline]
366fn get_high_word(x: f64) -> u32 {
367 (x.to_bits() >> 32) as u32
368}
369
370#[inline]
371fn get_low_word(x: f64) -> u32 {
372 x.to_bits() as u32
373}
374
375#[inline]
376fn with_set_high_word(f: f64, hi: u32) -> f64 {
377 let mut tmp = f.to_bits();
378 tmp &= 0x00000000_ffffffff;
379 tmp |= (hi as u64) << 32;
380 f64::from_bits(tmp)
381}
382
383#[inline]
384fn with_set_low_word(f: f64, lo: u32) -> f64 {
385 let mut tmp = f.to_bits();
386 tmp &= 0xffffffff_00000000;
387 tmp |= lo as u64;
388 f64::from_bits(tmp)
389}
390
391#[inline]
392fn combine_words(hi: u32, lo: u32) -> f64 {
393 f64::from_bits(((hi as u64) << 32) | lo as u64)
394}