преобразование цикла в сборку без первоначального теста - PullRequest
0 голосов
/ 13 октября 2018

Функция test_two имеет следующую общую структуру:

long test_two(unsigned long x) {

  long val = 0;
  int i;

  for(i=64; i != 0; i--) {
   val = (val<<1)|(x & 0x1);
   x>>=1;
  }

 return val;
}

компилятор gcc C генерирует следующий код сборки:

test_two:
 movl $64, %edx
 movl $0, %eax
.L10:
 movq %rdi, %rcx
 andl $1, %ecx
 addq %rax, %rax
 orq %rcx, %rax
 shrq %rdi
 subq $1, %rdx
 jne .L10
 rep ret

Я неправильно понял команду cmp.Поэтому я отредактировал свое оригинальное предложение и надеюсь, что некоторые люди не смущают мой вопрос.Извините за них.

1 Ответ

0 голосов
/ 13 октября 2018

Условные переходы проверяют только коды условий (в данном случае 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, за которым следует условие цикла и возврат.

...