1 macro_rules! force_eval {
2     ($e:expr) => {
3         unsafe { ::core::ptr::read_volatile(&$e) }
4     };
5 }
6 
7 #[cfg(not(debug_assertions))]
8 macro_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)]
38 macro_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 // Temporary macro to avoid panic codegen for division (in debug mode too). At
60 // the time of this writing this is only used in a few places, and once
61 // rust-lang/rust#72751 is fixed then this macro will no longer be necessary and
62 // the native `/` operator can be used and panics won't be codegen'd.
63 #[cfg(any(debug_assertions, not(feature = "unstable")))]
64 macro_rules! div {
65     ($a:expr, $b:expr) => {
66         $a / $b
67     };
68 }
69 
70 #[cfg(all(not(debug_assertions), feature = "unstable"))]
71 macro_rules! div {
72     ($a:expr, $b:expr) => {
73         unsafe { core::intrinsics::unchecked_div($a, $b) }
74     };
75 }
76 
77 macro_rules! llvm_intrinsically_optimized {
78     (#[cfg($($clause:tt)*)] $e:expr) => {
79         #[cfg(all(feature = "unstable", $($clause)*))]
80         {
81             if true { // thwart the dead code lint
82                 $e
83             }
84         }
85     };
86 }
87 
88 // Public modules
89 mod acos;
90 mod acosf;
91 mod acosh;
92 mod acoshf;
93 mod asin;
94 mod asinf;
95 mod asinh;
96 mod asinhf;
97 mod atan;
98 mod atan2;
99 mod atan2f;
100 mod atanf;
101 mod atanh;
102 mod atanhf;
103 mod cbrt;
104 mod cbrtf;
105 mod ceil;
106 mod ceilf;
107 mod copysign;
108 mod copysignf;
109 mod cos;
110 mod cosf;
111 mod cosh;
112 mod coshf;
113 mod erf;
114 mod erff;
115 mod exp;
116 mod exp10;
117 mod exp10f;
118 mod exp2;
119 mod exp2f;
120 mod expf;
121 mod expm1;
122 mod expm1f;
123 mod fabs;
124 mod fabsf;
125 mod fdim;
126 mod fdimf;
127 mod floor;
128 mod floorf;
129 mod fma;
130 mod fmaf;
131 mod fmax;
132 mod fmaxf;
133 mod fmin;
134 mod fminf;
135 mod fmod;
136 mod fmodf;
137 mod frexp;
138 mod frexpf;
139 mod hypot;
140 mod hypotf;
141 mod ilogb;
142 mod ilogbf;
143 mod j0;
144 mod j0f;
145 mod j1;
146 mod j1f;
147 mod jn;
148 mod jnf;
149 mod ldexp;
150 mod ldexpf;
151 mod lgamma;
152 mod lgamma_r;
153 mod lgammaf;
154 mod lgammaf_r;
155 mod log;
156 mod log10;
157 mod log10f;
158 mod log1p;
159 mod log1pf;
160 mod log2;
161 mod log2f;
162 mod logf;
163 mod modf;
164 mod modff;
165 mod nextafter;
166 mod nextafterf;
167 mod pow;
168 mod powf;
169 mod remainder;
170 mod remainderf;
171 mod remquo;
172 mod remquof;
173 mod rint;
174 mod rintf;
175 mod round;
176 mod roundf;
177 mod scalbn;
178 mod scalbnf;
179 mod sin;
180 mod sincos;
181 mod sincosf;
182 mod sinf;
183 mod sinh;
184 mod sinhf;
185 mod sqrt;
186 mod sqrtf;
187 mod tan;
188 mod tanf;
189 mod tanh;
190 mod tanhf;
191 mod tgamma;
192 mod tgammaf;
193 mod trunc;
194 mod truncf;
195 
196 // Use separated imports instead of {}-grouped imports for easier merging.
197 pub use self::acos::acos;
198 pub use self::acosf::acosf;
199 pub use self::acosh::acosh;
200 pub use self::acoshf::acoshf;
201 pub use self::asin::asin;
202 pub use self::asinf::asinf;
203 pub use self::asinh::asinh;
204 pub use self::asinhf::asinhf;
205 pub use self::atan::atan;
206 pub use self::atan2::atan2;
207 pub use self::atan2f::atan2f;
208 pub use self::atanf::atanf;
209 pub use self::atanh::atanh;
210 pub use self::atanhf::atanhf;
211 pub use self::cbrt::cbrt;
212 pub use self::cbrtf::cbrtf;
213 pub use self::ceil::ceil;
214 pub use self::ceilf::ceilf;
215 pub use self::copysign::copysign;
216 pub use self::copysignf::copysignf;
217 pub use self::cos::cos;
218 pub use self::cosf::cosf;
219 pub use self::cosh::cosh;
220 pub use self::coshf::coshf;
221 pub use self::erf::erf;
222 pub use self::erf::erfc;
223 pub use self::erff::erfcf;
224 pub use self::erff::erff;
225 pub use self::exp::exp;
226 pub use self::exp10::exp10;
227 pub use self::exp10f::exp10f;
228 pub use self::exp2::exp2;
229 pub use self::exp2f::exp2f;
230 pub use self::expf::expf;
231 pub use self::expm1::expm1;
232 pub use self::expm1f::expm1f;
233 pub use self::fabs::fabs;
234 pub use self::fabsf::fabsf;
235 pub use self::fdim::fdim;
236 pub use self::fdimf::fdimf;
237 pub use self::floor::floor;
238 pub use self::floorf::floorf;
239 pub use self::fma::fma;
240 pub use self::fmaf::fmaf;
241 pub use self::fmax::fmax;
242 pub use self::fmaxf::fmaxf;
243 pub use self::fmin::fmin;
244 pub use self::fminf::fminf;
245 pub use self::fmod::fmod;
246 pub use self::fmodf::fmodf;
247 pub use self::frexp::frexp;
248 pub use self::frexpf::frexpf;
249 pub use self::hypot::hypot;
250 pub use self::hypotf::hypotf;
251 pub use self::ilogb::ilogb;
252 pub use self::ilogbf::ilogbf;
253 pub use self::j0::j0;
254 pub use self::j0::y0;
255 pub use self::j0f::j0f;
256 pub use self::j0f::y0f;
257 pub use self::j1::j1;
258 pub use self::j1::y1;
259 pub use self::j1f::j1f;
260 pub use self::j1f::y1f;
261 pub use self::jn::jn;
262 pub use self::jn::yn;
263 pub use self::jnf::jnf;
264 pub use self::jnf::ynf;
265 pub use self::ldexp::ldexp;
266 pub use self::ldexpf::ldexpf;
267 pub use self::lgamma::lgamma;
268 pub use self::lgamma_r::lgamma_r;
269 pub use self::lgammaf::lgammaf;
270 pub use self::lgammaf_r::lgammaf_r;
271 pub use self::log::log;
272 pub use self::log10::log10;
273 pub use self::log10f::log10f;
274 pub use self::log1p::log1p;
275 pub use self::log1pf::log1pf;
276 pub use self::log2::log2;
277 pub use self::log2f::log2f;
278 pub use self::logf::logf;
279 pub use self::modf::modf;
280 pub use self::modff::modff;
281 pub use self::nextafter::nextafter;
282 pub use self::nextafterf::nextafterf;
283 pub use self::pow::pow;
284 pub use self::powf::powf;
285 pub use self::remainder::remainder;
286 pub use self::remainderf::remainderf;
287 pub use self::remquo::remquo;
288 pub use self::remquof::remquof;
289 pub use self::rint::rint;
290 pub use self::rintf::rintf;
291 pub use self::round::round;
292 pub use self::roundf::roundf;
293 pub use self::scalbn::scalbn;
294 pub use self::scalbnf::scalbnf;
295 pub use self::sin::sin;
296 pub use self::sincos::sincos;
297 pub use self::sincosf::sincosf;
298 pub use self::sinf::sinf;
299 pub use self::sinh::sinh;
300 pub use self::sinhf::sinhf;
301 pub use self::sqrt::sqrt;
302 pub use self::sqrtf::sqrtf;
303 pub use self::tan::tan;
304 pub use self::tanf::tanf;
305 pub use self::tanh::tanh;
306 pub use self::tanhf::tanhf;
307 pub use self::tgamma::tgamma;
308 pub use self::tgammaf::tgammaf;
309 pub use self::trunc::trunc;
310 pub use self::truncf::truncf;
311 
312 // Private modules
313 mod expo2;
314 mod fenv;
315 mod k_cos;
316 mod k_cosf;
317 mod k_expo2;
318 mod k_expo2f;
319 mod k_sin;
320 mod k_sinf;
321 mod k_tan;
322 mod k_tanf;
323 mod rem_pio2;
324 mod rem_pio2_large;
325 mod rem_pio2f;
326 
327 // Private re-imports
328 use self::expo2::expo2;
329 use self::k_cos::k_cos;
330 use self::k_cosf::k_cosf;
331 use self::k_expo2::k_expo2;
332 use self::k_expo2f::k_expo2f;
333 use self::k_sin::k_sin;
334 use self::k_sinf::k_sinf;
335 use self::k_tan::k_tan;
336 use self::k_tanf::k_tanf;
337 use self::rem_pio2::rem_pio2;
338 use self::rem_pio2_large::rem_pio2_large;
339 use self::rem_pio2f::rem_pio2f;
340 
341 #[inline]
get_high_word(x: f64) -> u32342 fn get_high_word(x: f64) -> u32 {
343     (x.to_bits() >> 32) as u32
344 }
345 
346 #[inline]
get_low_word(x: f64) -> u32347 fn get_low_word(x: f64) -> u32 {
348     x.to_bits() as u32
349 }
350 
351 #[inline]
with_set_high_word(f: f64, hi: u32) -> f64352 fn with_set_high_word(f: f64, hi: u32) -> f64 {
353     let mut tmp = f.to_bits();
354     tmp &= 0x00000000_ffffffff;
355     tmp |= (hi as u64) << 32;
356     f64::from_bits(tmp)
357 }
358 
359 #[inline]
with_set_low_word(f: f64, lo: u32) -> f64360 fn with_set_low_word(f: f64, lo: u32) -> f64 {
361     let mut tmp = f.to_bits();
362     tmp &= 0xffffffff_00000000;
363     tmp |= lo as u64;
364     f64::from_bits(tmp)
365 }
366 
367 #[inline]
combine_words(hi: u32, lo: u32) -> f64368 fn combine_words(hi: u32, lo: u32) -> f64 {
369     f64::from_bits((hi as u64) << 32 | lo as u64)
370 }
371