我有兴趣知道什么是MIPS代码,GCC或LLVM的“最佳”免费/ OSS编译器,还是有什么比那些更好?
我有兴趣了解有关快速和内存受限生成的汇编代码的更多信息,而不是代码大小。
换句话说,llvm-opt是否比gcc -O3更好地完成工作?
答案 0 :(得分:2)
http://www.phoronix.com/scan.php?page=news_item&px=OTI1MA “LLVM 2.9 Release Candidate 2就在这里
Michael Larabel于2011年3月25日发表 由于缺少硬件而没有LLVM ARM基准......“
也许有一个拥有快速双/四臂皮质和LLVM ARM等的人可以在星期一之前运行http://openbenchmarking.org/替补,迈克尔可以将这些添加到他的其他结果
答案 1 :(得分:1)
我不知道mips,我试过ARM和llvm代码比当前的gcc慢大约10-20%。有问题的测试是基于zlib的。一个解压缩本身和一个压缩然后解压缩。同时使用了clang和llvm-gcc。我更喜欢clang,因为-m32实际上可以在64位主机上运行。对于有问题的测试,我发现不使用-O2(或-O3)产生最快的代码。将字节码模块链接到一个大模块,并使用标准优化执行一个选项,以获得最快的代码。有限责任公司默认为-O2,这确实有助于提升绩效。
编辑:
mcc与llvm / clang之间的有趣测试。
void dummy ( unsigned int );
void dowait ( void )
{
unsigned int ra;
for(ra=0x80000;ra;ra--) dummy(ra);
}
gcc制作:
9d006034 <dowait>:
9d006034: 27bdffe8 addiu sp,sp,-24
9d006038: afb00010 sw s0,16(sp)
9d00603c: afbf0014 sw ra,20(sp)
9d006040: 3c100008 lui s0,0x8
9d006044: 02002021 move a0,s0
9d006048: 0f40180a jal 9d006028 <dummy>
9d00604c: 2610ffff addiu s0,s0,-1
9d006050: 1600fffd bnez s0,9d006048 <dowait+0x14>
9d006054: 02002021 move a0,s0
9d006058: 8fbf0014 lw ra,20(sp)
9d00605c: 8fb00010 lw s0,16(sp)
9d006060: 03e00008 jr ra
9d006064: 27bd0018 addiu sp,sp,24
组装后的llvm
9d006034 <dowait>:
9d006034: 27bdffe8 addiu sp,sp,-24
9d006038: afbf0014 sw ra,20(sp)
9d00603c: afb00010 sw s0,16(sp)
9d006040: 3c020008 lui v0,0x8
9d006044: 34440000 ori a0,v0,0x0
9d006048: 2490ffff addiu s0,a0,-1
9d00604c: 0f40180a jal 9d006028 <dummy>
9d006050: 00000000 nop
9d006054: 00102021 addu a0,zero,s0
9d006058: 1600fffb bnez s0,9d006048 <dowait+0x14>
9d00605c: 00000000 nop
9d006060: 8fb00010 lw s0,16(sp)
9d006064: 8fbf0014 lw ra,20(sp)
9d006068: 27bd0018 addiu sp,sp,24
9d00606c: 03e00008 jr ra
9d006070: 00000000 nop
我说装配后因为我看到了gnu-就像这样的事情
.globl PUT32
PUT32:
sw $a1,0($a0)
jr $ra
nop
并为我重新安排组装:
9d00601c <PUT32>:
9d00601c: 03e00008 jr ra
9d006020: ac850000 sw a1,0(a0)
9d006024: 00000000 nop
llvm和gcc生成的代码之间的区别在于放置在分支延迟槽中的指令。我使用clang和llc来生成程序集输出,然后使用binutils,gnu as来创建二进制文件。因此,对于我手工编写的代码来说,这是一种好奇心:
ori $sp,$sp,0x2000
jal notmain
nop
它为我优化:
9d006004: 0f401820 jal 9d006080 <notmain>
9d006008: 37bd2000 ori sp,sp,0x2000
9d00600c: 00000000 nop
但是生成的代码
addiu $16, $4, -1
jal dummy
nop
不是
9d006048: 2490ffff addiu s0,a0,-1
9d00604c: 0f40180a jal 9d006028 <dummy>
9d006050: 00000000 nop
答案 2 :(得分:-1)
在x86上,LLVM通常比GCC更好,但我没有找到MIPS的任何基准。因为你问这个问题,我假设你有权访问MIPS机器,所以为什么不用GCC和LLVM编译Computer Language Benchmarks Game C code,看看哪个更快。我猜GCC会是,因为MIPS后端相对较新,但代码更清晰,我希望LLVM最终获胜。