采用汇编语言128位的变化? [英] 128-bit shifts using assembly language?

查看:479
本文介绍了采用汇编语言128位的变化?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

什么是做一个现代的英特尔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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆