对于xmm寄存器,没有inc
等效指令,也没有paddw
的立即操作数形式(因此也没有相当于add eax, 1
的指令)。
paddw
(以及其他元素大小)仅适用于xmm/m128源操作数。因此,如果要增加矢量的一个元素,则需要从内存中加载常量或即时生成。
例如,增加xmm0的所有元素的最便宜方法是:
pcmpeqw xmm1,xmm1
psubw xmm0, xmm1
或者
paddw xmm0, [ones]
如果构造常量需要超过两个指令,或寄存器压力很大,那么从内存加载常量可能是一个好主意。
如果您想构建一个常量,仅递增低32位元素,例如,您可以使用字节移位将其他元素归零:
pcmpeqw xmm1,xmm1
psrldq xmm1, 12
psubd xmm0, xmm1
如果你尝试递增xmm2中的低16位元素,那么是一个愚蠢的尝试。我不知道你在做什么,存储到[rbx+8],然后加载到xmm1(将高96位清零)。
以下是一种更不愚蠢的方法来编写xmm->gp->xmm往返。 (与使用矢量常量的paddw相比仍然很糟糕)。
movd edx, xmm2
inc edx
pinsrw xmm2, edx, 0
如果你想使用除16位以外的元素进行工作,你可以使用SSE4.1的pinsrb/d/q指令,或者使用movd和shuffles指令。
请参考Agner Fog的优化汇编指南,了解如何更好地使用SSE向量。另外,在x86标签维基中还有其他链接。
inc
和pextrw
。否则,OP可能真的很困惑。如果它应该是关于浮点数的问题,那么显然你只需要添加一个向量,其中所有元素都为零,除了一个元素。(或者如果是低元素,则使用addss
,因为这些指令与旧值合并)。 - Peter Cordes