2525#include <immintrin.h>
2626#include <wmmintrin.h>
2727
28+ #if defined(__GNUC__ ) || defined(__clang__ )
29+ #define TARGET_SSE42_PCLMUL __attribute__((__target__("sse4.2,pclmul")))
30+ #else
31+ #define TARGET_SSE42_PCLMUL
32+ #endif
33+
2834#define CRC_LOAD (s ) \
2935 do { \
3036 __m128i xmm_crc0 = _mm_loadu_si128((__m128i *)s->crc0 + 0);\
4147 _mm_storeu_si128((__m128i *)s->crc0 + 4, xmm_crc_part);\
4248 } while (0);
4349
50+ TARGET_SSE42_PCLMUL
4451ZLIB_INTERNAL void crc_fold_init (deflate_state * const s )
4552{
4653 CRC_LOAD (s )
@@ -55,6 +62,7 @@ ZLIB_INTERNAL void crc_fold_init(deflate_state *const s)
5562 s -> strm -> adler = 0 ;
5663}
5764
65+ TARGET_SSE42_PCLMUL
5866local void fold_1 (deflate_state * const s ,
5967 __m128i * xmm_crc0 , __m128i * xmm_crc1 ,
6068 __m128i * xmm_crc2 , __m128i * xmm_crc3 )
@@ -81,6 +89,7 @@ local void fold_1(deflate_state *const s,
8189 * xmm_crc3 = _mm_castps_si128 (ps_res );
8290}
8391
92+ TARGET_SSE42_PCLMUL
8493local void fold_2 (deflate_state * const s ,
8594 __m128i * xmm_crc0 , __m128i * xmm_crc1 ,
8695 __m128i * xmm_crc2 , __m128i * xmm_crc3 )
@@ -115,6 +124,7 @@ local void fold_2(deflate_state *const s,
115124 * xmm_crc3 = _mm_castps_si128 (ps_res31 );
116125}
117126
127+ TARGET_SSE42_PCLMUL
118128local void fold_3 (deflate_state * const s ,
119129 __m128i * xmm_crc0 , __m128i * xmm_crc1 ,
120130 __m128i * xmm_crc2 , __m128i * xmm_crc3 )
@@ -155,6 +165,7 @@ local void fold_3(deflate_state *const s,
155165 * xmm_crc3 = _mm_castps_si128 (ps_res32 );
156166}
157167
168+ TARGET_SSE42_PCLMUL
158169local void fold_4 (deflate_state * const s ,
159170 __m128i * xmm_crc0 , __m128i * xmm_crc1 ,
160171 __m128i * xmm_crc2 , __m128i * xmm_crc3 )
@@ -221,6 +232,7 @@ local const unsigned zalign(32) pshufb_shf_table[60] = {
221232 0x0201008f ,0x06050403 ,0x0a090807 ,0x0e0d0c0b /* shl 1 (16 -15)/shr15*/
222233};
223234
235+ TARGET_SSE42_PCLMUL
224236local void partial_fold (deflate_state * const s , const size_t len ,
225237 __m128i * xmm_crc0 , __m128i * xmm_crc1 ,
226238 __m128i * xmm_crc2 , __m128i * xmm_crc3 ,
@@ -271,6 +283,7 @@ local void partial_fold(deflate_state *const s, const size_t len,
271283 * xmm_crc3 = _mm_castps_si128 (ps_res );
272284}
273285
286+ TARGET_SSE42_PCLMUL
274287ZLIB_INTERNAL void crc_fold_copy (deflate_state * const s ,
275288 unsigned char * dst , const unsigned char * src , long len )
276289{
@@ -427,6 +440,7 @@ local const unsigned zalign(16) crc_mask2[4] = {
427440 0x00000000 , 0xFFFFFFFF , 0xFFFFFFFF , 0xFFFFFFFF
428441};
429442
443+ TARGET_SSE42_PCLMUL
430444unsigned ZLIB_INTERNAL crc_fold_512to32 (deflate_state * const s )
431445{
432446 const __m128i xmm_mask = _mm_load_si128 ((__m128i * )crc_mask );
0 commit comments