Browse Source

Merge pull request #251 from riscv-rust/master

Implement __mulsi3.
Alex Crichton 6 years ago
parent
commit
5a7b58ffd7
2 changed files with 20 additions and 0 deletions
  1. 3 0
      src/lib.rs
  2. 17 0
      src/riscv32.rs

+ 3 - 0
src/lib.rs

@@ -58,6 +58,9 @@ pub mod arm;
 #[cfg(all(kernel_user_helpers, target_os = "linux", target_arch = "arm"))]
 pub mod arm_linux;
 
+#[cfg(any(target_arch = "riscv32"))]
+pub mod riscv32;
+
 #[cfg(target_arch = "x86")]
 pub mod x86;
 

+ 17 - 0
src/riscv32.rs

@@ -0,0 +1,17 @@
+intrinsics! {
+    // Implementation from gcc
+    // https://raw.githubusercontent.com/gcc-mirror/gcc/master/libgcc/config/epiphany/mulsi3.c
+    pub extern "C" fn __mulsi3(mut a: u32, mut b: u32) -> u32 {
+        let mut r: usize = 0;
+
+        while a > 0 {
+            if a & 1 > 0 {
+                r += b;
+            }
+            a >>= 1;
+            b <<= 1;
+        }
+
+        r
+    }
+}