Ich bin mit intrinsics SSE, um zu bestimmen, ob ein Rechteck (definiert durch vier int32
Werte) geändert hat:effizienteste Weg, um zu überprüfen, ob alle __m128i Komponenten 0 sind [mit SSE intrinsics]
__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);
An diesem Punkt, Der sich ergebende Wert xor
ist nur Nullen, wenn das Rechteck nicht geändert wurde. Was ist dann der effizienteste Weg, das zu bestimmen?
Zur Zeit mache ich so:
if (xor.m128i_u64[0] | xor.m128i_u64[1])
{
// rectangle changed
}
Aber ich nehme an, es ist ein intelligenter Weg (möglicherweise einige SSE Anweisung verwendet, die ich noch nicht gefunden haben).
I SSE4.1- auf x64 bin Targeting und ich bin Codierung C++ in Visual Studio 2013
Warum beziehen Sie sich auf einen 128-Bit-Ganzzahlwert als 'NULL', was eine Null * -Zeiger * -Konstante ist? –
@KeithThompson 'NULL' ist ein Makro, das auf 0 erweitert wird. C++ hat' nullptr' als Nullzeigerkonstante. – d7samurai
'NULL' wird zu einer Implementierung erweitert, die C++ - Nullzeigerkonstante definiert. Es * könnte * zu "nullptr" erweitern. Selbst wenn es zu "0" expandiert, sollte es nicht als Ganzzahl verwendet werden. –