Вы можете использовать _mm_blendv_ps(a, v_add_neg, a)
. blendvps
принимает vector input и использует бит знака каждого элемента в качестве условия наложения для этого элемента.
Вам нужна только маска перемещения, если она нужна как целое число, , а не вектор, например, использовать его в качестве индекса для справочной таблицы или для разветвления всех векторных элементов, имеющих, например, некоторое свойство.
Цель кода - изменить знаки элементов вектора на основе знаков в соответствующих элементах другого вектора.
Использование логических значений для управления знаковыми битами :
// pick your favourite way to express a 0x80000000 FP constant: just the sign bit set.
__m128 sign_v = _mm_and_ps(v, _mm_set1_ps(-0.0));
__m128 a_times_sign_v = _mm_xor_ps(a, sign_v);
Отражает знак элементов в a
, где v
имеет установленный бит знака.
Обратите внимание, что -0.0
рассматривается как отрицательный, а не ноль, а -NaN
также рассматривается как обычный отрицательный. Если вы этого не хотите, используйте _mm_cmplt_ps
и левую смену или AND, эту маску сравнения, чтобы получить битовую маску знака для xorps
.