|
1
2
如果旋转计数是8的倍数,则可以使用字节随机移动。
SSSE3
SSE2
SSE2
如果旋转计数为
不
8的倍数
有AVX512F
否则,只有SSE2和不是16的倍数的计数,您需要左+右移位+或
在asm中实现用c表示旋转的常用方法
SSE2具有16位粒度的移位,因此您可以直接这样做。
对于字节粒度,您需要额外的屏蔽来消除在字中字节之间移动的位。
Efficient way of rotating a byte inside an AVX register
. 或者使用类似的技巧
|
|
|
2
0
尽管我问过表演 右转 ,ror的一个子集是执行两个64位值的ror时正好32位。这使你武断 旋转 转换为高32位和低32位的简单交换:
知道你只是在执行一个32位(即 双字 )交换,您可以使用另一条指令:
指令的编码很复杂,英特尔尽其所能 obfuscate the documentation . 您可以将128位xmm视为32位 双字 把它们推到你喜欢的地方:
编码很复杂:
因为我在推 四 双字,面具由四块组成:
这些是从左到右排列的,告诉您应该将32位双字无序排列到哪里的索引:
如果旋转64位四字,则将其打包为
RotateRight(16)现在如果:
我们可以运用同样的技巧。假设64位四字被分为16位字,并对它们进行无序排列:
除了pshufw不能在xmm寄存器上操作。所以我让自己陷入停顿。 RotateRight(24)现在如果:
我们可以应用同样的东西。假设64位四字被分成8位字…… pshufb xmm0,xmm0,something//无序排列压缩字节 好吧,我明天去拿。现在我累了。我本来希望只输入一行代码,但结果却花了四个小时的时间。我只是假设人们现在已经记录了所有这些基本操作;CPU已经存在至少3年了。 RotateRight(1)是的,以后。 脚注我想。我不确定编码是否正确。 |