Имеет ли инструкция ARM ITE какое-либо применение в этом сценарии? - PullRequest
0 голосов
/ 02 июня 2019

Мой C-компилятор (GCC) создает этот код, который я не считаю оптимальным

8000500: 2b1c cmp r3, # 28

8000502: bfd4 ite le

8000504: f841 3c70 strle.wr3, [r1, # -112]

8000508: f841 0c70 strgt.w r0, [r1, # -112]

Мне кажетсячто компилятор может успешно пропустить инструкцию ITE LE, так как два хранилища, следующие за ним, используют флаги LE и GT из инструкции CMP, так что будет выполняться только одно.Инструкция ITE означает, что только один из STR будет проверен и выполнен, поэтому время должно быть одинаковым, но оно использует дополнительное слово памяти команд.

Есть какие-либо мнения по этому поводу?

Ответы [ 2 ]

2 голосов
/ 02 июня 2019

В режиме большого пальца коды операций команды (кроме команд перехода) не имеют места для условного выполнения.В Thumb1 это означало, что нужно просто использовать ветви, чтобы пропустить инструкции, если это необходимо.

В режиме Thumb2 была добавлена ​​инструкция IT, которая добавляет возможность условного выполнения без встраивания ее в сами коды операций инструкции.В вашем случае часть условия le инструкции strle.w не встраивается в код операции f841 3c70, а фактически выводится из предыдущей инструкции ite le дизассемблером.Если вы используете шестнадцатеричный редактор для изменения инструкции ite le на что-то другое, strle.w и strgt.w неожиданно оба разберутся в обычный str.w.

См. Другой связанный ответ, https://stackoverflow.com/a/26001101, для более подробной информации.

1 голос
/ 03 июня 2019

Синтаксис унифицированного ассемблера , который поддерживает цели A32 и T32, добавил здесь некоторую путаницу.То, что показано в разборке, является более многословным, чем то, что закодировано в кодах операций.

Ваша ITE инструкция очень похожа на заполнитель набора команд большого пальца, она определяет блок IT, который охватывает следующие две инструкции (и, будучи большим пальцем, эти две инструкции не являются индивидуально условными).С точки зрения микроархитектуры / синхронизации необходимо выполнить только одну инструкцию (но не следует предполагать, что это свертывание всегда происходит).

Синтаксис strle / strgt можетиспользоваться самостоятельно для цели T32, где блок IT не является необходимым, поскольку в наборе команд есть специальное поле кода условия.

Для написания (или дизассемблирования) кода, который может использоваться ассемблерами A32 и T32, здесь у вас есть оба подхода к условному выполнению, написанные вместе.Это дает преимущество в том, что одна и та же процедура сборки может быть более переносимой (даже если результирующий код не идентичен - оптимизации в целевом процессоре также будут другими). ​​

С T32 комбинация itи одна 16-битная инструкция соответствует плотности команд эквивалентной инструкции A32, если можно объединить более одной условной инструкции, общий выигрыш.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...