Я пытаюсь найти эффективный способ загрузки поплавков постоянной времени компиляции в регистры SSE (2/3). Я пробовал делать простой код, например,
const __m128 x = { 1.0f, 2.0f, 3.0f, 4.0f };
но который генерирует 4 команды movss из памяти!
movss xmm0,dword ptr [[email protected] (14048E534h)]
movss xmm1,dword ptr [[email protected] (14048E530h)]
movaps xmm6,xmm12
shufps xmm6,xmm12,0C6h
movss dword ptr [rsp],xmm0
movss xmm0,dword ptr [[email protected] (14048E52Ch)]
movss dword ptr [rsp+4],xmm1
movss xmm1,dword ptr [[email protected] (14048E528h)]
которые загружают скаляры в и из памяти... (?!?!)
Выполнение этого, хотя..
float Align(16) myfloat4[4] = { 1.0f, 2.0f, 3.0f, 4.0f, }; // out in global scope
генерирует.
movaps xmm5,xmmword ptr [::myarray4 (140512050h)]
В идеале было бы неплохо, если бы у меня были константы, то это было бы способом не касаться памяти и просто делать это с помощью непосредственных инструкций стиля (например, константы, скомпилированные в самой инструкции).
Спасибо