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

```asm
<lpf_int>:
  endbr64
  push   %r15
  lea    D14(%rip),%rsi
  push   %r14
  push   %r13
  push   %r12
  push   %rbp
  push   %rbx
  sub    $0x58,%rsp
  movsd  %xmm0,0x48(%rsp)
  lea    0x38(%rsp),%r14
  movsd  %xmm6,0x28(%rsp)
  movsd  %xmm1,0x18(%rsp)
  movsd  %xmm2,(%rsp)
  movsd  %xmm3,0x40(%rsp)
  movsd  %xmm4,0x38(%rsp)
  movsd  %xmm5,0x30(%rsp)
  call   <fopen@plt>
  movsd  0x48(%rsp),%xmm0
  pxor   %xmm6,%xmm6
  mov    %rax,%r12
  comisd %xmm6,%xmm0
  jbe    L5
  movsd  (%rsp),%xmm1
  mulsd  D87(%rip),%xmm1
  mov    %r14,%rdi
  movsd  0x40(%rsp),%xmm0
  call   <advance_vel@plt>
  movsd  0x48(%rsp),%xmm0
L5:
  pxor   %xmm6,%xmm6
  lea    0x28(%rsp),%r13
  comisd %xmm6,%xmm0
  jbe    L32
  movsd  (%rsp),%xmm1
  mulsd  D87(%rip),%xmm1
  mov    %r13,%rdi
  movsd  0x30(%rsp),%xmm0
  call   <advance_vel@plt>
L32:
  movsd  0x40(%rsp),%xmm3
  movsd  0x30(%rsp),%xmm4
  lea    D37(%rip),%rbx
  lea    0x48(%rsp),%rbp
  movsd  0x38(%rsp),%xmm0
  movsd  0x28(%rsp),%xmm2
  lea    0x40(%rsp),%r15
  movapd %xmm3,%xmm1
  addsd  %xmm3,%xmm1
  movsd  %xmm0,0x10(%rsp)
  movsd  %xmm2,0x8(%rsp)
  mulsd  %xmm3,%xmm1
  movapd %xmm4,%xmm3
  addsd  %xmm4,%xmm3
  addsd  D72(%rip),%xmm1
  mulsd  %xmm4,%xmm3
  addsd  %xmm3,%xmm1
  cvttsd2si %xmm1,%edi
  call   <sqrt@plt>
  movsd  0x10(%rsp),%xmm0
  mov    %rbx,%rdi
  movsd  0x8(%rsp),%xmm2
  mov    %eax,%r8d
  mov    $0xffffffff,%eax
  movsd  0x28(%rsp),%xmm4
  movsd  0x30(%rsp),%xmm3
  mulsd  %xmm0,%xmm0
  cltd
  movsd  0x40(%rsp),%xmm1
  idiv   %r8d
  mulsd  %xmm2,%xmm2
  movapd %xmm0,%xmm5
  pxor   %xmm0,%xmm0
  addsd  %xmm2,%xmm5
  mulsd  D30(%rip),%xmm5
  movsd  0x38(%rsp),%xmm2
  cvtsi2sd %eax,%xmm0
  addsd  %xmm0,%xmm5
  movsd  0x48(%rsp),%xmm0
  movsd  %xmm5,0x8(%rsp)
  call   <printf@plt>
  movsd  0x8(%rsp),%xmm5
  mov    %rbx,%rsi
  movsd  0x28(%rsp),%xmm4
  movsd  0x30(%rsp),%xmm3
  movsd  0x38(%rsp),%xmm2
  mov    %r12,%rdi
  movsd  0x40(%rsp),%xmm1
  movsd  0x48(%rsp),%xmm0
  call   <fprintf@plt>
  movsd  D30(%rip),%xmm1
  mulsd  (%rsp),%xmm1
  mov    %r14,%rdi
  movsd  0x40(%rsp),%xmm0
  movsd  %xmm1,0x8(%rsp)
  call   <advance_vel@plt>
  movsd  0x8(%rsp),%xmm1
  movsd  0x30(%rsp),%xmm0
  mov    %r13,%rdi
  call   <advance_vel@plt>
  movsd  0x18(%rsp),%xmm6
  lea    0x30(%rsp),%rax
  comisd 0x48(%rsp),%xmm6
  mov    %rax,0x20(%rsp)
  jbe    L9
  nopl   0x0(%rax)
L38:
  movsd  (%rsp),%xmm0
  mov    %rbp,%rdx
  mov    %r14,%rsi
  mov    %r15,%rdi
  call   <leapfrog@plt>
  movsd  (%rsp),%xmm0
  mov    %r13,%rsi
  mov    %rbp,%rdx
  mov    0x20(%rsp),%rdi
  call   <leapfrog@plt>
  movsd  0x40(%rsp),%xmm2
  movsd  0x30(%rsp),%xmm3
  movsd  0x38(%rsp),%xmm5
  movsd  0x28(%rsp),%xmm1
  movapd %xmm2,%xmm0
  addsd  %xmm2,%xmm0
  movsd  %xmm5,0x10(%rsp)
  movsd  %xmm1,0x8(%rsp)
  mulsd  %xmm2,%xmm0
  movapd %xmm3,%xmm2
  addsd  %xmm3,%xmm2
  addsd  D72(%rip),%xmm0
  mulsd  %xmm3,%xmm2
  addsd  %xmm2,%xmm0
  cvttsd2si %xmm0,%edi
  call   <sqrt@plt>
  movsd  0x8(%rsp),%xmm1
  pxor   %xmm0,%xmm0
  movsd  0x10(%rsp),%xmm5
  mov    %eax,%r8d
  mov    $0xffffffff,%eax
  mov    %rbx,%rdi
  movsd  0x28(%rsp),%xmm4
  cltd
  movsd  0x30(%rsp),%xmm3
  movsd  0x38(%rsp),%xmm2
  idiv   %r8d
  mulsd  %xmm1,%xmm1
  mulsd  %xmm5,%xmm5
  addsd  %xmm1,%xmm5
  mulsd  D30(%rip),%xmm5
  movsd  0x40(%rsp),%xmm1
  cvtsi2sd %eax,%xmm0
  addsd  %xmm0,%xmm5
  movsd  0x48(%rsp),%xmm0
  movsd  %xmm5,0x8(%rsp)
  call   <printf@plt>
  movsd  0x8(%rsp),%xmm5
  mov    %rbx,%rsi
  movsd  0x28(%rsp),%xmm4
  movsd  0x30(%rsp),%xmm3
  movsd  0x38(%rsp),%xmm2
  mov    %r12,%rdi
  movsd  0x40(%rsp),%xmm1
  movsd  0x48(%rsp),%xmm0
  call   <fprintf@plt>
  movsd  0x18(%rsp),%xmm7
  comisd 0x48(%rsp),%xmm7
  ja     L38
L9:
  add    $0x58,%rsp
  pop    %rbx
  pop    %rbp
  pop    %r12
  pop    %r13
  pop    %r14
  pop    %r15
  ret
```

tool_calls: name: disassemble_data
arguments: data_tag: D14
type_guessed: string
name: disassemble_data
arguments: data_tag: D87
type_guessed: byte[8]
name: disassemble_data
arguments: data_tag: D37
type_guessed: string
name: disassemble_data
arguments: data_tag: D72
type_guessed: byte[8]
name: disassemble_data
arguments: data_tag: D30
type_guessed: f64

tool: D14: w

tool: {"D87": [0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0xbf]}

tool: D37: %f	%e	%e	%e	%e	%e


tool: {"D72": [0x00,0x00,0x00,0x00,0x00,0x00,0xf0,0x3f]}

tool: D30: 0.5

assistant: ```c
void lpf_int(char *fout, double t, double tmax, double step, double x, double zx, double v, double zv) {
  int i;
  double E;
  FILE *file;
  file = fopen(fout, "w");
  if (t > 0)
    advance_vel(x, &zx, -0.5 * step);
  if (t > 0)
    advance_vel(v, &zv, -0.5 * step);
  E = (zx * zx + zv * zv) / 2.0 + (-1) / (sqrt(1 + 2 * x * x + 2 * v * v));
  printf("%f\t%e\t%e\t%e\t%e\t%e\n", t, x, zx, v, zv, E);
  fprintf(file, "%f\t%e\t%e\t%e\t%e\t%e\n", t, x, zx, v, zv, E);
  advance_vel(x, &zx, 0.5 * step);
  advance_vel(v, &zv, 0.5 * step);
  while (t < tmax) {
    leapfrog(&x, &zx, &t, step);
    leapfrog(&v, &zv, &t, step);
    E = (zx * zx + zv * zv) / 2.0 + (-1) / (sqrt(1 + 2 * x * x + 2 * v * v));
    printf("%f\t%e\t%e\t%e\t%e\t%e\n", t, x, zx, v, zv, E);
    fprintf(file, "%f\t%e\t%e\t%e\t%e\t%e\n", t, x, zx, v, zv, E);
  }
}
```