Предполагая, что вы на самом деле хотели вектор 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
, если вы используете только скалярные встроенные функции и затем извлекаете скаляр результат. Другие компиляторы фактически теряют инструкции для верхних элементов.