Проблемы с непонятным поведением vshufpd в AVX.

Модератор: Модераторы разделов

BratSinot
Сообщения: 812
ОС: Slackware64

Проблемы с непонятным поведением vshufpd в AVX.

Сообщение BratSinot »

Доброго времени суток!

В свое время я успешно оптимизировал одну свою библиотеку с помощью инструкций SSE*, теперь я решил взяться за AVX. Проблема в том, что некоторые инструкции работают иначе ежели в SSE* (vhaddpd к примеру). Код тривиальный:

Код:

#include <immintrin.h> #include <stdio.h> typedef struct quaternion { double a; double i; double j; double k; } quaternion; int main(void) { struct quaternion n1 = (struct quaternion){3.141592, -2.72192, -6.28384, -9.478}; __m256d n1_t = *(__m256d *)&n1; // 0b00011011 n1_t = _mm256_shuffle_pd(n1_t, n1_t, _MM_SHUFFLE(0,1,2,3)); *(__m256d *)&n1 = n1_t; printf("\t%lf %lf %lf %lf\n", n1.a, n1.i, n1.j, n1.k); return 0; }

Что я ожидаю увидеть?

Код: Выделить всё

    3.141592 -2.721920 -6.283840 -9.478000

А что я получаю?

Код: Выделить всё

    -2.721920 -2.721920 -6.283840 -9.478000

Объяснения что должно быть на месте маски я не нашел, поэтому использовал как в SSE*.

У есть только две возможных причины:
  • Маска задается по другому
  • Ошибка в Intel® Software Development Emulator
Спасибо сказали: