В свое время я успешно оптимизировал одну свою библиотеку с помощью инструкций 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