Я не знаю о mips, я пробовал ARM, и код llvm был примерно на 10-20% медленнее, чем текущий gcc. Тесты, о которых идет речь, были основаны на zlib. декомпрессия сама по себе и компрессия затем декомпрессия. использовал оба clang и llvm-gcc. Я предпочел clang, потому что на самом деле -m32 работает на 64-битном хосте. Для данного теста я обнаружил, что НЕ использование -O2 (или -O3) дает самый быстрый код. связал модули байт-кода в один большой модуль и выполнил один выбор со стандартными оптимизациями, чтобы получить самый быстрый код. по умолчанию было -O2, и это помогало производительности.
EDIT:
Интересный тест между gcc и llvm / clang для mips.
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
но код, сгенерированный ООО
addiu $16, $4, -1
jal dummy
nop
не было
9d006048: 2490ffff addiu s0,a0,-1
9d00604c: 0f40180a jal 9d006028 <dummy>
9d006050: 00000000 nop