codepad
[
create a new paste
]
login
|
about
Language:
C
C++
D
Haskell
Lua
OCaml
PHP
Perl
Plain Text
Python
Ruby
Scheme
Tcl
// this is a classic recursive function, it's not strictly // tail-recursive, but it's close enough long fact(long x) { if (x <= 0) return 1; else return x * fact(x - 1); } /* Args used to compile with gcc and llvm-gcc: -Wall -O3 -fomit-frame-pointer -msse3 -march=native -S On Windows gcc: version 4.3.3-dw2-tdm-1 (GCC) llvm-gcc: gcc version 4.2.1 (Based on Apple Inc. build 5636) (LLVM build) ---------------------------------- GCC: _fact: movl 4(%esp), %edx movl $1, %eax testl %edx, %edx jg L4 jmp L3 .p2align 4,,10 L7: movl %ecx, %edx L4: leal -1(%edx), %ecx imull %edx, %eax testl %ecx, %ecx jg L7 L3: rep ret ---------------------------------- LLVM-GCC: _fact: pushl %edi pushl %esi subl $4, %esp movl 16(%esp), %esi testl %esi, %esi jle LBB1_5 # bb2 LBB1_1: # bb1 leal -1(%esi), %edi testl %edi, %edi jle LBB1_6 # bb1.fact.exit_crit_edge LBB1_2: # bb1.i leal -2(%esi), %eax movl %eax, (%esp) call _fact ; see here imull %edi, %eax LBB1_3: # fact.exit imull %esi, %eax LBB1_4: # fact.exit addl $4, %esp popl %esi popl %edi ret LBB1_5: # bb2 movl $1, %eax jmp LBB1_4 # fact.exit LBB1_6: # bb1.fact.exit_crit_edge movl $1, %eax jmp LBB1_3 # fact.exit */
Private
[
?
]
Run code
Submit