Оригинальный набор инструкций 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