Алгоритм ксора используя SIMD2 инструкции

у меня возникли довольно серьезные трудности с реализацией ксора двух int чисел между собой используя SIMD2 ( aka SSE ) инструкции. Не могли бы вы показать мне код реализации такого?


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

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

Вот совсем простой пример. Он странный, но для понимания, наверно хватит

#include <iostream>
#include <emmintrin.h>
#include <iomanip>

//для удобства вывода
std::ostream& operator<<(std::ostream& os, const __m128i& x)
{
    for (int i = 0; i < 2; i++) {
        os << std::hex << std::setw(16) << std::setfill('0') << x[i];
    }
    return os;
}

int main()
{
    // загрузим два значения
    __m128i a = _mm_setr_epi32(0x01234567,0x01234567,0x01234567,0x01234567);
    __m128i b = _mm_setr_epi32(0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF);
    // выведем их на консоль
    std::cout << a << '\n' << b << '\n';
    // собственно самая центральная операция
    __m128i c = _mm_xor_pd(a,b);
    // выведем результат
    std::cout << c;
}

Вывод

01234567012345670123456701234567
ffffffffffffffffffffffffffffffff
fedcba98fedcba98fedcba98fedcba98
→ Ссылка