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)14 static 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)20 static 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