• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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]
get_high_word(x: f64) -> u32322 fn get_high_word(x: f64) -> u32 {
323     (x.to_bits() >> 32) as u32
324 }
325 
326 #[inline]
get_low_word(x: f64) -> u32327 fn get_low_word(x: f64) -> u32 {
328     x.to_bits() as u32
329 }
330 
331 #[inline]
with_set_high_word(f: f64, hi: u32) -> f64332 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]
with_set_low_word(f: f64, lo: u32) -> f64340 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]
combine_words(hi: u32, lo: u32) -> f64348 fn combine_words(hi: u32, lo: u32) -> f64 {
349     f64::from_bits((hi as u64) << 32 | lo as u64)
350 }
351