1 /* adler32_ssse3_p.h -- adler32 ssse3 utility functions 2 * Copyright (C) 2022 Adam Stylinski 3 * For conditions of distribution and use, see copyright notice in zlib.h 4 */ 5 6 #ifndef ADLER32_SSSE3_P_H_ 7 #define ADLER32_SSSE3_P_H_ 8 9 #ifdef X86_SSSE3_ADLER32 10 11 #include <immintrin.h> 12 #include <stdint.h> 13 partial_hsum(__m128i x)14static inline uint32_t partial_hsum(__m128i x) { 15 __m128i second_int = _mm_bsrli_si128(x, 8); 16 __m128i sum = _mm_add_epi32(x, second_int); 17 return _mm_cvtsi128_si32(sum); 18 } 19 hsum(__m128i x)20static inline uint32_t hsum(__m128i x) { 21 __m128i sum1 = _mm_unpackhi_epi64(x, x); 22 __m128i sum2 = _mm_add_epi32(x, sum1); 23 __m128i sum3 = _mm_shuffle_epi32(sum2, 0x01); 24 __m128i sum4 = _mm_add_epi32(sum2, sum3); 25 return _mm_cvtsi128_si32(sum4); 26 } 27 #endif 28 29 #endif 30