考虑这个 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
所以我的第一个问题是如何在这两种方式之间使用循环展开来翻译这段代码:
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 循环被分支中断?