Оригинальный набор инструкций 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. Поэтому, возможно, ваш компилятор настроен на неправильную цель.
См. Раздел 3.2 _ «Поле условия» _ документа ARM DDI 0100E. – Michael