浏览代码

start of __clzsi2

Lokathor 6 年之前
父节点
当前提交
3080360beb
共有 1 个文件被更改,包括 58 次插入0 次删除
  1. 58 0
      src/arm.rs

+ 58 - 0
src/arm.rs

@@ -233,3 +233,61 @@ pub unsafe extern "aapcs" fn __aeabi_memclr4(dest: *mut u8, n: usize) {
 pub unsafe extern "aapcs" fn __aeabi_memclr8(dest: *mut u8, n: usize) {
     __aeabi_memset4(dest, n, 0);
 }
+
+#[no_mangle]
+#[cfg(any(target_pointer_width = "16", target_pointer_width = "32", target_pointer_width = "64"))]
+pub extern "C" fn __clzsi2(mut x: usize) -> usize {
+  // TODO: const this? Requires const if
+  let mut y: usize;
+  let mut n: usize = {
+    #[cfg(target_pointer_width = "64")]
+    {
+      64
+    }
+    #[cfg(target_pointer_width = "32")]
+    {
+      32
+    }
+    #[cfg(target_pointer_width = "16")]
+    {
+      16
+    }
+  };
+  #[cfg(target_pointer_width = "64")]
+  {
+    y = x >> 32;
+    if y != 0 {
+      n -= 32;
+      x = y;
+    }
+  }
+  #[cfg(any(target_pointer_width = "32", target_pointer_width = "64"))]
+  {
+    y = x >> 16;
+    if y != 0 {
+      n -= 16;
+      x = y;
+    }
+  }
+  y = x >> 8;
+  if y != 0 {
+    n -= 8;
+    x = y;
+  }
+  y = x >> 4;
+  if y != 0 {
+    n -= 4;
+    x = y;
+  }
+  y = x >> 2;
+  if y != 0 {
+    n -= 2;
+    x = y;
+  }
+  y = x >> 1;
+  if y != 0 {
+    n - 2
+  } else {
+    n - x
+  }
+}