Кодировка состояния ARM `CSET` (как в документации) - PullRequest
3 голосов
/ 10 июня 2019

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 documentation from the ARM Architecture manual

Используя документацию cset и выходные данные ассемблера, можно извлечь следующую таблицу:

+------+----------+
| cond | mnemonic |
|------+----------|
| 0001 | EQ       |
| 0000 | NE       |
| 1011 | GE       |
| 1010 | LT       |
| 1101 | GT       |
| 1100 | LE       |
+------+----------+

Путаница теперь начинается, если взглянуть на коды условий в руководстве по ARM:

Condition encoding as stated in the ARM Architecture manual

Они напротив !

+-----------------+----------+
|    ASSEMBLER    |  MANUAL  |
+------+----------+----------+
| cond | mnemonic | mnemonic |
|------+----------+----------|
| 0001 | EQ       | NE       |
| 0000 | NE       | EQ       |
| 1011 | GE       | LT       |
| 1010 | LT       | GE       |
| 1101 | GT       | LE       |
| 1100 | LE       | GT       |
+------+----------+----------+

Может ли кто-нибудь указать мне на «очевидную» ошибку, которую я делаю?

...