Загрузка констант с плавающей запятой в регистры SSE

Я пытаюсь найти эффективный способ загрузки поплавков константы времени компиляции в регистры 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)]

В идеале было бы неплохо, если бы у меня были константы способ даже не трогать память и просто делать это с помощью немедленных инструкций стиля (например, констант, скомпилированных в саму инструкцию).

Спасибо

11
задан coderdave 15 February 2011 в 18:31
поделиться