util: use faster zlib's CRC32 implementaion

zlib provides a faster slice-by-4 CRC32 implementation than the
traditional single byte lookup one used by mesa. As most supported
platforms now link zlib unconditionally, we can easily use it.

Improvement for a 1MB buffer (avg MB/s, n=100, zlib 1.2.8):

  i5-6600K                    C2D E4500
mesa zlib                    mesa zlib
 443 1443 225% +/- 2.1%       403 1175 191% +/- 0.9%

It has been verified the calculation results stay the same after this
change.

Signed-off-by: Grazvydas Ignotas <notasas@gmail.com>
Reviewed-by: Eric Engestrom <eric.engestrom@imgtec.com>
Reviewed-by: Marek Olšák <marek.olsak@amd.com>
Reviewed-by: Ian Romanick <ian.d.romanick@intel.com>
This commit is contained in:
Grazvydas Ignotas
2017-12-29 02:05:05 +02:00
parent 87f723408b
commit 6acf22a179

View File

@@ -33,6 +33,9 @@
*/
#ifdef HAVE_ZLIB
#include <zlib.h>
#endif
#include "crc32.h"
@@ -114,6 +117,16 @@ util_hash_crc32(const void *data, size_t size)
const uint8_t *p = data;
uint32_t crc = 0xffffffff;
#ifdef HAVE_ZLIB
/* Prefer zlib's implementation for better performance.
* zlib's uInt is always "unsigned int" while size_t can be 64bit.
* Since 1.2.9 there's crc32_z that takes size_t, but use the more
* available function to avoid build system complications.
*/
if ((uInt)size == size)
return ~crc32(0, data, size);
#endif
while (size--)
crc = util_crc32_table[(crc ^ *p++) & 0xff] ^ (crc >> 8);