Optimize some string functions
authorcoderain <coderain@sdf.org>
Mon, 9 Oct 2017 21:11:46 +0000 (23:11 +0200)
committercoderain <coderain@sdf.org>
Mon, 9 Oct 2017 21:11:46 +0000 (23:11 +0200)
crt/include/string.h
crt/src/string.c

index 21921f49e20254d82c399b37a468cc2097457744..c5e76001d9417a7b7cbd62c309444dd7dc0cf296 100644 (file)
@@ -39,7 +39,7 @@ char *strdup(const char *source);
 char *strtok(char *str, const char *delimiters, char **endptr);
 size_t strlen(const char *str);
 void strrev(char *str);
-void memset(void *ptr, uint8_t value, uint32_t size);
+void memset(void *ptr, int value, size_t n);
 void memcpy(void *destination, const void *source, size_t n);
 void memmove(void *destination, const void *source, size_t n);
 int memcmp(const void *mem1, const void *mem2, size_t n);
index 1d08d6a71c8035aea0fdb733961807ea7ffa999e..6009d3aa0f927f1572d2b0994aa3ccc8075cb38c 100644 (file)
@@ -172,29 +172,43 @@ size_t strlen(const char *str)
 
 void strrev(char *str)
 {
-    size_t i, len = strlen(str);
+    size_t i, j = strlen(str) - 1;
 
-    for (i = 0; i < len / 2; i++)
+    while (i < j)
     {
         int t = str[i];
-        str[i] = str[len - i - 1];
-        str[len - i - 1] = t;
+        str[i] = str[j];
+        str[j] = t;
+
+        i++;
+        j--;
     }
 }
 
-void memset(void *ptr, uint8_t value, uint32_t size)
+void memset(void *ptr, int value, size_t n)
 {
-    uint32_t *p = ptr;
+    uint8_t *ptr_byte = (uint8_t*)ptr;
+    value &= 0xFF;
     uint32_t tile = value | (value << 8) | (value << 16) | (value << 24);
 
-    while (size >= sizeof(uint32_t))
+    if (n >> 2)
     {
-        *p++ = tile;
-        size -= sizeof(uint32_t);
+        asm volatile ("cld\n"
+                      "rep stosl\n"
+                      : "=D"(ptr_byte)
+                      : "D"(ptr_byte), "a"(tile), "c"(n >> 2)
+                      : "cc");
     }
 
-    uint8_t *p_byte = (uint8_t*)p;
-    while (size--) *p_byte++ = value;
+    switch (n & 3)
+    {
+    case 3:
+        *ptr_byte++ = value;
+    case 2:
+        *ptr_byte++ = value;
+    case 1:
+        *ptr_byte++ = value;
+    }
 }
 
 void memcpy(void *destination, const void *source, size_t n)
@@ -235,7 +249,7 @@ void memmove(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");
@@ -269,7 +283,7 @@ void memmove(void *destination, const void *source, size_t n)
         if (n >> 2)
         {
             asm volatile ("std\n"
-                          "rep movsd\n"
+                          "rep movsl\n"
                           :
                           : "D"(dest_byte - 4), "S"(src_byte - 4), "c"(n >> 2)
                           : "cc", "memory");