Architecture 从MIPS交叉编译器获取条件分支槽
如何使用mipsel-openwrt-linux-gcc交叉编译器获取条件分支槽,其中来自分支之前或之后的指令被移动以填充槽 我只是使用命令获取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 -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
...