這段代碼(加倍4-向量)的工作原理:添加兩個4-向量與SSE使用指針
__declspec(align(16)) struct vec4 { float a[4]; };
int main()
{
vec4 c;
c.a[0]=2;
c.a[1]=0;
c.a[2]=0;
c.a[3]=0;
__asm {
movaps xmm1, c
addps xmm1, xmm1
movaps c, xmm1
}
}
但這件(做同樣的,但現在用的指針對準的數據)沒有按't:
__declspec(align(16)) struct vec4 { float a[4]; };
int main()
{
vec4* c = new vec4;
c->a[0]=2;
c->a[1]=0;
c->a[2]=0;
c->a[3]=0;
__asm {
movaps xmm1, c
addps xmm1, xmm1
movaps c, xmm1
}
}
爲什麼?
我需要它來處理指針,因爲我不能使用對齊數據本身作爲函數參數。
你爲什麼不使用SSE內在函數?只是想知道...我不寫SSE代碼。 – rubenvb
顯然,相同的代碼不能適用於這兩種情況,因爲它們的間接級別不同。你必須首先將指針加載到一個寄存器中,然後使用另一個間接指針。例如,'mov eax,c; movaps xmm1,[eax]'... – Jester
當編寫一個更復雜的矢量化算法時,當寄存器壓力增加時,通常有太多東西進出寄存器,我可以通過編寫它在自己的組裝中。 – renger