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

```asm
<drift_shep>:
  endbr64
  push   %r15
  push   %r14
  movq   %xmm0,%r14
  push   %r13
  push   %r12
  push   %rbp
  mov    %rdi,%rbp
  push   %rbx
  mov    %rsi,%rbx
  sub    $0x38,%rsp
  movsd  %xmm1,0x18(%rsp)
L96:
  movsd  0x18(%rsp),%xmm1
  mov    %rbx,%rsi
  mov    %rbp,%rdi
  movq   %r14,%xmm0
  call   <nkep_drift3@plt>
  cmp    $0xffffffff,%eax
  jne    L56
  movsd  D67(%rip),%xmm5
  mulsd  0x18(%rsp),%xmm5
  movsd  %xmm5,0x18(%rsp)
  movq   %xmm5,%r13
L81:
  movq   %r13,%xmm1
  mov    %rbx,%rsi
  movq   %r14,%xmm0
  mov    %rbp,%rdi
  call   <nkep_drift3@plt>
  cmp    $0xffffffff,%eax
  jne    L96
  movsd  D67(%rip),%xmm6
  movq   %r13,%xmm0
  mulsd  %xmm0,%xmm6
  movq   %xmm6,%r13
  movsd  %xmm6,0x8(%rsp)
L5:
  movsd  0x8(%rsp),%xmm1
  mov    %rbx,%rsi
  mov    %rbp,%rdi
  movq   %r14,%xmm0
  call   <nkep_drift3@plt>
  cmp    $0xffffffff,%eax
  jne    L81
  movsd  D67(%rip),%xmm7
  mulsd  0x8(%rsp),%xmm7
  movsd  %xmm7,0x8(%rsp)
  movsd  %xmm7,0x10(%rsp)
L17:
  movsd  0x10(%rsp),%xmm1
  mov    %rbx,%rsi
  mov    %rbp,%rdi
  movq   %r14,%xmm0
  call   <nkep_drift3@plt>
  cmp    $0xffffffff,%eax
  jne    L5
  movsd  D67(%rip),%xmm5
  mulsd  0x10(%rsp),%xmm5
  movsd  %xmm5,0x10(%rsp)
  movapd %xmm5,%xmm2
L48:
  movapd %xmm2,%xmm1
  mov    %rbx,%rsi
  mov    %rbp,%rdi
  movsd  %xmm2,(%rsp)
  movq   %r14,%xmm0
  call   <nkep_drift3@plt>
  cmp    $0xffffffff,%eax
  jne    L17
  movsd  (%rsp),%xmm2
  mulsd  D67(%rip),%xmm2
  movq   %xmm2,%r15
L32:
  movq   %r15,%xmm1
  mov    %rbx,%rsi
  mov    %rbp,%rdi
  movsd  %xmm2,(%rsp)
  movq   %r14,%xmm0
  call   <nkep_drift3@plt>
  movsd  (%rsp),%xmm2
  cmp    $0xffffffff,%eax
  jne    L48
  movsd  D67(%rip),%xmm4
  movq   %r15,%xmm6
  mulsd  %xmm6,%xmm4
  movq   %xmm4,%r15
  movq   %xmm4,%r12
L80:
  movq   %r12,%xmm1
  mov    %rbx,%rsi
  mov    %rbp,%rdi
  movsd  %xmm2,(%rsp)
  movq   %r14,%xmm0
  call   <nkep_drift3@plt>
  movsd  (%rsp),%xmm2
  cmp    $0xffffffff,%eax
  jne    L32
  movsd  D67(%rip),%xmm7
  movq   %r12,%xmm0
  mulsd  %xmm0,%xmm7
  movq   %xmm7,%r12
  movapd %xmm7,%xmm3
L42:
  movapd %xmm3,%xmm1
  mov    %rbx,%rsi
  mov    %rbp,%rdi
  movsd  %xmm2,0x20(%rsp)
  movq   %r14,%xmm0
  movsd  %xmm3,(%rsp)
  call   <nkep_drift3@plt>
  movsd  0x20(%rsp),%xmm2
  cmp    $0xffffffff,%eax
  jne    L80
  movsd  (%rsp),%xmm3
  mulsd  D67(%rip),%xmm3
  movapd %xmm3,%xmm1
L29:
  mov    %rbx,%rsi
  mov    %rbp,%rdi
  movq   %r14,%xmm0
  movsd  %xmm1,(%rsp)
  movsd  %xmm3,0x28(%rsp)
  movsd  %xmm2,0x20(%rsp)
  call   <nkep_drift3@plt>
  movsd  0x20(%rsp),%xmm2
  movsd  0x28(%rsp),%xmm3
  cmp    $0xffffffff,%eax
  jne    L42
  movsd  (%rsp),%xmm1
  mov    %rbx,%rsi
  mov    %rbp,%rdi
  movq   %r14,%xmm0
  mulsd  D67(%rip),%xmm1
  movsd  %xmm1,(%rsp)
  call   <drift_shep>
  movsd  (%rsp),%xmm1
  movsd  0x20(%rsp),%xmm2
  movsd  0x28(%rsp),%xmm3
  jmp    L29
L56:
  add    $0x38,%rsp
  pop    %rbx
  pop    %rbp
  pop    %r12
  pop    %r13
  pop    %r14
  pop    %r15
  ret
```

tool_calls: name: disassemble_data
arguments: data_label: D67
data_type: byte[8]

tool: {"D67": [0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0x3f]}

assistant: ```c
void drift_shep(double mu, double *r0, double *v0, double dt) {
  if (nkep_drift3(mu, r0, v0, dt) == -1) {
    drift_shep(mu, r0, v0, dt / 2);
    drift_shep(mu, r0, v0, dt / 2);
  }
}
```