Я занимаюсь оптимизацией кода C, работающего в Cortex-R4. во-первых, я не заметил никаких изменений в выводе кода сборки, когда я указал «__builtin_expect» в проверке состояния. Похоже, компилятор генерирует ненужный Jump.
Мой код C:
bit ++; (Likely)
if(__builtin_expect(bit >= 32),0)
{
bit -=32; // unlikely code
xxxxxx; // unlikely code
xxxxxx; // unlikely code
xxxxxx; // unlikely code
}
bit = bit*2 // something (Likely)
return bit;
---- Сгенерированный код ASM -------- (bit => r0)
ADD r2,r2,#1
CMP r0,#0x20
BCC NoDecrement
SUB r0,r0,#0x20
XXXXXXXXX
XXXXXXXXX
XXXXXXXXX
NoDecrement LSL r0,r0,#1
BX lr
---- Мой ожидаемый код ASM --------
ADD r2,r2,#1
CMP r0,#0x20
BHE Decrement
JumbBack LSL r0,r0,#1
BX lr
Decrement SUB r0,r0,#0x20
XXXXXXXXX
XXXXXXXXX
XXXXXXXXX
B JumbBack
предположим, что если этот фрагмент кода C выполняется в цикле, то каждый раз, когда он должен перейти (потому что если условие передается только один раз). Есть ли какие-то другие настройки компилятора, которые на самом деле генерируют код, как ожидалось .. ??