将 rax 寄存器的最高位设置为 rdx 寄存器中的最低位的最快方法

sth*_*55 4 optimization assembly bit-manipulation x86-64 micro-optimization

这是我的方法:

and rdx, 0x1
ror rdx, 1
or rax, rdx
Run Code Online (Sandbox Code Playgroud)

但我认为这不是很有效率。我不知道轮班操作是否会更具成本效益。

Aki*_*nen 5

尝试

 add rax,rax
 shld rdx, rax, 63
Run Code Online (Sandbox Code Playgroud)

首先去除 rax 的 MSb,然后级联序列仅包含 rdx 的 lsb 和 rax 的 63 位,将其左移到rdx

或者

 add rax, rax
 shrd rax, rdx, 1
Run Code Online (Sandbox Code Playgroud)

(这个答案假设问题中的解释是正确的,而代码是错误的——因为使用该代码不可能将清除的位“复制”到设置的位上。)

  • @NateEldredge在Intel处理器上,1个周期内可以并行执行4条“add”指令,而只能执行2条“shl”指令。两者具有相同的延迟。因此,对于代码的其余部分(可能还有超线程的使用),使用“add”可能会更好一些。在 AMD Zen 处理器上,我预计不会有任何差异。 (2认同)
  • 在 AMD Zen+/Zen2 上,`shrd` 出奇地慢,因为它每条指令 (TP) 需要 3 个周期。这在 Zen3 中大部分已修复。因此,在此类处理器上,该代码最终应该会比最初的代码慢。 (2认同)