2016-12-01 21 views
0

Раздел A6.7.12 из ARMv7-M reference manual дают четыре возможных кодировки для команды перехода (B):Длинные условные ветви в Thumb-2

  • Т1: 16 битой инструкция, 4-битовое состояние, 8-разрядного адрес
  • T2: 16 битых инструкции, нет состояния, 11-битного адрес
  • Т3: 32-битной инструкция, 4-битового состояние, 17-битного адрес
  • Т4: 32-битная инструкция, нет состояния, 21-битный адрес

С T3 (и T1 и T2) я могу только разветвиться до адреса между -1048576 и 1048574 позициями из счетчика программ. Что мне делать, если я хочу, чтобы условная ветка удалялась дальше?

Следующая (в UAL):

it  ne 
bne.w some_far_label 

дает мне предупреждение устаревания:

Warning: IT blocks containing 32-bit Thumb instructions are deprecated in ARMv8 
+0

v7-M и v8-A (где применяется эта устаревание) - это очень разные вещи - какой из них действительно имеет значение здесь? – Notlikethat

+0

@Notlikethat Я работаю над процессором ARMv7 rev 4 (v7l) '(Raspberry Pi 2B), но хочу генерировать Thumb-only. Я действительно генерирую этот код и хочу, чтобы он был применим для процессоров, у которых есть только Thumb (например, Cortex M). – Keelan

+0

В этом случае вы не должны настраивать ARMv8 вообще. FWIW, однако, лучше всего просто отключить это предупреждение. – Notlikethat

ответ

1

Что я должен делать, если я хочу условную ветвь дальше?

Просто используйте MOV{cond} PC, Rx инструкцию с адресом назначения в этом регистре:

LDR R1, =some_very_far_label 
IT NE 
MOVNE PC, R1 
+0

Хорошо, я мог подумать об этом сам. Спасибо, хотя :) Эффективность Qua, добавив нагрузку в условный блок, также станет улучшением? – Keelan

+0

Да, вы могли бы поставить LDR в IT-блок как небольшое улучшение. –

+0

Я не собирался вставлять его в блок, потому что ARMv8-A отказывается от нескольких инструкций в IT-блоке, но для добавления дополнительного IT-блока. Во всяком случае, я сам проведу тест производительности. Сейчас я отсутствую на своем компьютере, но попробую это через несколько часов, а затем, вероятно, поддержу и приму этот ответ :) – Keelan

1

Поскольку вы говорите на самом деле ориентации ARMv7, то лучше всего делать это предупреждение, чтобы просто игнорировать или отключить это, в идеале, не нацеливая ARMv8-A, чтобы спровоцировать его в первую очередь.

Для процессоров V7 это совершенно неуместно; для существующих процессоров v8-A, это в значительной степени не имеет значения, потому что главная точка AArch32 заключается в обратной совместимости с существующим кодом v7, и если бы они не запускали этот код, по крайней мере, так же как и их предшественники v7, они бы не были очень популярны. Для будущих процессоров v8-A, как только значительная часть программного обеспечения перешла на AArch64, может потенциально может быть частью реструктуризации вашего кода AArch32, чтобы избежать блоков ИТ, где это возможно, но в любом случае самое худшее, что нужно сделать: просто закончите с несколькими однонаправленными блоками.

Все это немного глупо, на самом деле. Что ARMv8-A Архитектура Справочное руководство говорит о «частичном устаревания ИТ» является:

ARMv8-А некоторые осуждает использование инструкции T32 IT, по соображениям производительности. [...] Полная функциональность команд ARMv7 IT остается доступной для выполнения устаревшего кода T32. [...]

Да, может быть дополнительный бит управления в ловушку «устаревшим» не использует, но даже если v8-A CPU делает осуществить это, не OS, которая ожидает запуска кода v7 когда-либо собирается его установить. Многоэтажные ИТ-блоки по-прежнему должны поддерживаться будущими реализациями AArch32, они могут быть медленнее, чем альтернативный код, поэтому ARM пытается убедить нас избежать их.Честно говоря, я бы представил теоретические будущие процессоры v8-A, которые не нацелены на запуск существующего 32-битного кода, поэтому могут сделать оптимизацию, из-за чего нежелательно поддерживать многопользовательские IT-блоки эффективно, вероятно, более вероятно в любом случае просто отказаться от поддержки AArch32.

+0

Я действительно хочу, чтобы этот генератор кода был максимально широко применим, поэтому мой таргетинг v8-A, хотя я на малине pi. Однако, большое спасибо за подробное объяснение, он, безусловно, прояснил некоторые вещи для меня. – Keelan

 Смежные вопросы

  • Нет связанных вопросов^_^