采用汇编语言128位的变化? [英] 128-bit shifts using assembly language?
问题描述
什么是做一个现代的英特尔CPU上128位的移位(酷睿i7,Sandy Bridge的)。
What is the most efficient way to do 128 bit shift on a modern Intel CPU (core i7, sandy bridge).
一个类似code是在我最内层循环:
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);
}
}
在数据 A [N]
几乎是随机的。
推荐答案
使用指令双移
所以 SHLD
或 SHRD
指令,因为上交所不是用于这一目的。
有一种方法CLASIC,这里有你的测试案例由16位在32位和64位CPU模式128位左移。
So SHLD
or SHRD
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.
在这种方式可以进行无限制的大小移高达32/64位。俞可移于位立即数或在CL寄存器编号。第一个指令操作性也可以在内存地址变量。
16位在32位x86 CPU模式128位左移:
128 bit left shift by 16 bits under 32 bit x86 CPU mode:
mov eax, $04030201;
mov ebx, $08070605;
mov ecx, $0C0B0A09;
mov edx, $100F0E0D;
shld edx, ecx, 16
shld ecx, ebx, 16
shld ebx, eax, 16
shl eax, 16
和由16位在64位x86 CPU模式128位左移:
And 128 bit left shift by 16 bits under 64 bit x86 CPU mode:
mov rax, $0807060504030201;
mov rdx, $100F0D0E0B0C0A09;
shld rdx, rax, 16
shl rax, 16
这篇关于采用汇编语言128位的变化?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!