Как преобразовать вектор ps с 4 числами с плавающей точкой в ​​4 типа double и сохранить в массиве pd? - PullRequest
0 голосов
/ 04 февраля 2019

Можно ли с помощью SSE2 / SIMD сохранить __m128 значения (4 float) в массиве double?

Мне нужно перейти с этого кода:

double *pC = c[voiceIndex];
__m128d v_result;

_mm_store_pd(pC, v_result);

к этому:

double *pC = c[voiceIndex];
__m128 v_result_float;

_mm_store_ps(pC, v_result_float);

За исключением того, что вместо 128-битного хранилища 4x 32-битных float с мне нужно преобразовать их в double.

Я не могу изменить «исходный» массив pC (который double)

1 Ответ

0 голосов
/ 04 февраля 2019

По сути, это обратный вопрос к вашему предыдущему вопросу .В этом случае вам нужно movhlps (_mm_movelh_ps) старшие слова в младшие слова перед преобразованием второй половины:

void foo(double* dest, __m128 input) 
{
    // assuming dest is nicely aligned
    _mm_store_pd(dest,   _mm_cvtps_pd(input));
    _mm_store_pd(dest+2, _mm_cvtps_pd(_mm_movehl_ps(input, input)));
}
...