user: Converte this assembly snippet into its equivalent C code:

```asm
<Eval>:
  endbr64
  push   %r15
  push   %r14
  push   %r13
  push   %r12
  push   %rbp
  push   %rbx
  sub    $0x68,%rsp
  movsd  D0(%rip),%xmm0
  mov    %edi,0x5c(%rsp)
  test   %edi,%edi
  je     L160
  jle    L58
  cmp    $0x1,%edi
  je     L60
  movl   $0x1,0x58(%rsp)
  movq   %xmm0,%r12
  movsd  %xmm0,0x50(%rsp)
L94:
  cmpl   $0x1,0x58(%rsp)
  movl   $0x1,0x44(%rsp)
  mov    %r12,0x48(%rsp)
  je     L136
L36:
  cmpl   $0x1,0x44(%rsp)
  movl   $0x1,0x40(%rsp)
  mov    %r12,0x38(%rsp)
  je     L99
L110:
  cmpl   $0x1,0x40(%rsp)
  movl   $0x1,0x2c(%rsp)
  mov    %r12,0x30(%rsp)
  je     L174
L208:
  cmpl   $0x1,0x2c(%rsp)
  mov    %r12,0x20(%rsp)
  mov    $0x1,%r13d
  je     L183
L90:
  mov    %r12,0x18(%rsp)
  mov    $0x1,%ebp
  cmp    $0x1,%r13d
  je     L66
L116:
  mov    %r12,0x10(%rsp)
  mov    $0x1,%ebx
  cmp    $0x1,%ebp
  je     L129
L144:
  mov    %r12,0x8(%rsp)
  mov    $0x1,%r15d
  cmp    $0x1,%ebx
  je     L203
L63:
  pxor   %xmm1,%xmm1
  xor    %r14d,%r14d
L14:
  mov    %r14d,%edi
  movsd  %xmm1,(%rsp)
  add    $0x1,%r14d
  call   <Eval>
  movsd  (%rsp),%xmm1
  addsd  %xmm0,%xmm1
  cmp    %r15d,%r14d
  jne    L14
  pxor   %xmm0,%xmm0
  addsd  %xmm1,%xmm1
  cvtsi2sd %r15d,%xmm0
  add    $0x1,%r15d
  divsd  %xmm0,%xmm1
  addsd  %xmm0,%xmm1
  addsd  0x8(%rsp),%xmm1
  movsd  %xmm1,0x8(%rsp)
  cmp    %ebx,%r15d
  jne    L63
L203:
  movsd  0x8(%rsp),%xmm0
  pxor   %xmm1,%xmm1
  cvtsi2sd %ebx,%xmm1
  add    $0x1,%ebx
  addsd  %xmm0,%xmm0
  divsd  %xmm1,%xmm0
  addsd  %xmm1,%xmm0
  addsd  0x10(%rsp),%xmm0
  movsd  %xmm0,0x10(%rsp)
  cmp    %ebp,%ebx
  jne    L144
L129:
  movsd  0x10(%rsp),%xmm0
  pxor   %xmm1,%xmm1
  cvtsi2sd %ebp,%xmm1
  add    $0x1,%ebp
  addsd  %xmm0,%xmm0
  divsd  %xmm1,%xmm0
  addsd  %xmm1,%xmm0
  addsd  0x18(%rsp),%xmm0
  movsd  %xmm0,0x18(%rsp)
  cmp    %r13d,%ebp
  jne    L116
L66:
  movsd  0x18(%rsp),%xmm0
  pxor   %xmm1,%xmm1
  cvtsi2sd %r13d,%xmm1
  add    $0x1,%r13d
  addsd  %xmm0,%xmm0
  divsd  %xmm1,%xmm0
  addsd  %xmm1,%xmm0
  addsd  0x20(%rsp),%xmm0
  movsd  %xmm0,0x20(%rsp)
  cmp    0x2c(%rsp),%r13d
  jne    L90
L183:
  mov    0x2c(%rsp),%eax
  movsd  0x20(%rsp),%xmm0
  pxor   %xmm1,%xmm1
  cvtsi2sd %eax,%xmm1
  addsd  %xmm0,%xmm0
  add    $0x1,%eax
  mov    %eax,0x2c(%rsp)
  divsd  %xmm1,%xmm0
  addsd  %xmm1,%xmm0
  addsd  0x30(%rsp),%xmm0
  movsd  %xmm0,0x30(%rsp)
  cmp    0x40(%rsp),%eax
  jne    L208
L174:
  mov    0x40(%rsp),%eax
  movsd  0x30(%rsp),%xmm0
  pxor   %xmm1,%xmm1
  cvtsi2sd %eax,%xmm1
  addsd  %xmm0,%xmm0
  add    $0x1,%eax
  mov    %eax,0x40(%rsp)
  divsd  %xmm1,%xmm0
  addsd  %xmm1,%xmm0
  addsd  0x38(%rsp),%xmm0
  movsd  %xmm0,0x38(%rsp)
  cmp    0x44(%rsp),%eax
  jne    L110
L99:
  mov    0x44(%rsp),%eax
  movsd  0x38(%rsp),%xmm0
  pxor   %xmm1,%xmm1
  cvtsi2sd %eax,%xmm1
  addsd  %xmm0,%xmm0
  add    $0x1,%eax
  mov    %eax,0x44(%rsp)
  divsd  %xmm1,%xmm0
  addsd  %xmm1,%xmm0
  addsd  0x48(%rsp),%xmm0
  movsd  %xmm0,0x48(%rsp)
  cmp    0x58(%rsp),%eax
  jne    L36
L136:
  mov    0x58(%rsp),%eax
  movsd  0x48(%rsp),%xmm0
  pxor   %xmm1,%xmm1
  cvtsi2sd %eax,%xmm1
  addsd  %xmm0,%xmm0
  add    $0x1,%eax
  mov    %eax,0x58(%rsp)
  divsd  %xmm1,%xmm0
  addsd  %xmm1,%xmm0
  addsd  0x50(%rsp),%xmm0
  movsd  %xmm0,0x50(%rsp)
  cmp    %eax,0x5c(%rsp)
  jne    L94
L71:
  addsd  %xmm0,%xmm0
L98:
  pxor   %xmm1,%xmm1
  cvtsi2sdl 0x5c(%rsp),%xmm1
  divsd  %xmm1,%xmm0
  addsd  %xmm1,%xmm0
L160:
  add    $0x68,%rsp
  pop    %rbx
  pop    %rbp
  pop    %r12
  pop    %r13
  pop    %r14
  pop    %r15
  ret
L58:
  pxor   %xmm0,%xmm0
  jmp    L98
L60:
  movsd  %xmm0,0x50(%rsp)
  jmp    L71
```

tool_calls: name: extract_symbolic_data
arguments: data_tag: D0
datatype: f64

tool: D0: 1

assistant: ```c
double Eval(int N) {
  int i;
  double Sum;
  if (N == 0)
    return 1.0;
  else {
    Sum = 0.0;
    for (i = 0; i < N; i++)
      Sum += Eval(i);
    return 2.0 * Sum / N + N;
  }
}
```