Cortex-R4で動作するCコードで最適化を行っています。 まず、コンディションチェックで "__builtin_expect"を指定したときに、アセンブリコードの出力に変更が見られませんでした。 コンパイラが不要なジャンプを生成するようです。__builtin_expectを使用したARMの静的分岐予測は機能しません。
マイ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コードのこの部分は、ループで実行されている場合であれば条件が渡されるため、各時間は、それが(ジャンプしなければならないと仮定 1回だけ)。 実際には、期待どおりにコードを生成する他のコンパイラ設定はありますか?