Эффективное переключение между регистрами - PullRequest
1 голос
/ 27 апреля 2020

Как эффективно заполнить старший бит в регистре младшим битом другого регистра в x64-Assembly. Использование по назначению - эффективное деление 128-битного значения на два (по сути, кросс-регистровый сдвиг).

RDX:RAX (result after MUL-Operation)

1 Ответ

2 голосов
/ 27 апреля 2020

Используйте инструкцию shrd, чтобы сдвинуть бит из sr c в место назначения:

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

В качестве альтернативы, используйте инструкцию shr и rcr, но обратите внимание, что rcr - это несколько мопов, поэтому на большинстве процессоров это медленнее:

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