Я использую встроенные функции SSE, чтобы определить, изменился ли прямоугольник (определяемый четырьмя значениями int32
):
__m128i oldRect; // contains old left, top, right, bottom packed to 128 bits
__m128i newRect; // contains new left, top, right, bottom packed to 128 bits
__m128i xor = _mm_xor_si128(oldRect, newRect);
На этом этапе полученное значение xor
будет иметь все нули, если прямоугольник не изменился. Каков тогда самый эффективный способ определить это?
В настоящее время я делаю так:
if (xor.m128i_u64[0] | xor.m128i_u64[1])
{
// rectangle changed
}
Но я предполагаю, что есть более разумный способ (возможно, с использованием некоторой инструкции SSE, которую я еще не нашел).
Я нацеливаюсь на SSE4.1 на x64 и кодирую C++ в Visual Studio 2013.
Изменение: Вопрос не совсем так же, как переменная __m128i ноль? , поскольку это указывает "на процессорах SSE-2 и более ранних" (хотя Антонио действительно добавил ответ "для полноты", который касается 4.1 через некоторое время после того, как этот вопрос был опубликован и на него дан ответ).