summaryrefslogtreecommitdiffstats
path: root/vendor/compiler_builtins/src/int/udiv.rs
diff options
context:
space:
mode:
Diffstat (limited to 'vendor/compiler_builtins/src/int/udiv.rs')
-rw-r--r--vendor/compiler_builtins/src/int/udiv.rs106
1 files changed, 106 insertions, 0 deletions
diff --git a/vendor/compiler_builtins/src/int/udiv.rs b/vendor/compiler_builtins/src/int/udiv.rs
new file mode 100644
index 000000000..fb09f87d8
--- /dev/null
+++ b/vendor/compiler_builtins/src/int/udiv.rs
@@ -0,0 +1,106 @@
+#[cfg(not(feature = "public-test-deps"))]
+pub(crate) use int::specialized_div_rem::*;
+
+#[cfg(feature = "public-test-deps")]
+pub use int::specialized_div_rem::*;
+
+intrinsics! {
+ #[maybe_use_optimized_c_shim]
+ #[arm_aeabi_alias = __aeabi_uidiv]
+ /// Returns `n / d`
+ pub extern "C" fn __udivsi3(n: u32, d: u32) -> u32 {
+ u32_div_rem(n, d).0
+ }
+
+ #[maybe_use_optimized_c_shim]
+ /// Returns `n % d`
+ pub extern "C" fn __umodsi3(n: u32, d: u32) -> u32 {
+ u32_div_rem(n, d).1
+ }
+
+ #[avr_skip]
+ #[maybe_use_optimized_c_shim]
+ /// Returns `n / d` and sets `*rem = n % d`
+ pub extern "C" fn __udivmodsi4(n: u32, d: u32, rem: Option<&mut u32>) -> u32 {
+ let quo_rem = u32_div_rem(n, d);
+ if let Some(rem) = rem {
+ *rem = quo_rem.1;
+ }
+ quo_rem.0
+ }
+
+ #[avr_skip]
+ #[maybe_use_optimized_c_shim]
+ /// Returns `n / d`
+ pub extern "C" fn __udivdi3(n: u64, d: u64) -> u64 {
+ u64_div_rem(n, d).0
+ }
+
+ #[avr_skip]
+ #[maybe_use_optimized_c_shim]
+ /// Returns `n % d`
+ pub extern "C" fn __umoddi3(n: u64, d: u64) -> u64 {
+ u64_div_rem(n, d).1
+ }
+
+ #[avr_skip]
+ #[maybe_use_optimized_c_shim]
+ /// Returns `n / d` and sets `*rem = n % d`
+ pub extern "C" fn __udivmoddi4(n: u64, d: u64, rem: Option<&mut u64>) -> u64 {
+ let quo_rem = u64_div_rem(n, d);
+ if let Some(rem) = rem {
+ *rem = quo_rem.1;
+ }
+ quo_rem.0
+ }
+
+ // Note: we use block configuration and not `if cfg!(...)`, because we need to entirely disable
+ // the existence of `u128_div_rem` to get 32-bit SPARC to compile, see `u128_divide_sparc` docs.
+
+ #[avr_skip]
+ #[win64_128bit_abi_hack]
+ /// Returns `n / d`
+ pub extern "C" fn __udivti3(n: u128, d: u128) -> u128 {
+ #[cfg(not(any(target_arch = "sparc", target_arch = "sparc64")))] {
+ u128_div_rem(n, d).0
+ }
+ #[cfg(any(target_arch = "sparc", target_arch = "sparc64"))] {
+ u128_divide_sparc(n, d, &mut 0)
+ }
+ }
+
+ #[avr_skip]
+ #[win64_128bit_abi_hack]
+ /// Returns `n % d`
+ pub extern "C" fn __umodti3(n: u128, d: u128) -> u128 {
+ #[cfg(not(any(target_arch = "sparc", target_arch = "sparc64")))] {
+ u128_div_rem(n, d).1
+ }
+ #[cfg(any(target_arch = "sparc", target_arch = "sparc64"))] {
+ let mut rem = 0;
+ u128_divide_sparc(n, d, &mut rem);
+ rem
+ }
+ }
+
+ #[avr_skip]
+ #[win64_128bit_abi_hack]
+ /// Returns `n / d` and sets `*rem = n % d`
+ pub extern "C" fn __udivmodti4(n: u128, d: u128, rem: Option<&mut u128>) -> u128 {
+ #[cfg(not(any(target_arch = "sparc", target_arch = "sparc64")))] {
+ let quo_rem = u128_div_rem(n, d);
+ if let Some(rem) = rem {
+ *rem = quo_rem.1;
+ }
+ quo_rem.0
+ }
+ #[cfg(any(target_arch = "sparc", target_arch = "sparc64"))] {
+ let mut tmp = 0;
+ let quo = u128_divide_sparc(n, d, &mut tmp);
+ if let Some(rem) = rem {
+ *rem = tmp;
+ }
+ quo
+ }
+ }
+}