diff --git a/src/int/mul.rs b/src/int/mul.rs index a5238eeac..07ce061c9 100644 --- a/src/int/mul.rs +++ b/src/int/mul.rs @@ -100,6 +100,7 @@ impl_signed_mulo!(i128_overflowing_mul, i128, u128); intrinsics! { #[maybe_use_optimized_c_shim] #[arm_aeabi_alias = __aeabi_lmul] + #[cfg(any(not(any(target_arch = "riscv32", target_arch = "riscv64")), target_feature = "m"))] pub extern "C" fn __muldi3(a: u64, b: u64) -> u64 { a.mul(b) } diff --git a/src/lib.rs b/src/lib.rs index 9ca72bc20..009923d27 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -60,8 +60,8 @@ pub mod arm; ))] pub mod arm_linux; -#[cfg(any(target_arch = "riscv32"))] -pub mod riscv32; +#[cfg(any(target_arch = "riscv32", target_arch = "riscv64"))] +pub mod riscv; #[cfg(target_arch = "x86")] pub mod x86; diff --git a/src/riscv32.rs b/src/riscv.rs similarity index 57% rename from src/riscv32.rs rename to src/riscv.rs index 9a3c1714c..ee78b9dba 100644 --- a/src/riscv32.rs +++ b/src/riscv.rs @@ -15,4 +15,20 @@ intrinsics! { r } + + #[cfg(not(target_feature = "m"))] + pub extern "C" fn __muldi3(a: u64, b: u64) -> u64 { + let (mut a, mut b) = (a, b); + let mut r = 0; + + while a > 0 { + if a & 1 > 0 { + r += b; + } + a >>= 1; + b <<= 1; + } + + r + } }