Я ищу наиболее эффективный способ перевернуть знак на всех четырех поплавках, упакованных в регистр SSE.
Я не нашел ничего подобного в руководстве разработчика ПО для архитектуры Intel. Ниже приведены вещи, которые я уже пробовал.
Для каждого случая я перебирал код 10 миллиардов раз и получал указание времени стены. Я пытаюсь, по крайней мере, сопоставить 4 секунды, это занимает мой не SIMD подход, который использует только унарный оператор минус.
[48 секунд]
_mm_sub_ps( _mm_setzero_ps(), vec );
[32 с]
_mm_mul_ps( _mm_set1_ps( -1.0f ), vec );
[9 секунд]
union NegativeMask {
int intRep;
float fltRep;
} negMask;
negMask.intRep = 0x80000000;
_mm_xor_ps( _mm_set1_ps( negMask.fltRep ), vec );
Компилятор - gcc 4.2 с -O3. Процессор Intel Core 2 Duo.