В ролях от двойного до __m128 - PullRequest
1 голос
/ 10 апреля 2020

Я искал способ приведения дабла к _m128, чтобы воспользоваться преимуществами инструкций c.

Я пытался использовать:

double d = 7654321.1234567;
_m128 ret =  *reinterpret_cast<__m128*>(d);

Но, конечно, я получил сообщение:

error: invalid cast from type ‘double’ to type ‘__m128* {aka __vector(4) float*}’

Любая помощь будет принята с благодарностью, решение для inline-сборки в порядке ~

1 Ответ

3 голосов
/ 10 апреля 2020

Предполагая, что вы на самом деле хотели вектор double (__m128d), вы ищете _mm_set_sd(d) для увеличения нуля до двойного до __m128d, как _mm_set_pd(0, d).

См. Руководство по встроенным функциям Intel . Я нашел это, выполнив поиск по (double, чтобы найти присущие double (или double*) аргументы.

__m128 - это вектор 4 float; Вы хотели преобразовать double -> float в младший элемент вектора? Как и _mm_set_ps(0.f, 0.f, 0.f, d);


Вы не хотите указывать __m128d* на скалярное двойное число, потому что вектор в два раза шире double. Если бы что-то имело смысл, это была бы (__m128d)d, или stati c, или reinterpret_cast-версия этого.

Но, к сожалению, нет способа просто привести удвоение к __m128d с неопределенным верхним element AFAIK, хотя скалярные числа с плавающей запятой / double и __m128d естественно живут в регистрах XMM. См. Как объединить скаляр в вектор без потери компилятором инструкции обнуления верхних элементов? Ограничения в конструкции встроенных функций Intel?

Некоторые компиляторы (вероятно, все еще просто лязг) могут оптимизировать нулевое расширение или трансляцию в вектор __m128d, если вы используете только скалярные встроенные функции и затем извлекаете скаляр результат. Другие компиляторы фактически теряют инструкции для верхних элементов.

...