AVX / SSE преобразовывает маску знака с плавающей точкой в ​​__m128i - PullRequest
0 голосов
/ 26 апреля 2018

Я использую следующее для извлечения знакового бита __mm128:

const int sign_mask = _mm_movemask_ps(a);

Теперь я хочу использовать следующее, чтобы смешать два вектора:

v_add = _mm_blendv_ps(a, v_add_neg, _mm_castsi128_ps(v_mask));

v_mask должен прийти от sign_mask, но я не могу найти встроенную функцию, которая делает это.

Цель кода - изменить знаки элементов вектора a на основе знаков соответствующих элементов другого вектора.

1 Ответ

0 голосов
/ 26 апреля 2018

Вы можете использовать _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.

...