MIPS机器代码优化

时间:2016-02-02 13:39:58

标签: c gcc assembly mips

总的来说,我正在研究处理器中的流水线技术,下面是一个示例代码,它按顺序强制两个指令之间的数据依赖关系,我想看看汇编代码中是否有任何后果。

int func(int a, int b, int c, int d){
    a += b;
    d += a + c;
    return d;
}

使用(gcc 4.8.5)进行编译和反汇编:

mips-sde-elf-gcc -O1 -o func func.c -c && mips-sde-elf-objdump -S func

这是输出:

00000000 <func>:
0:  00852021    addu    a0,a0,a1
4:  00861021    addu    v0,a0,a2
8:  03e00008    jr  ra
c:  00471021    addu    v0,v0,a3

问题:为什么在计算并将最终结果放入返回寄存器之前会有跳转返回指令?这是一种聪明的流水线使用还是输出不是真实的情况,因为没有链接到最终的可执行文件?

1 个答案:

答案 0 :(得分:3)

在MIPS上,(几乎)总是执行分支指令后的指令,这是设计的,因为它意味着可以更有效地利用流水线。

原因是当执行分支指令时,已经取出并解码后的指令,但此时尚未取出分支目标处的指令。