]> git.ipfire.org Git - thirdparty/zlib-ng.git/commitdiff
Unroll more in compare258_c for performance improvement.
authorNathan Moinvaziri <nathan@nathanm.com>
Sat, 23 May 2020 03:06:21 +0000 (20:06 -0700)
committerHans Kristian Rosbach <hk-github@circlestorm.org>
Sun, 24 May 2020 11:53:25 +0000 (13:53 +0200)
Unify length count variable across all compare256 variants.
Early return without break for possible performance improvements.

arch/x86/compare258_avx.c
arch/x86/compare258_sse.c
compare258.c

index 74ca87ac9afe7c6b80f72d562c1c6ea12eadc003..34e93bbcbadce7470a95d36fea85bbc38b79bf9c 100644 (file)
@@ -44,7 +44,7 @@ static inline int32_t compare256_unaligned_avx2_static(const unsigned char *src0
         src0 += 32, src1 += 32, len += 32;
     } while (len < 256);
 
-    return len;
+    return 256;
 }
 
 static inline int32_t compare258_unaligned_avx2_static(const unsigned char *src0, const unsigned char *src1) { 
index 27bae0510f89d18f04c1ef59568599b2c97d4ec0..9695529e2f77c1d2e7489d9965f122999c0f8309 100644 (file)
@@ -51,7 +51,7 @@ static inline int32_t compare256_unaligned_sse4_static(const unsigned char *src0
         src0 += 16, src1 += 16, len += 16;
     } while (len < 256);
 
-    return len;
+    return 256;
 }
 
 static inline int32_t compare258_unaligned_sse4_static(const unsigned char *src0, const unsigned char *src1) {
index 7763bb6a14a717bbc96ec880f3567c8ac6ff31ce..76d062779c61e872b2d81304cf510853b79fabcb 100644 (file)
 
 /* ALIGNED, byte comparison */
 static inline int32_t compare256_c_static(const unsigned char *src0, const unsigned char *src1) {
-    const unsigned char *src0start = src0;
-    const unsigned char *src0end = src0 + 256;
+    int32_t len = 0;
 
     do {
         if (*src0 != *src1)
-            break;
-        src0 += 1, src1 += 1;
+            return len + (*src0 == *src1);
+        src0 += 1, src1 += 1, len += 1;
+        if (*src0 != *src1)
+            return len + (*src0 == *src1);
+        src0 += 1, src1 += 1, len += 1;
+        if (*src0 != *src1)
+            return len + (*src0 == *src1);
+        src0 += 1, src1 += 1, len += 1;
+        if (*src0 != *src1)
+            return len + (*src0 == *src1);
+        src0 += 1, src1 += 1, len += 1;
         if (*src0 != *src1)
-            break;
-        src0 += 1, src1 += 1;
+            return len + (*src0 == *src1);
+        src0 += 1, src1 += 1, len += 1;
         if (*src0 != *src1)
-            break;
-        src0 += 1, src1 += 1;
+            return len + (*src0 == *src1);
+        src0 += 1, src1 += 1, len += 1;
         if (*src0 != *src1)
-            break;
-        src0 += 1, src1 += 1;
-    } while (src0 < src0end);
+            return len + (*src0 == *src1);
+        src0 += 1, src1 += 1, len += 1;
+        if (*src0 != *src1)
+            return len + (*src0 == *src1);
+        src0 += 1, src1 += 1, len += 1;
+    } while (len < 256);
 
-    return (int32_t)(src0 - src0start);
+    return 256;
 }
 
 static inline int32_t compare258_c_static(const unsigned char *src0, const unsigned char *src1) {
@@ -55,25 +66,24 @@ int32_t compare258_c(const unsigned char *src0, const unsigned char *src1) {
 #ifdef UNALIGNED_OK
 /* UNALIGNED_OK, 16-bit integer comparison */
 static inline int32_t compare256_unaligned_16_static(const unsigned char *src0, const unsigned char *src1) {
-    const unsigned char *src0start = src0;
-    const unsigned char *src0end = src0 + 256;
+    int32_t len = 0;
 
     do {
         if (*(uint16_t *)src0 != *(uint16_t *)src1)
-            break;
-        src0 += 2, src1 += 2;
+            return len + (*src0 == *src1);
+        src0 += 2, src1 += 2, len += 2;
         if (*(uint16_t *)src0 != *(uint16_t *)src1)
-            break;
-        src0 += 2, src1 += 2;
+            return len + (*src0 == *src1);
+        src0 += 2, src1 += 2, len += 2;
         if (*(uint16_t *)src0 != *(uint16_t *)src1)
-            break;
-        src0 += 2, src1 += 2;
+            return len + (*src0 == *src1);
+        src0 += 2, src1 += 2, len += 2;
         if (*(uint16_t *)src0 != *(uint16_t *)src1)
-            break;
-        src0 += 2, src1 += 2;
-    } while (src0 < src0end);
+            return len + (*src0 == *src1);
+        src0 += 2, src1 += 2, len += 2;
+    } while (len < 256);
 
-    return (int32_t)(src0 - src0start) + (src0 < src0end && *src0 == *src1);
+    return 256;
 }
 
 static inline int32_t compare258_unaligned_16_static(const unsigned char *src0, const unsigned char *src1) {
@@ -111,7 +121,7 @@ static inline int32_t compare256_unaligned_32_static(const unsigned char *src0,
         src0 += 4, src1 += 4, len += 4;
     } while (len < 256);
 
-    return len;
+    return 256;
 }
 
 static inline int32_t compare258_unaligned_32_static(const unsigned char *src0, const unsigned char *src1) {
@@ -151,7 +161,7 @@ static inline int32_t compare256_unaligned_64_static(const unsigned char *src0,
         src0 += 8, src1 += 8, len += 8;
     } while (len < 256);
 
-    return len;
+    return 256;
 }
 
 static inline int32_t compare258_unaligned_64_static(const unsigned char *src0, const unsigned char *src1) {