2014-09-11 4 views
0

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

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

+0

См. Раздел 3.2 _ «Поле условия» _ документа ARM DDI 0100E. – Michael

ответ

2

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

if(c == x) 
    c = 0 

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

cmp r0, r1 
moveq r0, #0 

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

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

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

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