1 | #[cfg (not(feature = "public-test-deps" ))] |
2 | pub(crate) use crate::int::specialized_div_rem::*; |
3 | |
4 | #[cfg (feature = "public-test-deps" )] |
5 | pub use crate::int::specialized_div_rem::*; |
6 | |
7 | intrinsics! { |
8 | #[maybe_use_optimized_c_shim] |
9 | #[arm_aeabi_alias = __aeabi_uidiv] |
10 | /// Returns `n / d` |
11 | pub extern "C" fn __udivsi3(n: u32, d: u32) -> u32 { |
12 | u32_div_rem(n, d).0 |
13 | } |
14 | |
15 | #[maybe_use_optimized_c_shim] |
16 | /// Returns `n % d` |
17 | pub extern "C" fn __umodsi3(n: u32, d: u32) -> u32 { |
18 | u32_div_rem(n, d).1 |
19 | } |
20 | |
21 | #[avr_skip] |
22 | #[maybe_use_optimized_c_shim] |
23 | /// Returns `n / d` and sets `*rem = n % d` |
24 | pub extern "C" fn __udivmodsi4(n: u32, d: u32, rem: Option<&mut u32>) -> u32 { |
25 | let quo_rem = u32_div_rem(n, d); |
26 | if let Some(rem) = rem { |
27 | *rem = quo_rem.1; |
28 | } |
29 | quo_rem.0 |
30 | } |
31 | |
32 | #[avr_skip] |
33 | #[maybe_use_optimized_c_shim] |
34 | /// Returns `n / d` |
35 | pub extern "C" fn __udivdi3(n: u64, d: u64) -> u64 { |
36 | u64_div_rem(n, d).0 |
37 | } |
38 | |
39 | #[avr_skip] |
40 | #[maybe_use_optimized_c_shim] |
41 | /// Returns `n % d` |
42 | pub extern "C" fn __umoddi3(n: u64, d: u64) -> u64 { |
43 | u64_div_rem(n, d).1 |
44 | } |
45 | |
46 | #[avr_skip] |
47 | #[maybe_use_optimized_c_shim] |
48 | /// Returns `n / d` and sets `*rem = n % d` |
49 | pub extern "C" fn __udivmoddi4(n: u64, d: u64, rem: Option<&mut u64>) -> u64 { |
50 | let quo_rem = u64_div_rem(n, d); |
51 | if let Some(rem) = rem { |
52 | *rem = quo_rem.1; |
53 | } |
54 | quo_rem.0 |
55 | } |
56 | |
57 | // Note: we use block configuration and not `if cfg!(...)`, because we need to entirely disable |
58 | // the existence of `u128_div_rem` to get 32-bit SPARC to compile, see `u128_divide_sparc` docs. |
59 | |
60 | #[avr_skip] |
61 | /// Returns `n / d` |
62 | pub extern "C" fn __udivti3(n: u128, d: u128) -> u128 { |
63 | #[cfg (not(any(target_arch = "sparc" , target_arch = "sparc64" )))] { |
64 | u128_div_rem(n, d).0 |
65 | } |
66 | #[cfg (any(target_arch = "sparc" , target_arch = "sparc64" ))] { |
67 | u128_divide_sparc(n, d, &mut 0) |
68 | } |
69 | } |
70 | |
71 | #[avr_skip] |
72 | /// Returns `n % d` |
73 | pub extern "C" fn __umodti3(n: u128, d: u128) -> u128 { |
74 | #[cfg (not(any(target_arch = "sparc" , target_arch = "sparc64" )))] { |
75 | u128_div_rem(n, d).1 |
76 | } |
77 | #[cfg (any(target_arch = "sparc" , target_arch = "sparc64" ))] { |
78 | let mut rem = 0; |
79 | u128_divide_sparc(n, d, &mut rem); |
80 | rem |
81 | } |
82 | } |
83 | |
84 | #[avr_skip] |
85 | /// Returns `n / d` and sets `*rem = n % d` |
86 | pub extern "C" fn __udivmodti4(n: u128, d: u128, rem: Option<&mut u128>) -> u128 { |
87 | #[cfg (not(any(target_arch = "sparc" , target_arch = "sparc64" )))] { |
88 | let quo_rem = u128_div_rem(n, d); |
89 | if let Some(rem) = rem { |
90 | *rem = quo_rem.1; |
91 | } |
92 | quo_rem.0 |
93 | } |
94 | #[cfg (any(target_arch = "sparc" , target_arch = "sparc64" ))] { |
95 | let mut tmp = 0; |
96 | let quo = u128_divide_sparc(n, d, &mut tmp); |
97 | if let Some(rem) = rem { |
98 | *rem = tmp; |
99 | } |
100 | quo |
101 | } |
102 | } |
103 | } |
104 | |