.file "fibs2.c" .text .p2align 4 .globl fib1 .def fib1; .scl 2; .type 32; .endef .seh_proc fib1 fib1: pushq %r15 .seh_pushreg %r15 pushq %r14 .seh_pushreg %r14 pushq %r13 .seh_pushreg %r13 pushq %r12 .seh_pushreg %r12 pushq %rbp .seh_pushreg %rbp pushq %rdi .seh_pushreg %rdi pushq %rsi .seh_pushreg %rsi pushq %rbx .seh_pushreg %rbx subq $120, %rsp .seh_stackalloc 120 .seh_endprologue movl $1, %r13d cmpl $2, %ecx jle .L1 leal -2(%rcx), %eax movl %ecx, %r14d xorl %r13d, %r13d movl %ecx, %ebx andl $-2, %eax subl %eax, %r14d .L5: leal -1(%rbx), %ebp cmpl %r14d, %ebx je .L54 .L3: leal -3(%rbx), %eax movl %ebp, %r15d movl %r13d, 72(%rsp) xorl %r12d, %r12d andl $-2, %eax movl %ebx, %r13d movl %ebp, %ebx subl %eax, %r15d .L8: leal -1(%rbx), %esi cmpl %ebx, %r15d je .L55 .L6: leal -3(%rbx), %edx movl %esi, %eax movl %ebx, 76(%rsp) xorl %edi, %edi andl $-2, %edx subl %edx, %eax movl %eax, 88(%rsp) .L11: leal -1(%rsi), %ebx cmpl %esi, 88(%rsp) je .L56 leal -3(%rsi), %edx movl %ebx, %eax movl %r12d, 80(%rsp) xorl %ebp, %ebp andl $-2, %edx movl %r15d, 84(%rsp) movl %r13d, %r12d movl %r14d, %r15d subl %edx, %eax movl %esi, %edx movl %eax, 92(%rsp) .L14: leal -1(%rbx), %esi cmpl %ebx, 92(%rsp) je .L57 leal -3(%rbx), %r9d movl %esi, %r14d movl %edx, %r11d movl %ebp, %r8d andl $-2, %r9d xorl %r13d, %r13d movl %edi, %r10d movl %r15d, %edx subl %r9d, %r14d movl %r12d, %ebp movl %ebx, %r9d .L17: leal -1(%rsi), %ebx cmpl %r14d, %esi je .L58 leal -3(%rsi), %eax movl %ebx, %r15d movl %r8d, %r12d xorl %edi, %edi andl $-2, %eax movl %edx, %ecx subl %eax, %r15d movl %r15d, %r8d movl %r11d, %r15d .L20: leal -1(%rbx), %edx cmpl %r8d, %ebx je .L59 leal -4(%rbx), %eax movl %edx, %r11d movl $0, 36(%rsp) movl %eax, 44(%rsp) leal -3(%rbx), %eax andl $-2, %eax movl %ecx, 40(%rsp) subl %eax, %r11d movl %r11d, 68(%rsp) movl %r10d, %r11d movl %edx, %r10d .L23: movl 68(%rsp), %eax leal -1(%r10), %edx cmpl %eax, %r10d je .L60 movl 44(%rsp), %eax movl %edx, %ecx movl %r10d, 60(%rsp) movl 40(%rsp), %r10d movl %r11d, 52(%rsp) movl %ebp, %r11d movl %ebx, %ebp andl $-2, %eax movl %r9d, 56(%rsp) movl %r14d, %r9d movl %edi, %r14d subl %eax, %ecx xorl %eax, %eax movl %r8d, 64(%rsp) movl %esi, %edi movl %ecx, 48(%rsp) movl %eax, %r8d .L26: movl 48(%rsp), %eax cmpl %eax, %edx je .L61 leal -2(%rdx), %esi andl $1, %edx xorl %ebx, %ebx movl %edx, 40(%rsp) movl %esi, %ecx .L28: movl %r11d, 192(%rsp) movl %r10d, 108(%rsp) movl %r9d, 104(%rsp) movl %r8d, 100(%rsp) movl %ecx, 96(%rsp) call fib1 movl 96(%rsp), %ecx movl 100(%rsp), %r8d addl %eax, %ebx movl 40(%rsp), %eax movl 104(%rsp), %r9d subl $2, %ecx movl 108(%rsp), %r10d movl 192(%rsp), %r11d cmpl %eax, %ecx jne .L28 movl %esi, %edx leal 1(%r8,%rbx), %r8d cmpl $2, %esi jne .L26 movl %r10d, 40(%rsp) movl %edi, %esi movl %ebp, %ebx movl %r14d, %edi movl %r8d, %eax movl %r9d, %r14d movl %r11d, %ebp movl 56(%rsp), %r9d movl 64(%rsp), %r8d movl 60(%rsp), %r10d movl 52(%rsp), %r11d .L25: movl 36(%rsp), %ecx subl $2, %r10d subl $2, 44(%rsp) leal 1(%rcx,%rax), %eax movl %eax, 36(%rsp) cmpl $2, %r10d jne .L23 movl 40(%rsp), %ecx movl %r11d, %r10d .L22: movl 36(%rsp), %eax subl $2, %ebx leal 1(%rdi,%rax), %edi cmpl $2, %ebx jne .L20 movl %r15d, %r11d movl %r12d, %r8d movl %ecx, %edx .L19: subl $2, %esi leal 1(%r13,%rdi), %r13d cmpl $2, %esi jne .L17 movl %edx, %r15d movl %ebp, %r12d movl %r10d, %edi movl %r9d, %ebx movl %r11d, %edx movl %r8d, %ebp .L16: subl $2, %ebx leal 1(%rbp,%r13), %ebp cmpl $2, %ebx jne .L14 movl %r15d, %r14d movl %r12d, %r13d movl 84(%rsp), %r15d movl 80(%rsp), %r12d movl %edx, %esi .L13: subl $2, %esi leal 1(%rdi,%rbp), %edi cmpl $2, %esi jne .L11 movl 76(%rsp), %ebx leal 1(%r12,%rdi), %r12d subl $2, %ebx cmpl $2, %ebx jne .L8 .L62: movl %r13d, %ebx movl 72(%rsp), %r13d subl $2, %ebx leal 1(%r13,%r12), %r13d cmpl $2, %ebx jne .L5 .L63: addl $1, %r13d jmp .L1 .p2align 4,,10 .p2align 3 .L59: movl %r15d, %r11d movl %r12d, %r8d movl %ecx, %edx addl $1, %edi jmp .L19 .p2align 4,,10 .p2align 3 .L60: addl $1, 36(%rsp) movl 40(%rsp), %ecx movl %r11d, %r10d jmp .L22 .p2align 4,,10 .p2align 3 .L61: movl %r8d, %eax movl %r10d, 40(%rsp) movl %edi, %esi movl %ebp, %ebx movl %r14d, %edi movl %r11d, %ebp movl %r9d, %r14d movl 64(%rsp), %r8d movl 56(%rsp), %r9d movl 60(%rsp), %r10d addl $1, %eax movl 52(%rsp), %r11d jmp .L25 .L58: movl %edx, %r15d movl %ebp, %r12d movl %r10d, %edi movl %r9d, %ebx movl %r11d, %edx movl %r8d, %ebp addl $1, %r13d jmp .L16 .L57: movl %r15d, %r14d movl %r12d, %r13d movl 84(%rsp), %r15d movl 80(%rsp), %r12d movl %edx, %esi addl $1, %ebp jmp .L13 .L56: movl 76(%rsp), %ebx addl $1, %edi leal 1(%r12,%rdi), %r12d subl $2, %ebx cmpl $2, %ebx je .L62 leal -1(%rbx), %esi cmpl %ebx, %r15d jne .L6 .L55: movl %r13d, %ebx movl 72(%rsp), %r13d addl $1, %r12d subl $2, %ebx leal 1(%r13,%r12), %r13d cmpl $2, %ebx je .L63 leal -1(%rbx), %ebp cmpl %r14d, %ebx jne .L3 .L54: addl $2, %r13d .L1: movl %r13d, %eax addq $120, %rsp popq %rbx popq %rsi popq %rdi popq %rbp popq %r12 popq %r13 popq %r14 popq %r15 ret .seh_endproc .p2align 4 .globl fib2 .def fib2; .scl 2; .type 32; .endef .seh_proc fib2 fib2: .seh_endprologue movl $1, %edx movl $1, %eax movl $1, %r8d cmpl $2, %ecx jg .L65 jmp .L64 .p2align 4,,10 .p2align 3 .L72: movl %r8d, %eax .L65: subl $1, %ecx leal (%rax,%rdx), %r8d movl %eax, %edx cmpl $2, %ecx jne .L72 .L64: movl %r8d, %eax ret .seh_endproc .p2align 4 .globl fib3 .def fib3; .scl 2; .type 32; .endef .seh_proc fib3 fib3: .seh_endprologue cmpl $2, %ecx jle .L76 movl $1, %eax movl $1, %edx jmp .L75 .p2align 4,,10 .p2align 3 .L77: movl %r8d, %eax .L75: subl $1, %ecx leal (%rdx,%rax), %r8d movl %eax, %edx cmpl $2, %ecx jne .L77 movl %r8d, %eax ret .p2align 4,,10 .p2align 3 .L76: movl $1, %r8d movl %r8d, %eax ret .seh_endproc .def __main; .scl 2; .type 32; .endef .section .rdata,"dr" .align 8 .LC0: .ascii "the %dth Fibonacci number is %d\12\0" .align 8 .LC1: .ascii "with tail recursion it's also %d\12\0" .align 8 .LC2: .ascii "without recursion it's still %d\12\0" .section .text.startup,"x" .p2align 4 .globl main .def main; .scl 2; .type 32; .endef .seh_proc main main: pushq %rbx .seh_pushreg %rbx subq $32, %rsp .seh_stackalloc 32 .seh_endprologue movq %rdx, %rbx call __main movq 8(%rbx), %rcx call atoi movl %eax, %ecx movl %eax, %ebx call fib1 movl %ebx, %edx leaq .LC0(%rip), %rcx movl %eax, %r8d call printf movl %ebx, %eax movl $1, %ecx movl $1, %edx cmpl $2, %ebx jle .L86 .p2align 4,,10 .p2align 3 .L79: leal (%rdx,%rcx), %r8d subl $1, %eax movl %edx, %ecx movl %r8d, %edx cmpl $2, %eax jne .L79 leaq .LC1(%rip), %rcx call printf movl $1, %edx movl $1, %eax jmp .L81 .p2align 4,,10 .p2align 3 .L84: movl %ecx, %eax .L81: subl $1, %ebx leal (%rax,%rdx), %ecx movl %eax, %edx cmpl $2, %ebx jne .L84 .L80: movl %ecx, %edx leaq .LC2(%rip), %rcx call printf xorl %eax, %eax addq $32, %rsp popq %rbx ret .L86: leaq .LC1(%rip), %rcx call printf movl $1, %ecx jmp .L80 .seh_endproc .ident "GCC: (GNU) 13.4.0" .def atoi; .scl 2; .type 32; .endef .def printf; .scl 2; .type 32; .endef