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