Условное выполнение инструкций Cortex M4

Кто любит RISC в жизни, заходим, не стесняемся.
Ответить
Открыл глаза
Сообщения: 67
Зарегистрирован: Ср май 28, 2008 14:33:11
Откуда: Россия, Саров

Сообщение Карась »

Привет, народ! Поздравляю всех с Новым Годом!

Я вот что-то не понимаю, объясните, пожалуйста, В чём разница между вот этим:

Код: Выделить всё

CMP       R1, R0
MOVEQ     R2, R1
MOVNE     R2, R0
И вот этим:

Код: Выделить всё

CMP       R1, R0
ITE       EQ
MOVEQ     R2, R1
MOVNE     R2, R0
А именно, какова роль инструкции ITE во втором случае? Разве суффиксы EQ и NE
сами по себе не дают нужного эффекта?
Контактная информация:
Реклама
SII
Вымогатель припоя
Сообщения: 635
Зарегистрирован: Пт янв 30, 2009 14:50:35
Откуда: Солнечногорск

Сообщение SII »

В системе команд ARM все "обычные" и изрядная часть прочих инструкций имеют возможность условного выполнения. Однако в системе команд Thumb -- а только она имеется в любых процессорах М-профиля (т.е. в ядрах серии Cortex-M) -- нет никаких условно выполняемых команд, кроме переходов Bxx. Поэтому, чтобы обеспечить-таки возможность условного выполнения коротких последовательностей команд (до четырёх), в Thumb-2 была введена специальная инструкция IT. В просто Thumb (это все старые процессоры, кроме архитектуры ARMv6T2, а также ядро Cortex-M0) этой инструкции нет, поэтому условное выполнение команд там невозможно (за исключением уже упоминавшихся условных переходов).

В принципе, транслятор ассемблера мог бы разобраться и вставить IT сам, видя, что указаны суффиксы условий. Но, во-первых, это может быть не реализовано в конкретном трансляторе, во-вторых, явно показывает, что там имеется отдельная инструкция (а следовательно, под неё выделяется память), ну а в-третьих, позволяет дополнительно убедиться в правильности условий в последующих командах, а также точно определить границу IT-блока, поскольку инструкция IT задаёт ещё и число условных операций за ней (например, ITTEE указывает, что будет 4 инструкции: сначала две с прямым условием, а затем две с обратным).
Реклама
Открыл глаза
Сообщения: 67
Зарегистрирован: Ср май 28, 2008 14:33:11
Откуда: Россия, Саров

Сообщение Карась »

Правильно ли я понял, что в случае Cortex-M процессоров, в инструкциях, составляющих тело IT-блока, суффиксы можно писать, а можно не писать, эффект будет одинаковый?
Контактная информация:
SII
Вымогатель припоя
Сообщения: 635
Зарегистрирован: Пт янв 30, 2009 14:50:35
Откуда: Солнечногорск

Сообщение SII »

Зависит от транслятора: если по-хорошему, он должен бы ругнуться на отсутствие условий у инструкций, попадающих в IT-блок (а вдруг программист ошибся и либо неверно написал IT, либо пропустил условно выполняемую команду?).
Реклама
Эиком - электронные компоненты и радиодетали
Открыл глаза
Сообщения: 67
Зарегистрирован: Ср май 28, 2008 14:33:11
Откуда: Россия, Саров

Сообщение Карась »

Значит это всё из-за особенностей Кортексов. А суффиксы пишут для совместимости с разными ассемблерами. Вот теперь всё понятно! Благодарю за обстоятельное разъяснение!
Контактная информация:
Реклама
SII
Вымогатель припоя
Сообщения: 635
Зарегистрирован: Пт янв 30, 2009 14:50:35
Откуда: Солнечногорск

Сообщение SII »

Карась писал(а):Значит это всё из-за особенностей Кортексов
"Кортексы" поминают постоянно, но, строго говоря, это некорректно. Cortex -- это общее название группы процессорных ядер, но они могут сильно различаться между собой. Есть ядра для "обычных" микроконтроллеров -- так называемый M-профиль. Они соответствуют версиям архитектуры ARMv6-M (Cortex-M0) и разным вариантам ARMv7-M (другие ядра Cortex-M). Есть ядра для высокопроизводительных и особо надёжных (ну, так декларировано) микроконтроллеров -- R-профиль (серия Cortex-R), соответствующая версии архитектуры ARMv7-R. Наконец, есть ядра, предназначенные для микропроцессоров, а не микроконтроллеров -- A-профиль (Cortex-A), соответствующий версии ARMv7-A. Так вот, версии ARMv7-R и ARMv7-A, т.е. серии ядер Cortex-R и Cortex-A, являются "истинными" ARMами, имеющими и систему команд ARM, и систему команд Thumb; именно они совместимы снизу вверх со всеми предыдущими версиями (кроме ARMv6-M). Ну а M-профиль -- это уже как бы и не настоящий ARM, поскольку ARMовская система команд у него отсутствует; кроме того, кардинально отличается системная архитектура (обработка прерываний и т.д.). Вот по этой причине поминать "Кортексы" обычно технически некорректно -- в Вашем конкретном случае Вы хотели сказать о М-профиле архитектуры, например, а не о всех современных ядрах от ARM (куда, кстати, входят и 64-разрядные процессоры архитектуры ARMv8).

Кстати говоря, из-за параллельного существования версий архитектуры и названий ядер путаница возникала и раньше. Например, очень популярное ядро ARM7TDMI-S соответствует архитектуре ARMv4T, но ей же соответствует ещё несколько ядер, обозначений коих я не помню.

Разница между версией архитектуры (ARMv4T или ARMv7-M, например) и названием ядра (скажем, ARM7TDMI-S и Cortex-M3) заключается в том, что версия архитектуры может быть общей для многих ядер; она показывает, как ядро выглядит с точки зрения программиста (какие есть регистры, какие команды доступны и т.д. т.п.). Имя же ядра обозначает конкретную реализацию "в железе" (ну или на языке описания аппаратуры -- ARMы сделаны на Verilog, например) той или иной архитектуры. Одна и та же архитектура может быть реализована разными способами, отличающимися сложностью и производительностью, но выглядящими одинаково с точки зрения программиста. Особенно хорошо это заметно на персоналках, где используются процессоры архитектуры IA-32 (это её официальное название; x86 -- принятое в народе обозначение), но и в случае с ARMами имеем, вообще говоря, то же самое.
Реклама
Ответить

Вернуться в «ARM»