Зачем указывать адрес переменной в ASM, а не просто копировать его в регистр? - PullRequest
0 голосов
/ 25 октября 2011

В своем стремлении изучить ассемблер (используя GCC на x86_64) я натолкнулся на несколько примеров SSE, где вместо простого копирования переменной C в регистр, вместо этого адрес копируется в EAX. Зачем это делать, когда вы можете просто сделать это:

typedef float v4sf __attribute__((vector_size(16)));

typedef union {
    v4sf v;
    float f[4];
} Vec4;

Vec4 vector.v = (v4sf){ 64.1,128.2,256.3,512.4 };
float blah = 2.2;

__asm__("movups %0, %%xmm0 \n\t"
    "movups %1, %%xmm1 \n\t"
    "shufps $0x00, %%xmm1, %%xmm1 \n\t"
    "mulps %%xmm1, %%xmm0 \n\t"
    "movups %%xmm0, %0 \n\t"
    : "+m"(vector)
    : "m"(blah)
    : "%xmm0","%xmm1"
);

Причиняет ли копирование вектора в xmm0 (а не в памяти) снижение производительности?

Вот пример того, о чем я говорю (это синтаксис Intel):

void powf_schlickSSE(const float * a, const float b, float * result){

    __asm {
        mov         eax, a              //load address of vector
        movss       xmm0, dword ptr [b] //load exponent into SSE register
        movups      xmm1, [eax]         //load vector into SSE register
        shufps      xmm0, xmm0, 0       //shuffle b into all floats
        movaps      xmm2, xmm1          //duplicate vector
        mov         eax, result         //load address of result
        mulps       xmm1, xmm0          //xmm1 = a*b
        subps       xmm0, xmm1          //xmm0 = b-a*b
        addps       xmm0, xmm2          //xmm2 = b-a*b+a
        rcpps       xmm0, xmm0          //xmm1 = 1 / (b-a*b+a)
        mulps       xmm2, xmm0          //xmm0 = a * (1 / (b-a*b+a))
        movups      [eax], xmm2         //store result
    }
}

1 Ответ

0 голосов
/ 03 октября 2012

Я вижу несколько причин

  • MSVC (откуда этот синтаксический код Intel, верно?) Не поддерживает передачу значений __m128 в блоки сборки или, по крайней мере, версиюкод был написан для не.Или, может быть, эта версия вообще не поддерживала SSE, кроме как через встроенную сборку.

  • Остальная часть программы не имела дело с векторными типами, поэтому прохождение по указателю было самым простым решением.

...