TL; DR cset
код, сгенерированный ассемблером, использует другие коды условий , чем в руководстве ARM.
Я не понимаю, как кодируются условия для инструкции cset
.
У меня проблемы с пониманием того, почему ассемблер генерирует бинарный код, отличный от того, что я ожидал бы, посмотрев Справочное руководство по архитектуре - ARMv8 .
GNU-ассемблер на моем pi3 генерирует следующий код для различных cset
проверок (я подтвердил, что код работает должным образом):
9a 9f 17 e0 cset x0, eq // eq = none
9a 9f 07 e0 cset x0, ne // ne = any
9a 9f b7 e0 cset x0, ge // ge = tcont
9a 9f a7 e0 cset x0, lt // lt = tstop
9a 9f d7 e0 cset x0, gt
9a 9f c7 e0 cset x0, le
Интересной частью здесь является бит 12-15 (пятый полубник слева), который кодирует условие ( cond ), как показано в руководстве:
Используя документацию cset
и выходные данные ассемблера, можно извлечь следующую таблицу:
+------+----------+
| cond | mnemonic |
|------+----------|
| 0001 | EQ |
| 0000 | NE |
| 1011 | GE |
| 1010 | LT |
| 1101 | GT |
| 1100 | LE |
+------+----------+
Путаница теперь начинается, если взглянуть на коды условий в руководстве по ARM:
Они напротив !
+-----------------+----------+
| ASSEMBLER | MANUAL |
+------+----------+----------+
| cond | mnemonic | mnemonic |
|------+----------+----------|
| 0001 | EQ | NE |
| 0000 | NE | EQ |
| 1011 | GE | LT |
| 1010 | LT | GE |
| 1101 | GT | LE |
| 1100 | LE | GT |
+------+----------+----------+
Может ли кто-нибудь указать мне на «очевидную» ошибку, которую я делаю?