このCコードを考えてみましょう。
int sum=0;
for(int i=0;i<5;i++)
sum+=i;
これは、(疑似)アセンブリで次のように変換できます(ループ展開なし)。
% pseudo-code assembly
ADDI $R10, #0 % sum
ADDI $R11, #0 % i
LOOP:
ADD $R10, $R11
ADDI $R11, #1
BNE $R11, #5 LOOP
したがって、私の最初の質問は、これら2つの方法の間で、ループ展開を使用してこのコードをどのように変換するかです。
1)
ADDI $R10, #0
ADDI $R10, #0
ADDI $R10, #1
ADDI $R10, #2
ADDI $R10, #3
ADDI $R10, #4
2)
ADD $R10, #10
コンパイラーはコードを最適化し、すべての合計を実行せずに10を追加する必要があることを直接知ることができますか?
また、分岐命令でパイプラインをブロックする可能性はありますか?私はそれをこのように書く必要がありますか?
% pseudo-code assembly
ADDI $R10, #0 % sum
ADDI $R11, #0 % i
LOOP:
ADD $R10, $R11
ADDI $R11, #1
NOP % is this necessary to avoid the pipeline blocking?
NOP
NOP
NOP
BNE $R11, #5 LOOP
fetch-decode-exe-mem-write backサイクルがブランチによって中断されないようにするには?