Описание "хранить результаты в dst
" немного вводит в заблуждение.Встроенная функция возвращает результат добавления вектора в виде значения типа __m128d
.
__m128d arg1 = ...;
__m128d arg2 = ...;
__m128d result = _mm_add_pd(arg1, arg2);
Если вы вызываете переменную dst
вместо result
, то у вас есть код, который соответствует описанию,(Но вы можете называть это как хотите.)
Базовая инструкция SSE, ADDPD
, сохраняет результат операции в выбранном регистре XMM.Компилятор выполняет распределение регистров (и даже сохраняет / перезагружает переменные вектора C, если у него заканчиваются регистры, или вокруг вызова функции, которая блокирует векторные регистры).
Встроенные функции работают с переменными C, как и +
и *
с типами int
или float
.Обычно они компилируются в asm-инструкции, которые работают с регистрами (или, может быть, операндом источника памяти, если он объединяет нагрузку и добавляет встроенную функцию), но оставляя все это компилятору - это смысл использования встроенных функций.
Вы действительно хотитенаписать свой код так, чтобы он мог эффективно компилироваться, хотя: если более 16 __m128
переменных «живы» одновременно, компилятору придется пролить / перезагрузить их.