Cortex-R4で実行されているCコードで最適化を行っています。まず、条件チェックで「__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 コード -------- (ビット => 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 コードの一部がループで実行される場合、そのたびにジャンプする必要があるとします (if 条件が 1 回しか渡されないため)。実際に、期待どおりにコードを生成する他のコンパイラ設定はありますか..??