我想知道适用于MIPS代码的“最好”的免费/OSS编译器是GCC还是LLVM,或者有比它们更好的选择吗?
我对生成的汇编代码快速和内存限制的性能比代码大小更感兴趣。
换句话说,llvm-opt是否比gcc -O3更好地完成了这项工作?
我想知道适用于MIPS代码的“最好”的免费/OSS编译器是GCC还是LLVM,或者有比它们更好的选择吗?
我对生成的汇编代码快速和内存限制的性能比代码大小更感兴趣。
换句话说,llvm-opt是否比gcc -O3更好地完成了这项工作?
LLVM 2.9 Release Candidate 2已发布
Michael Larabel在2011年3月25日发布,由于缺乏硬件,没有LLVM ARM基准测试...
也许有人可以使用快速的双核/四核arm cortex和LLVM ARM等运行http://openbenchmarking.org/测试,然后Michael可以将这些结果添加到他的其他结果中。
我不了解MIPS,我尝试了ARM和LLVM代码比当前的GCC慢10-20%。所涉及的测试基于zlib。单独进行解压缩和压缩再解压缩。使用了clang和llvm-gcc。我更喜欢clang,因为-m32在64位主机上实际起作用。对于所涉及的测试,我发现不使用-O2(或-O3)可以产生最快的代码。将字节码模块链接成一个大模块,并执行一次标准优化的opt,以获得最快的代码。llc默认为-O2,这确实有助于性能。
编辑:
针对MIPS的GCC和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-as做过这样的事情
.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
但是llc生成的代码
addiu $16, $4, -1
jal dummy
nop
不是
9d006048: 2490ffff addiu s0,a0,-1
9d00604c: 0f40180a jal 9d006028 <dummy>
9d006050: 00000000 nop
在x86上,LLVM通常比GCC更好,但我还没有找到关于MIPS的任何基准。因为您正在问这个问题,所以我假设您可以访问MIPS机器,那么为什么不使用GCC和LLVM编译计算机语言基准游戏C代码并查看哪个更快呢? 我猜测GCC会更快,因为MIPS后端相对较新,但代码要干净得多,我期望LLVM最终会胜出。