Architecture 从MIPS交叉编译器获取条件分支槽

Architecture 从MIPS交叉编译器获取条件分支槽,architecture,mips,cross-compiling,pipeline,branch-prediction,Architecture,Mips,Cross Compiling,Pipeline,Branch Prediction,如何使用mipsel-openwrt-linux-gcc交叉编译器获取条件分支槽,其中来自分支之前或之后的指令被移动以填充槽 我只是使用命令获取MIPS代码: ./mipsel-openwrt-linux-gcc -O2 -fno-delayed-branch -S ha.c; 然而,我只是在bne指令之后得到nop指令。-O2和-fno延迟分支选项似乎不起作用 以下是ha.c的内容: int intcompare(int *x, int *y) { if (*x < *y)

如何使用mipsel-openwrt-linux-gcc交叉编译器获取条件分支槽,其中来自分支之前或之后的指令被移动以填充槽

我只是使用命令获取MIPS代码:

./mipsel-openwrt-linux-gcc -O2 -fno-delayed-branch -S ha.c;
然而,我只是在bne指令之后得到nop指令。-O2和-fno延迟分支选项似乎不起作用

以下是ha.c的内容:

int intcompare(int *x, int *y)
{
    if (*x < *y)
        return -1;
    else if (*x > *y)
        return 1;
    else return 0;
}

int mod1(int x, int N)
{
    if (x >= N)
        x -= N;
    return x;
}

int main()
{
    return 0;
}

查看编译器输出,前面的任何指令都不能移动到分支延迟槽中,因此编译器别无选择,只能用
nop
指令填充延迟槽

下面是一个使用分支延迟槽的示例(使用-O或更高版本编译时):

mipsel linux uclibc objdump输出:

Disassembly of section .text:

00000000 <add_one>:
   0:   03e00008        jr      ra
   4:   24820001        addiu   v0,a0,1
        ...
节的反汇编。文本:
00000000 :
0:03e00008 jr ra
4:2482001 addiu v0,a0,1
...

您使用的是什么gcc优化选项?

带有标志
-fno delayed branch
的您正在禁用延迟插槽优化。只需使用
-fdelayed branch
即可启用它

您可以向gcc中添加标志-Q--help=optimizer,以获取关于使用特定参数组合启用哪些优化的信息


编辑:-Q--help=优化器的输出可能会显示您希望gcc启用的选项。但是,gcc可以使用不同的配置/标志。

看起来一切都已优化。没有bne指令。@RichardPennington,我只是修改了问题中的C代码和MIPS代码。旁边确实有ben指令和nop指令。我该怎么办?我终于用-O2选项解决了这个问题。无论如何,谢谢!
int add_one(int i) {
  return i+1;
}
Disassembly of section .text:

00000000 <add_one>:
   0:   03e00008        jr      ra
   4:   24820001        addiu   v0,a0,1
        ...