|  | @@ -12,8 +12,6 @@
 | 
	
		
			
				|  |  |  /// compute CRC32 (Slicing-by-8 algorithm), unroll inner loop 4 times
 | 
	
		
			
				|  |  |  uint32_t crc32_4x8bytes(const void* data, size_t length, uint32_t previousCrc32);
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  |  // //////////////////////////////////////////////////////////
 | 
	
		
			
				|  |  |  // Crc32.cpp
 | 
	
		
			
				|  |  |  // Copyright (c) 2011-2016 Stephan Brumme. All rights reserved.
 | 
	
	
		
			
				|  | @@ -22,55 +20,25 @@ uint32_t crc32_4x8bytes(const void* data, size_t length, uint32_t previousCrc32)
 | 
	
		
			
				|  |  |  // see http://create.stephan-brumme.com/disclaimer.html
 | 
	
		
			
				|  |  |  //
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -// if running on an embedded system, you might consider shrinking the
 | 
	
		
			
				|  |  | -// big Crc32Lookup table:
 | 
	
		
			
				|  |  | -// - crc32_bitwise  doesn't need it at all
 | 
	
		
			
				|  |  | -// - crc32_halfbyte has its own small lookup table
 | 
	
		
			
				|  |  | -// - crc32_1byte    needs only Crc32Lookup[0]
 | 
	
		
			
				|  |  | -// - crc32_4bytes   needs only Crc32Lookup[0..3]
 | 
	
		
			
				|  |  | -// - crc32_8bytes   needs only Crc32Lookup[0..7]
 | 
	
		
			
				|  |  | -// - crc32_4x8bytes needs only Crc32Lookup[0..7]
 | 
	
		
			
				|  |  | -// - crc32_16bytes  needs all of Crc32Lookup
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -// define endianess and some integer data types
 | 
	
		
			
				|  |  | -#if defined(_MSC_VER) || defined(__MINGW32__)
 | 
	
		
			
				|  |  | -  #define __LITTLE_ENDIAN 1234
 | 
	
		
			
				|  |  | -  #define __BIG_ENDIAN    4321
 | 
	
		
			
				|  |  | -  #define __BYTE_ORDER    __LITTLE_ENDIAN
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -  #include <xmmintrin.h>
 | 
	
		
			
				|  |  | -  #ifdef __MINGW32__
 | 
	
		
			
				|  |  | -    #define PREFETCH(location) __builtin_prefetch(location)
 | 
	
		
			
				|  |  | -  #else
 | 
	
		
			
				|  |  | -    #define PREFETCH(location) _mm_prefetch(location, _MM_HINT_T0)
 | 
	
		
			
				|  |  | -  #endif
 | 
	
		
			
				|  |  | -#else
 | 
	
		
			
				|  |  | -  // defines __BYTE_ORDER as __LITTLE_ENDIAN or __BIG_ENDIAN
 | 
	
		
			
				|  |  | -  #include <sys/param.h>
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -  #ifdef __GNUC__
 | 
	
		
			
				|  |  | -    #define PREFETCH(location) __builtin_prefetch(location)
 | 
	
		
			
				|  |  | -  #else
 | 
	
		
			
				|  |  | -    #define PREFETCH(location) ;
 | 
	
		
			
				|  |  | -  #endif
 | 
	
		
			
				|  |  | -#endif
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  |  /// zlib's CRC32 polynomial
 | 
	
		
			
				|  |  |  const uint32_t Polynomial = 0xEDB88320;
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  /// swap endianess
 | 
	
		
			
				|  |  | -static inline uint32_t swap(uint32_t x)
 | 
	
		
			
				|  |  | -{
 | 
	
		
			
				|  |  | -#if defined(__GNUC__) || defined(__clang__)
 | 
	
		
			
				|  |  | -  return __builtin_bswap32(x);
 | 
	
		
			
				|  |  | +#if defined (__SVR4) && defined (__sun)
 | 
	
		
			
				|  |  | +#include <sys/isa_defs.h>
 | 
	
		
			
				|  |  | +#endif
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +#if (defined(BYTE_ORDER)&&(BYTE_ORDER == BIG_ENDIAN)) ||  \
 | 
	
		
			
				|  |  | +    (defined(_BIG_ENDIAN)&&defined(__SVR4)&&defined(__sun))
 | 
	
		
			
				|  |  | +#define _le32toh(x) __builtin_bswap32(x)
 | 
	
		
			
				|  |  | +#define BORG_BIG_ENDIAN
 | 
	
		
			
				|  |  | +#elif (defined(BYTE_ORDER)&&(BYTE_ORDER == LITTLE_ENDIAN)) || \
 | 
	
		
			
				|  |  | +      (defined(_LITTLE_ENDIAN)&&defined(__SVR4)&&defined(__sun))
 | 
	
		
			
				|  |  | +#define _le32toh(x) (x)
 | 
	
		
			
				|  |  | +#define BORG_LITTLE_ENDIAN
 | 
	
		
			
				|  |  |  #else
 | 
	
		
			
				|  |  | -  return (x >> 24) |
 | 
	
		
			
				|  |  | -        ((x >>  8) & 0x0000FF00) |
 | 
	
		
			
				|  |  | -        ((x <<  8) & 0x00FF0000) |
 | 
	
		
			
				|  |  | -         (x << 24);
 | 
	
		
			
				|  |  | +#error Unknown byte order
 | 
	
		
			
				|  |  |  #endif
 | 
	
		
			
				|  |  | -}
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  // //////////////////////////////////////////////////////////
 | 
	
		
			
				|  |  |  // constants
 | 
	
	
		
			
				|  | @@ -389,8 +357,8 @@ uint32_t crc32_slice_by_8(const void* data, size_t length, uint32_t previousCrc3
 | 
	
		
			
				|  |  |      size_t unrolling;
 | 
	
		
			
				|  |  |      for (unrolling = 0; unrolling < Unroll; unrolling++)
 | 
	
		
			
				|  |  |      {
 | 
	
		
			
				|  |  | -#if __BYTE_ORDER == __BIG_ENDIAN
 | 
	
		
			
				|  |  | -      uint32_t one = *current++ ^ swap(crc);
 | 
	
		
			
				|  |  | +#ifdef BORG_BIG_ENDIAN
 | 
	
		
			
				|  |  | +      uint32_t one = *current++ ^ _le32toh(crc);
 | 
	
		
			
				|  |  |        uint32_t two = *current++;
 | 
	
		
			
				|  |  |        crc = Crc32Lookup[0][ two      & 0xFF] ^
 | 
	
		
			
				|  |  |              Crc32Lookup[1][(two>> 8) & 0xFF] ^
 |