На самом деле 128-битное сравнение двух значений a
и b
возможно при использовании SSE 4.1 с двумя инструкциями и резервным регистром, установленным в ноль ранее.
В сборке x86 с использованием устаревшего 128-битного SSE:
pxor %xmm2, %xmm2 # set xmm2 to zero. Should be moved out of the loop.
# compare %xmm0 to %xmm1 for equality
pxor %xmm0, %xmm1 # xmm1 is zero if both operands are equal
ptest %xmm2, %xmm1 # test not(xmm2) and xmm1. If any bit in xmm1 is set
jc equal # the carry flag is cleared.
not_equal:
...
equal:
Использование встроенных функций в C является предпочтительным, так как они автоматически получат выгоду от синтаксиса операндов AVX 3, который фактически сохраняет значительное количество перемещений регистров SSE.
static const __m128i zero = {0};
inline bool compare128(__m128i a, __m128i b) {
__m128i c = _mm_xor_si128(a, b);
return _mm_testc_si128(zero, c);
}
Этокомпилируется во что-то похожее, как указано выше, особенно временная переменная bool сворачивается и флаг переноса используется напрямую.