例如,a0......a15,更改为-a0,......,-a15我找了官方手册,但没有找到。我在网上找了很长时间。但没有用。请帮助或尝试给予一些想法如何实现这一点。
t2a7ltrp1#
据我所知,没有一条指令可以在所有上下文中充当neg的压缩等价物,但是,如果你有一个全零向量,你可以用一条指令从中减去。如果还没有全零向量,可以通过vpxor获得一个全零向量:
neg
vpxor
vpxor xmm7, xmm7, xmm7
然后可以使用vpsubw从全零向量中减去16位数,得到负数(这里,我从ymm1获取输入,并在ymm2中输出,使用ymm7作为全零向量):
vpsubw
ymm1
ymm2
ymm7
vpsubw ymm2, ymm7, ymm1
您可以生成全零寄存器一次,然后使用同一寄存器进行多次减法,只要不更改其值(例如,如果你有一个循环,需要对大量的16位数求反,你可以在循环之前创建一个零寄存器,然后只需要使用vpsubw就可以对循环内部的数求反)。所以这个方法只需要一条指令就可以对你的数求反,加上一个设置指令。请注意,xmm寄存器上的vpxor会将相应ymm寄存器的上半部分清零,因此,可以通过xor将xmm寄存器与其自身相加,将整个ymm寄存器清零。
xmm
ymm
xor
1条答案
按热度按时间t2a7ltrp1#
据我所知,没有一条指令可以在所有上下文中充当
neg
的压缩等价物,但是,如果你有一个全零向量,你可以用一条指令从中减去。如果还没有全零向量,可以通过
vpxor
获得一个全零向量:然后可以使用
vpsubw
从全零向量中减去16位数,得到负数(这里,我从ymm1
获取输入,并在ymm2
中输出,使用ymm7
作为全零向量):您可以生成全零寄存器一次,然后使用同一寄存器进行多次减法,只要不更改其值(例如,如果你有一个循环,需要对大量的16位数求反,你可以在循环之前创建一个零寄存器,然后只需要使用
vpsubw
就可以对循环内部的数求反)。所以这个方法只需要一条指令就可以对你的数求反,加上一个设置指令。请注意,
xmm
寄存器上的vpxor
会将相应ymm
寄存器的上半部分清零,因此,可以通过xor
将xmm
寄存器与其自身相加,将整个ymm
寄存器清零。