More optimizing
authorcoderain <coderain@sdf.org>
Wed, 11 Oct 2017 01:40:05 +0000 (03:40 +0200)
committercoderain <coderain@sdf.org>
Wed, 11 Oct 2017 01:40:05 +0000 (03:40 +0200)
crt/src/string.c

index 6009d3aa0f927f1572d2b0994aa3ccc8075cb38c..796491d4ac04599c6eadf81a3d537de3d8c19679 100644 (file)
@@ -220,7 +220,7 @@ void memcpy(void *destination, const void *source, size_t n)
     if (n >> 2)
     {
         asm volatile ("cld\n"
-                      "rep movsd\n"
+                      "rep movsl\n"
                       : "=D"(dest_byte), "=S"(src_byte)
                       : "D"(destination), "S"(source), "c"(n >> 2)
                       : "cc", "memory");
@@ -293,16 +293,16 @@ void memmove(void *destination, const void *source, size_t n)
 
 int memcmp(const void *mem1, const void *mem2, size_t n)
 {
-    const uint8_t *p1 = (uint8_t*)mem1, *p2 = (uint8_t*)mem2;
-
-    while (n--)
-    {
-        if (*p1 < *p2) return -1;
-        else if (*p1 > *p2) return 1;
-
-        p1++;
-        p2++;
-    }
-
-    return 0;
+    uint32_t flags;
+
+    asm volatile ("cld\n"
+                  "repz cmpsb\n"
+                  "pushfl\n"
+                  "popl %0\n"
+                  : "=r"(flags)
+                  : "S"(mem1), "D"(mem2), "c"(n)
+                  : "cc");
+
+    if (flags & 0x40) return 0;
+    else return (flags & 1) ? 1 : -1;
 }