使用汇编语言进行 128 位移位?
在现代 Intel CPU(酷睿 i7、sandybridge)上进行 128 位移位的最有效方法是什么?
类似的代码位于我最内部的循环中:
u128 a[N];
void xor() {
for (int i = 0; i < N; ++i) {
a[i] = a[i] ^ (a[i] >> 1) ^ (a[i] >> 2);
}
}
a[N]
中的数据几乎是随机的。
What is the most efficient way to do 128 bit shift on a modern Intel CPU (core i7, sandy bridge).
A similar code is in my most inner loop:
u128 a[N];
void xor() {
for (int i = 0; i < N; ++i) {
a[i] = a[i] ^ (a[i] >> 1) ^ (a[i] >> 2);
}
}
The data in a[N]
is almost random.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
使用指令Shift Double。
所以
SHLD
或SHRD
指令,因为 SSE 不适用于此目的。有一个经典的方法,这里有32位和64位CPU模式下128位左移16位的测试用例。
通过这种方式,您可以执行最多 32/64 位的无限制大小转换。 Yoo 可以移位立即位数或 cl 寄存器中的数字。第一条指令操作符也可以寻址内存中的变量。
32 位 x86 CPU 模式下 128 位左移 16 位:
64 位 x86 CPU 模式下 128 位左移 16 位:
Using instruction Shift Double.
So
SHLD
orSHRD
instruction, because SSE isn't intended for this purpose.There is a clasic method, here are you have test cases for 128 bit left shift by 16 bits under 32 and 64 bit CPU mode.
On this way you can perform unlimited size shift for up to 32/64 bits. Yoo can shift for immediate number of bits or for number in cl register. First instruction operant can also address variable in memory.
128 bit left shift by 16 bits under 32 bit x86 CPU mode:
And 128 bit left shift by 16 bits under 64 bit x86 CPU mode:
在这种特殊情况下,您可以使用 x86 SHR 和 RCR 指令的组合:
如果您的目标是 x86-64,则可以简化为:
更新:更正了 64 位版本中的拼写错误
In this particular case you could use a combination of x86 SHR and RCR instructions:
If your target is x86-64 this simplifies to:
Update: corrected typos in 64-bit version