user: Please show me the C implementation that matches the assembly code listed below:

```asm
<fibonacci_rec>:
  endbr64
  push   %r15
  push   %r14
  push   %r13
  push   %r12
  xor    %r12d,%r12d
  push   %rbp
  push   %rbx
  sub    $0x28,%rsp
  test   %edi,%edi
  je     L448
  mov    %edi,%ebx
  mov    $0x1,%r12d
  cmp    $0x1,%edi
  je     L448
  mov    D9(%rip),%rax
  mov    %edi,%r15d
  mov    (%rax),%rbp
  sub    $0x1,%r15d
  je     L371
  cmp    $0x1,%r15d
  je     L251
  mov    %edi,%r14d
  sub    $0x2,%r14d
  je     L257
  cmp    $0x1,%r14d
  je     L63
  lea    -0x3(%rdi),%r8d
  mov    %r8d,%edi
  mov    %r8d,0x8(%rsp)
  call   <fibonacci_rec>
  lea    -0x4(%rbx),%r9d
  mov    %r9d,%edi
  mov    %rax,%r13
  mov    %r9d,0x14(%rsp)
  call   <fibonacci_rec>
  mov    0x8(%rsp),%r8d
  lea    0x0(%r13,%rax,1),%r12
  mov    %rbp,%rax
  cmp    %rbp,%r12
  cmovge %r12,%rax
  cmp    %rax,%r13
  mov    $0xffffffffffffffff,%rax
  cmovg  %rax,%r12
  test   %r8d,%r8d
  je     L63
  cmp    $0x1,%r8d
  mov    0x14(%rsp),%r9d
  jne    L76
  add    $0x1,%r12
  xor    %r9d,%r9d
L18:
  mov    %r8d,%edi
  mov    %r9d,0x8(%rsp)
  call   <fibonacci_rec>
  mov    0x8(%rsp),%edi
  mov    %rax,%r13
  call   <fibonacci_rec>
  mov    %rbp,%rdx
  add    %r13,%rax
  cmp    %rbp,%rax
  cmovge %rax,%rdx
  cmp    %rdx,%r13
  mov    $0xffffffffffffffff,%rdx
  cmovg  %rdx,%rax
  cmp    %rbp,%rax
  jle    L23
L60:
  mov    %r14d,%edi
  call   <fibonacci_rec>
  cmp    %r12,%rax
  jg     L51
L23:
  test   %r14d,%r14d
  je     L251
L430:
  cmp    $0x1,%r14d
  jne    L526
  add    $0x1,%r12
L365:
  mov    $0x1,%r13d
  mov    $0x1,%r14d
L245:
  mov    $0x1,%eax
L190:
  cmp    %rbp,%rax
  jle    L249
  mov    %r14d,%edi
  call   <fibonacci_rec>
  cmp    %r13,%rax
  jg     L237
L249:
  cmp    %rbp,%r13
  jle    L448
  mov    %r14d,%edi
  call   <fibonacci_rec>
  lea    -0x3(%rbx),%edi
  mov    %rax,%r13
  call   <fibonacci_rec>
  mov    $0xffffffffffffffff,%rdx
  add    %r13,%rax
  cmp    %rbp,%rax
  cmovge %rax,%rbp
  cmp    %rbp,%r13
  cmovg  %rdx,%rax
  jmp    L248
  nopl   0x0(%rax)
L257:
  mov    $0xfffffffe,%edi
  call   <fibonacci_rec>
  lea    -0x5(%rbx),%edi
  mov    %rax,%r13
  call   <fibonacci_rec>
  lea    0x0(%r13,%rax,1),%r12
  mov    %rbp,%rax
  cmp    %rbp,%r12
  cmovge %r12,%rax
  cmp    %rax,%r13
  mov    $0xffffffffffffffff,%rax
  cmovg  %rax,%r12
  test   %rbp,%rbp
  js     L60
L251:
  test   %rbp,%rbp
  jle    L509
L448:
  add    $0x28,%rsp
  mov    %r12,%rax
  pop    %rbx
  pop    %rbp
  pop    %r12
  pop    %r13
  pop    %r14
  pop    %r15
  ret
  cs nopw 0x0(%rax,%rax,1)
L371:
  lea    -0x3(%rdi),%r8d
  xor    %r12d,%r12d
  mov    $0xffffffff,%r14d
L288:
  lea    -0x4(%rbx),%r9d
  mov    %r8d,0x18(%rsp)
  mov    %r9d,%edi
  mov    %r9d,0x14(%rsp)
  call   <fibonacci_rec>
  lea    -0x5(%rbx),%r10d
  mov    %r10d,%edi
  mov    %rax,0x8(%rsp)
  mov    %r10d,0x1c(%rsp)
  call   <fibonacci_rec>
  mov    0x8(%rsp),%rdx
  mov    0x14(%rsp),%r9d
  mov    0x18(%rsp),%r8d
  lea    (%rdx,%rax,1),%r13
  mov    %rbp,%rax
  cmp    %rbp,%r13
  cmovge %r13,%rax
  cmp    %rax,%rdx
  mov    $0xffffffffffffffff,%rax
  cmovg  %rax,%r13
  test   %r9d,%r9d
  je     L415
  cmp    $0x1,%r9d
  mov    0x1c(%rsp),%r10d
  jne    L292
  add    $0x1,%r13
  xor    %r10d,%r10d
L529:
  mov    %r9d,%edi
  mov    %r8d,0x18(%rsp)
  mov    %r10d,0x14(%rsp)
  call   <fibonacci_rec>
  mov    0x14(%rsp),%edi
  mov    %rax,0x8(%rsp)
  call   <fibonacci_rec>
  mov    0x8(%rsp),%rdx
  mov    %rbp,%rcx
  mov    0x18(%rsp),%r8d
  add    %rdx,%rax
  cmp    %rbp,%rax
  cmovge %rax,%rcx
  cmp    %rcx,%rdx
  mov    $0xffffffffffffffff,%rdx
  cmovg  %rdx,%rax
  cmp    %rbp,%rax
  jle    L349
L44:
  mov    %r8d,%edi
  mov    %r8d,0x8(%rsp)
  call   <fibonacci_rec>
  mov    0x8(%rsp),%r8d
  cmp    %rax,%r13
  jl     L39
L349:
  add    %r13,%r12
  test   %r15d,%r15d
  jne    L72
  test   %rbp,%rbp
  jns    L448
  xor    %eax,%eax
  jmp    L248
  nopl   0x0(%rax)
L526:
  mov    %ebx,%r8d
  sub    $0x3,%r8d
  jne    L400
  mov    $0xfffffffe,%edi
  call   <fibonacci_rec>
  lea    -0x6(%rbx),%edi
  mov    %rax,0x8(%rsp)
  call   <fibonacci_rec>
  mov    0x8(%rsp),%rdx
  lea    (%rdx,%rax,1),%r13
  mov    %rbp,%rax
  cmp    %rbp,%r13
  cmovge %r13,%rax
  cmp    %rax,%rdx
  mov    $0xffffffffffffffff,%rax
  cmovg  %rax,%r13
L33:
  test   %rbp,%rbp
  js     L465
  add    %r13,%r12
  xor    %r8d,%r8d
L98:
  test   %r14d,%r14d
  je     L131
  cmp    $0x1,%r14d
  je     L365
L451:
  mov    %r8d,%edi
  mov    %r8d,0x8(%rsp)
  call   <fibonacci_rec>
  lea    -0x4(%rbx),%r9d
  mov    %r9d,%edi
  mov    %rax,%r15
  mov    %r9d,0x14(%rsp)
  call   <fibonacci_rec>
  mov    0x8(%rsp),%r8d
  mov    $0xffffffffffffffff,%rdx
  lea    (%r15,%rax,1),%r13
  mov    %rbp,%rax
  cmp    %rbp,%r13
  cmovge %r13,%rax
  cmp    %rax,%r15
  cmovg  %rdx,%r13
  test   %r8d,%r8d
  je     L245
  cmp    $0x1,%r8d
  mov    0x14(%rsp),%r9d
  jne    L176
  add    $0x1,%r13
  xor    %r9d,%r9d
L278:
  mov    %r8d,%edi
  mov    %r9d,0x8(%rsp)
  call   <fibonacci_rec>
  mov    0x8(%rsp),%edi
  mov    %rax,%r15
  call   <fibonacci_rec>
  mov    %rbp,%rdx
  add    %r15,%rax
  cmp    %rbp,%rax
  cmovge %rax,%rdx
  cmp    %rdx,%r15
  mov    $0xffffffffffffffff,%rdx
  cmovg  %rdx,%rax
  jmp    L190
  nopl   0x0(%rax)
L509:
  mov    $0x1,%eax
L248:
  cmp    %r12,%rax
  jle    L448
  mov    $0xffffffffffffffff,%r12
  jmp    L448
  nopw   0x0(%rax,%rax,1)
L465:
  xor    %r8d,%r8d
  jmp    L44
  nopl   0x0(%rax,%rax,1)
L292:
  mov    %r10d,%edi
  mov    %r8d,0x1c(%rsp)
  mov    %r9d,0x18(%rsp)
  mov    %r10d,0x14(%rsp)
  call   <fibonacci_rec>
  lea    -0x6(%rbx),%edi
  mov    %rax,0x8(%rsp)
  call   <fibonacci_rec>
  mov    0x8(%rsp),%rdx
  mov    0x14(%rsp),%r10d
  mov    0x18(%rsp),%r9d
  mov    0x1c(%rsp),%r8d
  add    %rdx,%rax
  cmp    %rax,%rbp
  mov    %rax,%rcx
  cmovge %rbp,%rcx
  cmp    %rdx,%rcx
  jge    L191
  sub    $0x1,%r13
  jmp    L529
  nopw   0x0(%rax,%rax,1)
L76:
  mov    %r9d,%edi
  mov    %r8d,0x14(%rsp)
  mov    %r9d,0x8(%rsp)
  call   <fibonacci_rec>
  lea    -0x5(%rbx),%edi
  mov    %rax,%r13
  call   <fibonacci_rec>
  mov    %rbp,%rdx
  mov    0x8(%rsp),%r9d
  mov    0x14(%rsp),%r8d
  add    %r13,%rax
  cmp    %rbp,%rax
  cmovge %rax,%rdx
  add    %r12,%rax
  sub    $0x1,%r12
  cmp    %r13,%rdx
  cmovge %rax,%r12
  jmp    L18
  nopw   0x0(%rax,%rax,1)
L72:
  cmp    $0x1,%r15d
  jne    L98
  jmp    L251
  nop
L131:
  lea    -0x4(%rbx),%edi
  call   <fibonacci_rec>
  lea    -0x5(%rbx),%edi
  mov    %rax,%r15
  call   <fibonacci_rec>
  mov    %rbp,%rdx
  lea    (%rax,%r15,1),%r13
  cmp    %rbp,%r13
  cmovge %r13,%rdx
  xor    %eax,%eax
  cmp    %r15,%rdx
  mov    $0xffffffffffffffff,%rdx
  cmovl  %rdx,%r13
  jmp    L190
  cs nopw 0x0(%rax,%rax,1)
L63:
  test   %rbp,%rbp
  jg     L430
  jmp    L60
  xchg   %ax,%ax
L400:
  cmp    $0x1,%r8d
  jne    L288
  mov    $0x1,%r13d
L415:
  test   %rbp,%rbp
  jle    L44
  add    %r13,%r12
  jmp    L451
L191:
  add    %rax,%r13
  test   %r8d,%r8d
  je     L33
  cmp    $0x1,%r8d
  jne    L529
  jmp    L415
  nopl   0x0(%rax)
L176:
  mov    %r9d,%edi
  mov    %r8d,0x14(%rsp)
  mov    %r9d,0x8(%rsp)
  call   <fibonacci_rec>
  lea    -0x5(%rbx),%edi
  mov    %rax,%r15
  call   <fibonacci_rec>
  mov    %rbp,%rcx
  mov    $0xffffffffffffffff,%rdx
  add    %r15,%rax
  cmp    %rbp,%rax
  cmovge %rax,%rcx
  cmp    %rcx,%r15
  cmovg  %rdx,%rax
  add    %rax,%r13
  test   %r14d,%r14d
  je     L48
  cmp    $0x1,%r14d
  mov    0x8(%rsp),%r9d
  mov    0x14(%rsp),%r8d
  jne    L278
  jmp    L245
  nopl   0x0(%rax)
L51:
  mov    $0xffffffffffffffff,%r12
  jmp    L23
L237:
  mov    $0xffffffffffffffff,%r13
  jmp    L249
L39:
  mov    $0xffffffffffffffff,%r13
  jmp    L349
L48:
  xor    %eax,%eax
  jmp    L190
```

assistant: ```c
long long fibonacci_rec(int n) {
  if (n == 0)
    return 0;
  else if (n == 1)
    return 1;
  else {
    long long int fibo;
    fibo = (fibonacci_rec(n - 1) + fibonacci_rec(n - 2));
    if (fibonacci_rec(n - 1) > INT_MAX && fibo < fibonacci_rec(n - 1)) {
      return -1;
    } else {
      return fibo;
    }
  }
}
```