将 rax 寄存器的最高位设置为 rdx 寄存器中的最低位的最快方法
Fastest way to set highest order bit of rax register to lowest order bit in rdx register
这是我的方法:
and rdx, 0x1
ror rdx, 1
or rax, rdx
但是我觉得这样效率不是很高。而且我不知道轮班操作是否更具成本效益。
如果 rdx 可以被销毁,那么你不需要那样屏蔽它,因为左移无论如何都会清除剩余的位
shl rdx, 63
or rax, rdx
这里假设rax的MSB被清空,如
尝试
add rax,rax
shld rdx, rax, 63
先去掉rax的msb,然后拼接后的序列只包含rdx的lsb和rax的63位,要左移到rdx
。
或
add rax, rax
shrd rax, rdx, 1
(这个答案假定问题中的解释是正确的,而代码是错误的——因为 'copying' 使用该代码不可能在设置位上清除位。)
旋转在现代处理器上和移位一样快,但在旧处理器上,它可能会很慢,所以如果可以解决问题,最好使用移位。
如果你能破坏 rdx
,我很确定下面的指令序列是任何 x86_64 处理器上最快的。
shl rdx, 63
or rax, rdx
这是我的方法:
and rdx, 0x1
ror rdx, 1
or rax, rdx
但是我觉得这样效率不是很高。而且我不知道轮班操作是否更具成本效益。
如果 rdx 可以被销毁,那么你不需要那样屏蔽它,因为左移无论如何都会清除剩余的位
shl rdx, 63
or rax, rdx
这里假设rax的MSB被清空,如
尝试
add rax,rax
shld rdx, rax, 63
先去掉rax的msb,然后拼接后的序列只包含rdx的lsb和rax的63位,要左移到rdx
。
或
add rax, rax
shrd rax, rdx, 1
(这个答案假定问题中的解释是正确的,而代码是错误的——因为 'copying' 使用该代码不可能在设置位上清除位。)
旋转在现代处理器上和移位一样快,但在旧处理器上,它可能会很慢,所以如果可以解决问题,最好使用移位。
如果你能破坏 rdx
,我很确定下面的指令序列是任何 x86_64 处理器上最快的。
shl rdx, 63
or rax, rdx