英特尔的官方优化指南中有一章介绍了从MMX命令转换到SSE的情况,他们说明了这些命令:
使用可能未与16字节边界对齐的存储器操作数的计算指令必须用未对齐的128位加载(MOVDQU)替换,然后使用相同的计算操作来代替寄存器操作数.
(第5.8章从64位转换为128位SIMD整数,第5-43页)
我无法理解他们的意思是"可能没有与16字节边界对齐",你能澄清一下并给出一些例子吗?
我正在阅读 Apress 的现代 x86 汇编语言书籍。对于编程 64 位 SSE 示例,作者将align 16放在代码中的特定点上。例如
.code
ImageUint8ToFloat_ proc frame
_CreateFrame U2F_,0,64 ; helper macros to create prolog
_SaveXmmRegs xmm10,xmm11,xmm12,xmm13 ; helper macros to create prolog
_EndProlog ; helper macros to create prolog
...
shrd r8d,
pxor xmm5,xmm5
align 16 ; Why this is here ?
@@:
movdqa xmm0,xmmword ptr [rdx]
movdqa xmm10,xmmword ptr [rdx+16]
movdqa xmm2,xmm0
punpcklbw xmm0,xmm5
punpckhbw xmm2,xmm5
movdqa xmm1,xmm0
movdqa xmm3,xmm2
...
Run Code Online (Sandbox Code Playgroud)
作者解释说有必要放置align 16,因为我们使用的是 SSE,以便指令本身对齐。没关系。我的问题是为什么作者选择将align 16放在该特定位置。作为程序员,我应该如何决定 …