Browse Source

Merge branch 'feature/optimise-memcmp' into 'master'

Optimise `memcmp` for speed

See merge request redox-os/relibc!167
jD91mZM2 6 years ago
parent
commit
3f4fbf9084
1 changed files with 25 additions and 7 deletions
  1. 25 7
      src/header/string/mod.rs

+ 25 - 7
src/header/string/mod.rs

@@ -73,14 +73,32 @@ pub unsafe extern "C" fn memchr(s: *const c_void, c: c_int, n: usize) -> *mut c_
 
 #[no_mangle]
 pub unsafe extern "C" fn memcmp(s1: *const c_void, s2: *const c_void, n: usize) -> c_int {
-    let mut i = 0;
-    while i < n {
-        let a = *(s1 as *const u8).offset(i as isize);
-        let b = *(s2 as *const u8).offset(i as isize);
-        if a != b {
-            return a as i32 - b as i32;
+    let (div, rem) = (n / mem::size_of::<usize>(), n % mem::size_of::<usize>());
+    let mut a = s1 as *const usize;
+    let mut b = s2 as *const usize;
+    for _ in 0..div {
+        if *a != *b {
+            for i in 0..mem::size_of::<usize>() {
+                let c = *(a as *const u8).offset(i as isize);
+                let d = *(b as *const u8).offset(i as isize);
+                if c != d {
+                    return c as c_int - d as c_int;
+                }
+            }
+            unreachable!()
         }
-        i += 1;
+        a = a.offset(1);
+        b = b.offset(1);
+    }
+
+    let mut a = a as *const u8;
+    let mut b = b as *const u8;
+    for _ in 0..rem {
+        if *a != *b {
+            return a as c_int - b as c_int;
+        }
+        a = a.offset(1);
+        b = b.offset(1);
     }
     0
 }