These new SSE4.2 intrinsics build fine on 64-bit x86 but not with the -m32 flag, because _mm_cvtsi64_si128 and _mm_extract_epi64 are apparently unsupported on 32-bit x86. Some GCC discussion:
$ gcc -DWUFFS_CONFIG__FUZZLIB_MAIN fuzz/c/std/xz_fuzzer.c -o /dev/null
$ gcc -m32 -DWUFFS_CONFIG__FUZZLIB_MAIN fuzz/c/std/xz_fuzzer.c -o /dev/null
In file included from fuzz/c/std/xz_fuzzer.c:71:
fuzz/c/std/../../../release/c/wuffs-unsupported-snapshot.c: In function ‘wuffs_crc64__ecma_hasher__up_x86_sse42’:
fuzz/c/std/../../../release/c/wuffs-unsupported-snapshot.c:36935:10: warning: implicit declaration of function ‘_mm_cvtsi64_si128’; did you mean ‘_mm_cvtsi32_si128’? [-Wimplicit-function-declaration]
36935 | v_s0 = _mm_cvtsi64_si128((int64_t)(v_s));
| ^~~~~~~~~~~~~~~~~
| _mm_cvtsi32_si128
fuzz/c/std/../../../release/c/wuffs-unsupported-snapshot.c:36935:10: error: incompatible types when assigning to type ‘__m128i’ from type ‘int’
fuzz/c/std/../../../release/c/wuffs-unsupported-snapshot.c:36964:21: warning: implicit declaration of function ‘_mm_extract_epi64’; did you mean ‘_mm_extract_si64’? [-Wimplicit-function-declaration]
36964 | v_s = ((uint64_t)(_mm_extract_epi64(_mm_xor_si128(v_aa, _mm_xor_si128(v_w2, _mm_slli_si128(v_w1, (int32_t)(8u)))), (int32_t)(1u))));
| ^~~~~~~~~~~~~~~~~
| _mm_extract_si64
$ clang -DWUFFS_CONFIG__FUZZLIB_MAIN fuzz/c/std/xz_fuzzer.c -o /dev/null
$ clang -m32 -DWUFFS_CONFIG__FUZZLIB_MAIN fuzz/c/std/xz_fuzzer.c -o /dev/null
In file included from fuzz/c/std/xz_fuzzer.c:71:
fuzz/c/std/../../../release/c/wuffs-unsupported-snapshot.c:36935:10: warning: implicit declaration of function '_mm_cvtsi64_si128' is invalid in C99 [-Wimplicit-function-declaration]
v_s0 = _mm_cvtsi64_si128((int64_t)(v_s));
^
fuzz/c/std/../../../release/c/wuffs-unsupported-snapshot.c:36935:8: error: assigning to '__m128i' (vector of 2 'long long' values) from incompatible type 'int'
v_s0 = _mm_cvtsi64_si128((int64_t)(v_s));
^ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
fuzz/c/std/../../../release/c/wuffs-unsupported-snapshot.c:36964:21: warning: implicit declaration of function '_mm_extract_epi64' is invalid in C99 [-Wimplicit-function-declaration]
v_s = ((uint64_t)(_mm_extract_epi64(_mm_xor_si128(v_aa, _mm_xor_si128(v_w2, _mm_slli_si128(v_w1, (int32_t)(8u)))), (int32_t)(1u))));
^
2 warnings and 1 error generated.
std/xz depends on std/crc64, which recently changed:
These new SSE4.2 intrinsics build fine on 64-bit x86 but not with the
-m32
flag, because_mm_cvtsi64_si128
and_mm_extract_epi64
are apparently unsupported on 32-bit x86. Some GCC discussion: