繁体   English   中英

使用x86 / x64组件旋转或移位

[英]Rotation or Shifting with x86/x64 Assembly

我有要在汇编中编写的函数,我想确定什么将使我获得最佳吞吐量。

我在RAX中有一个64位的值,我需要获取最高字节并对其执行一些操作,我想知道这样做的最佳方法是什么。

shr  rax, 56    ; This will get me the most significant byte in al.

但是,这比...更有效吗?

rol  rax, 8
and  rax, r12   ; I already have the value 255 in r12

我问的原因是在某些体系结构上,变速速度是您执行变速次数的函数。 如果我还记得,在680x0芯片上,它是6 + 2n,其中n是移位计数。 我认为在x86架构上并非如此,但是我不确定...因此人们的启发会受到赞赏。 (我了解延迟)

还是有一种简单的方法可以将RAX的0-31位与32-64位交换而不是旋转或移位? 类似于680x0上的交换操作。

根据http://agner.org/optimize/上的指令表,具有立即计数的rol是单uop / m-op指令,在Intel(奔腾M到Haswell)和AMD(K8到Steamroller)上具有1个周期的延迟)。 吞吐量范围从每个时钟一个到每个时钟三个。

在Intel上,可变计数( rol r, cl )的旋转速度较慢,在AMD上则相同。

显然,如果您要问这种问题,请阅读Agner Fog的指南,因为对于高性能而言,比单独使用一条指令要重要得多。


如果要在多个数据项上执行此操作,则可以一次对16B(带有SSE的xmm寄存器)或32B(带有AVX的ymm寄存器)块使用向量重排。 pshufd xmm, xmm, imm可让您为每个输出dword选择任何输入dword。 (因此,您可以播放和播放内容,也可以进行简单的随机播放。)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM