Если Y86 позволяет MOVQ получать доступ к памяти, которая не выровнена по QWORD, то это можно сделать.
Но я сомневаюсь, что он будет работать лучше, чем условная ветвь.
Хитрость заключается в том, чтобы записать число в память,
затем прочитайте его снова с адреса, который немного «выключен». Это эффективно сдвигает биты на кратное 8. Объедините это с addq
, чтобы сдвинуть биты 1 влево.
Обратите внимание, что это в значительной степени зависит от последовательности архитектуры процессора.
Следующий пример основан на порядке байтов (в стиле Intel).
На старшем порядке смещения должны быть скорректированы.
(Если вы предпочитаете синтаксис AT & T, измените операнды и удалите скобки.)
movq rbx,number ; sign bit is bit 63 of rbx
movq [address],rbx ; sign bit is most significant bit of the byte at [address+7]
movq rbx,[address+4] ; sign bit is bit 31 of rbx
addq rbx,rbx ; sign bit is bit 32 of rbx
movq [address],bx ; sign bit is least significant bit of the byte at [address+4]
movq rbx,[address+4] ; sign bit is bit 0 of rbx
andq rbx,1 ; rbx = 0 for positive number, rbx = 1 for negative number
addq ax,bx