- 论坛徽章:
- 0
|
1)根据我的实验结果,我不否认同样的代码arm编译出来比mips小
2)源代码太短小体现不了代码密度。比如mips和arm出入栈有差异,在加法运算指令差异不大的情况下,出入栈的差异就占了代码差异很大一部分。如果代码规模大一些,出入栈占的比例就比较小。这样才能体现平均水平。又比如arm没有除法指令,而mips有。arm只能通过一大堆代码来实现除法。如果你例子里的运算是除法,而仅仅用一个运算来评判的话,你会得出mips密度比arm大的结论。
3)mips的delay slot并不是造成浪费的原因。delay slot里可以填充其他指令,只要他不使用前一条指令的结果就ok。你编译的时候由于没有打开优化,所以编译器没有做指令的调度。实际上delay slot在某些情况下可以大大提升速度。比如一个for循环,循环体结束的时候跳回前面。那条跳转指令的delay slot里面可以放一条将循环变量累加的指令。
aaa.c是我修改了你的代码,把加法换成除法
D:\sqlite3>ccarm -O2 -nostdlib aaa.c -Wl,-( -e main -LE:\Tornado2.2ARM\target\l
ib\arm\ARMARCH5\common\ -lgcc -Wl,-) -o arm.elf
D:\sqlite3>ccmips -O2 -nostdlib aaa.c -Wl,-( -e main -LE:\tornado2.2_mips\target
\lib\mips\MIPS32\sfcommon\ -lgcc -Wl,-) -o mips.elf
D:\sqlite3>ccppc -O2 -nostdlib aaa.c -Wl,-( -e main -LE:\tornado_for_ppc\target\
lib\ppc\PPC603\common\ -lgcc -Wl,-) -o ppc.elf
D:\sqlite3>sizearm *.elf
text data bss dec hex filename
268 2 2 272 110 arm.elf 可以看到除法的时候arm使用的空间比mips大
112 0 0 112 70 mips.elf
88 0 0 88 58 ppc.elf- #include <stdio.h>
- #include <stdlib.h>
- int foo(int a, int b)
- {
- return (a / b);
- }
- int dumm(int a, int b ,int c , int d,int e)
- {
- return (a + b + c +d);
- }
- int main(int argc ,char ** argv)
- {
- int c;
- c = foo(1,2);
- c = dumm(1,2,3,4,5);
- return c;
- }
复制代码 |
|