SIMD - обнуление по маске

Подскажите пожалуйста, как обнулить определённые байты вектора по значению из другого вектора ?

Ну то есть, вот есть два вектора:

int main()
{
    __m128i my_m128i      = _mm_set_epi32(7, 6, 5, 4);

    __m128i my_m128i_mask = _mm_set_epi32(0, 1, 1, 0);
}

Как сделать значения 7 и 4 вектора вектора my_m128i нулями в соответствии со значением вектора my_m128i_mask ?

Я думал через умножение, типа перемножить каждый 32 бита двух векторов и автоматически получится ноль. Но что то не нашел такой "функции" у интела.

Нашел только такие:

_mm_mul_pd: Умножает упакованные элементы двойной точности (64-битные) с плавающей запятой в a и b и сохраните результаты в dst.

_mm_mul_epi32: Умножает 32-битные целые числа с младшим знаком из каждого упакованного 64-битного элемента в a и b и сохраните 64-битные результаты со знаком в dst.

А что бы была "функция" которая перемножает 4-е 32 бита вектора __m128i на 4-е 32 бита другого вектора __m128i, что то не нашел.

Может быть существует другой способ обнуления по маске ?


Ответы (1 шт):

Автор решения: mazik7512

Попробуйте использовать побитовую операцию И _mm_and_ps, но только тогда маску следует указывать как (0,-1,-1,0)

→ Ссылка