1 /*-------------------------------------------------------------------------
4 * Compute CRC-32C checksum using Intel SSE 4.2 instructions.
6 * Portions Copyright (c) 1996-2025, PostgreSQL Global Development Group
7 * Portions Copyright (c) 1994, Regents of the University of California
11 * src/port/pg_crc32c_sse42.c
13 *-------------------------------------------------------------------------
17 #include <nmmintrin.h>
19 #include "port/pg_crc32c.h"
21 pg_attribute_no_sanitize_alignment()
22 pg_attribute_target("sse4.2")
24 pg_comp_crc32c_sse42(pg_crc32c crc
, const void *data
, size_t len
)
26 const unsigned char *p
= data
;
27 const unsigned char *pend
= p
+ len
;
30 * Process eight bytes of data at a time.
32 * NB: We do unaligned accesses here. The Intel architecture allows that,
33 * and performance testing didn't show any performance gain from aligning
39 crc
= (uint32
) _mm_crc32_u64(crc
, *((const uint64
*) p
));
43 /* Process remaining full four bytes if any */
46 crc
= _mm_crc32_u32(crc
, *((const unsigned int *) p
));
52 * Process four bytes at a time. (The eight byte instruction is not
53 * available on the 32-bit x86 architecture).
57 crc
= _mm_crc32_u32(crc
, *((const unsigned int *) p
));
60 #endif /* __x86_64__ */
62 /* Process any remaining bytes one at a time. */
65 crc
= _mm_crc32_u8(crc
, *p
);