[prev in list] [next in list] [prev in thread] [next in thread] 

List:       xine-cvslog
Subject:    [xine-cvs] =?utf-8?q?HG=3A_xine-lib-1=2E2=3A_Fix_checksum_generat?= =?utf-8?q?ors_for_big_endian_mac
From:       Torsten_Jager <t.jager () gmx ! de>
Date:       2016-09-16 17:10:16
Message-ID: 720d20422a07b2b6b85f.1474045790 () hg ! debian ! org
[Download RAW message or body]

# HG changeset patch
# User Torsten Jager <t.jager@gmx.de>
# Date 1474045790 -7200
# Node ID 720d20422a07b2b6b85f1922033c6877b54244a2
# Branch  default
# Parent  ad6811727a1164c38d0b7e3cb9dd59b49f82e922
Fix checksum generators for big endian machines.
Sorry for that regression. My only big endian box is an old Amiga
without C compiler, not to speak of porting xine to it...

diff --git a/src/xine-utils/utils.c b/src/xine-utils/utils.c
--- a/src/xine-utils/utils.c
+++ b/src/xine-utils/utils.c
@@ -934,9 +934,13 @@
   return q - to;
 }
 
-/* XXX precalculate 4k instead? */
-static uint32_t tab_crc32_ieee[1024] = {0, 0,};
-static uint16_t tab_crc16_ansi[512] = {0, 0,};
+/* XXX precalculate 5k instead? */
+static uint32_t tab_crc32_ieee[1280] = {0, 0,};
+static uint16_t tab_crc16_ansi[768] = {0, 0,};
+
+/* gcc -O3 recognizes this as bswap32 () */
+#define rev32(n) (((n) << 24) | (((n) << 8) & 0xff0000) | (((n) >> 8) & 0xff00) | ((n) >> 24))
+#define rev16(n) ((((n) << 8) | ((n) >> 8)) & 0xffff)
 
 uint32_t xine_crc32_ieee (uint32_t crc, const uint8_t *data, size_t len) {
   uint32_t *t = tab_crc32_ieee;
@@ -946,13 +950,23 @@
       uint32_t j, u = i << 24;
       for (j = 0; j < 8; j++)
         u = (u << 1) ^ (((int32_t)u >> 31) & 0x4c11db7);
-      t[i] = (u << 24) | ((u << 8) & 0xff0000) | ((u >> 8) & 0xff00) | (u >> 24);
+      t[i] = rev32 (u);
     }
     for (i = 0; i < 256; i++) {
       uint32_t v = t[i];
+#ifdef WORDS_BIGENDIAN
+      t[i + 256] = rev32 (v);
+      v = (v >> 8) ^ t[v & 255];
+      t[i + 512] = rev32 (v);
+      v = (v >> 8) ^ t[v & 255];
+      t[i + 768] = rev32 (v);
+      v = (v >> 8) ^ t[v & 255];
+      t[i + 1024] = rev32 (v);
+#else
       t[i + 256] = v = (v >> 8) ^ t[v & 255];
       t[i + 512] = v = (v >> 8) ^ t[v & 255];
       t[i + 768] = (v >> 8) ^ t[v & 255];
+#endif
     }
   }
   {
@@ -969,21 +983,27 @@
     }
     d32 = (const uint32_t *)data;
     u = len / 4;
+#ifdef WORDS_BIGENDIAN
+    crc = rev32 (crc);
     while (u) {
       crc ^= *d32++;
-#ifdef WORDS_BIGENDIAN
-      crc = t[crc & 0xff]
-          ^ t[((crc >> 8) & 0xff) + 256]
-          ^ t[((crc >> 16) & 0xff) + 512]
-          ^ t[(crc >> 24) + 768];
+      crc = t[(crc >> 24) + 1024]
+          ^ t[((crc >> 16) & 0xff) + 768]
+          ^ t[((crc >> 8) & 0xff) + 512]
+          ^ t[(crc & 0xff) + 256];
+      u--;
+    }
+    crc = rev32 (crc);
 #else
+    while (u) {
+      crc ^= *d32++;
       crc = t[(crc & 0xff) + 768]
           ^ t[((crc >> 8) & 0xff) + 512]
           ^ t[((crc >> 16) & 0xff) + 256]
           ^ t[crc >> 24];
-#endif
       u--;
     }
+#endif
     data = (const uint8_t *)d32;
     u = len & 3;
     while (u) {
@@ -1007,7 +1027,13 @@
     }
     for (i = 0; i < 256; i++) {
       uint16_t v = t[i];
+#ifdef WORDS_BIGENDIAN
+      t[i + 256] = rev16 (v);
+      v = (v >> 8) ^ t[v & 255];
+      t[i + 512] = rev16 (v);
+#else
       t[i + 256] = (v >> 8) ^ t[v & 255];
+#endif
     }
   }
   {
@@ -1025,25 +1051,31 @@
     }
     d32 = (const uint32_t *)data;
     u = len / 4;
+#ifdef WORDS_BIGENDIAN
+    crc = rev16 (crc);
     while (u) {
       uint32_t v = *d32++;
-#ifdef WORDS_BIGENDIAN
       crc ^= v >> 16;
-      crc = t[crc & 255]
-          ^ t[(crc >> 8) + 256];
+      crc = t[(crc >> 8) + 512]
+          ^ t[(crc & 0xff) + 256];
       crc ^= v & 0xffff;
-      crc = t[crc & 255]
-          ^ t[(crc >> 8) + 256];
+      crc = t[(crc >> 8) + 512]
+          ^ t[(crc & 0xff) + 256];
+      u--;
+    }
+    crc = rev16 (crc);
 #else
+    while (u) {
+      uint32_t v = *d32++;
       crc ^= v & 0xffff;
       crc = t[(crc & 255) + 256]
           ^ t[crc >> 8];
       crc ^= v >> 16;
       crc = t[(crc & 255) + 256]
           ^ t[crc >> 8];
-#endif
       u--;
     }
+#endif
     data = (const uint8_t *)d32;
     u = len & 3;
     while (u) {

------------------------------------------------------------------------------
_______________________________________________
Xine-cvslog mailing list
Xine-cvslog@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/xine-cvslog
[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic