有效地跨寄存器移位

Shift across registers efficiently

如何在 x64-Assembly 中用另一个寄存器的最低有效位有效地填充一个寄存器的最高有效位。预期用途是将 128 位值有效除以二(本质上是跨寄存器移位)。

RDX:RAX (result after MUL-Operation)

使用shrd指令将一位从src移到目标:

shrd rax, rdx, 1   ; shift a bit from bottom of RDX into top of RAX
shr  rdx, 1        ; and then shift the high half
; rdx:rax is shifted one bit to the right

或者,使用 shrrcr 指令,但请注意 rcr 是多个微指令,因此在大多数 CPU 上速度较慢:

shr rdx, 1          ; shift LSB of rdx into cf
rcr rax, 1          ; shift CF into rax