Компилятор IAR ARM имеет странные инструкции по сборке

В настоящее время я разрабатываю проект с ядром ARM CM0+ и использую компилятор IAR. Когда я проверил вывод сборки компилятора, я обнаружил некоторые странные инструкции, такие как «STRDEQ», «EORPL» и т. д. Эти инструкции не задокументированы в документации ARM. Кто-нибудь понимает это поведение.

Спасибо всем.


person Nas Ahmet    schedule 11.09.2014    source источник
comment
См. раздел 3.2 Поле условия документа ARM DDI 0100E.   -  person Michael    schedule 11.09.2014


Ответы (1)


Оригинальный набор инструкций ARM позволяет большинству инструкций быть условными. Это в основном используется для таких случаев, как:

if(c == x)
  c = 0

Это будет скомпилировано примерно так:

cmp   r0, r1
moveq r0, #0

Здесь фактический код операции mov и к нему прикреплено условие, поэтому он выполняется только тогда, когда сравнение до того, как он установил Z-флаг.

Это сохраняет инструкцию перехода. Идея, стоящая за этим, связана с тем фактом, что ветки были довольно дорогой операцией в прошлом. Сегодня у нас есть лучшие предсказатели ветвлений и спекулятивное выполнение, что делает такую ​​оптимизацию менее эффективной. Более новые ISA (Thumb1/2 и AArch64) от ARM больше не поддерживают условное выполнение большинства инструкций. Основными причинами являются лучшее предсказание переходов и очень высокая стоимость пространства кода операции. Условие должно быть закодировано внутри опкода, что отнимает 4 бита, что довольно много. Thumb и Thumb2 имели псевдоинструкцию IT (и варианты с разным количеством добавленных к ней T(hen) и E(lse)), что позволяет сделать инструкции ПОСЛЕ нее условными.

Тем не менее, насколько мне известно, Cortex M0+ не поддерживает ни ARM-ISA, ни IT-инструкции от Thumb. Так что, возможно, ваш компилятор настроен на неправильную цель.

person Nico Erfurth    schedule 11.09.2014