Условные переходы проверяют только коды условий (в данном случае ZF), и поэтому не всегда нужно следовать cmp
.Хотя коды условий установлены cmp
, они также устанавливаются другими операциями, включая add
и sub
, которые устанавливают флаг ZF, когда результат равен нулю.
Кажется, что %rdi
соответствует x
, что соответствует типичному соглашению о передаче аргументов.val<<1
было преобразовано в эквивалент addq %rax, %rax
.
Вы можете видеть побитовые и и побитовые или инструкции (andl $1, %ecx
и orq %rcx, %rax
).Присвоение val
выполняется с помощью or
.
Затем у вас есть x>>=1
как shrq %rdi
, за которым следует условие цикла и возврат.