标题可能看似无稽之谈,但让我解释一下.前几天,当我遇到以下汇编代码时,我正在研究一个程序:
movaps xmm3, xmmword ptr [rbp-30h]
lea rdx, [rdi+1320h]
movaps xmm5, xmm3
movaps xmm6, xmm3
movaps xmm0, xmm3
movss dword ptr [rdx], xmm3
shufps xmm5, xmm3, 55h
shufps xmm6, xmm3, 0AAh
shufps xmm0, xmm3, 0FFh
movaps xmm4, xmm3
movss dword ptr [rdx+4], xmm5
movss dword ptr [rdx+8], xmm6
movss dword ptr [rdx+0Ch], xmm0
mulss xmm4, xmm3
Run Code Online (Sandbox Code Playgroud)
而且似乎主要只是将[rbp-30h]的四个浮点数复制到[rdx].这些shufpss仅用于选择四个浮点中的一个xmm3(例如,shufps xmm5, xmm3, 55h选择第二个浮点并将其放入xmm5).
这使我怀疑,如果编译器这样做是因为shufps实际上比存储器存取(像快movss xmm0, dword ptr [rbp-30h],movss dword ptr …
我想知道总是使用glPushAttrib(GL_ALL_ATTRIB_BITS)是否可以?
或者,由于某些性能问题,仅推送必要的位是否更好?