user: 请从给定的汇编指令推导出C源代码：

```asm
<approximate_intersection_pt>:
  endbr64
  push   %r12
  mov    %rdx,%r12
  push   %rbp
  mov    %rdi,%rbp
  push   %rbx
  mov    0x8(%rdi),%eax
  mov    %rsi,%rbx
  cmp    %eax,(%rdi)
  setne  %dil
  movzbl %dil,%edi
  call   <assert@plt>
  mov    0xc(%rbp),%eax
  xor    %edi,%edi
  cmp    %eax,0x4(%rbp)
  setne  %dil
  call   <assert@plt>
  mov    0x4(%rbp),%edx
  mov    0xc(%rbp),%esi
  pxor   %xmm5,%xmm5
  mov    0x0(%rbp),%eax
  lea    (%rdx,%rdx,2),%ecx
  mov    0x8(%rbp),%edx
  lea    (%rsi,%rsi,2),%esi
  lea    (%rax,%rax,2),%eax
  movslq %ecx,%rcx
  movslq %esi,%rsi
  lea    (%rdx,%rdx,2),%edx
  movsd  0x10(%rbx,%rcx,8),%xmm0
  movsd  0x10(%rbx,%rsi,8),%xmm8
  cltq
  movslq %edx,%rdx
  movsd  0x10(%rbx,%rax,8),%xmm7
  movsd  0x10(%rbx,%rdx,8),%xmm1
  movapd %xmm0,%xmm2
  movapd %xmm8,%xmm3
  subsd  %xmm7,%xmm2
  subsd  %xmm1,%xmm3
  movapd %xmm1,%xmm9
  subsd  %xmm7,%xmm9
  subsd  %xmm3,%xmm2
  movapd %xmm2,%xmm3
  andpd  D28(%rip),%xmm3
  comisd %xmm5,%xmm3
  jbe    L3
  movapd %xmm9,%xmm4
  movsd  D16(%rip),%xmm5
  divsd  %xmm2,%xmm4
  movapd %xmm7,%xmm2
  subsd  %xmm4,%xmm5
  mulsd  %xmm5,%xmm2
L11:
  movapd %xmm4,%xmm3
  unpcklpd %xmm4,%xmm4
  unpcklpd %xmm5,%xmm5
  mulsd  %xmm0,%xmm3
  addsd  %xmm2,%xmm3
  subsd  %xmm3,%xmm1
  movapd %xmm3,%xmm6
  subsd  %xmm7,%xmm6
  movapd %xmm3,%xmm7
  subsd  %xmm8,%xmm7
  movapd %xmm1,%xmm2
  movupd (%rbx,%rsi,8),%xmm1
  divsd  %xmm9,%xmm6
  divsd  %xmm9,%xmm2
  movapd %xmm0,%xmm9
  subsd  %xmm3,%xmm0
  subsd  %xmm8,%xmm9
  movupd (%rbx,%rcx,8),%xmm8
  divsd  %xmm9,%xmm0
  divsd  %xmm9,%xmm7
  unpcklpd %xmm0,%xmm0
  mulpd  %xmm1,%xmm0
  movapd %xmm7,%xmm1
  unpcklpd %xmm1,%xmm1
  mulpd  %xmm8,%xmm1
  addpd  %xmm1,%xmm0
  movupd (%rbx,%rdx,8),%xmm1
  mulpd  %xmm4,%xmm0
  movapd %xmm6,%xmm4
  movupd (%rbx,%rax,8),%xmm6
  pop    %rbx
  unpcklpd %xmm4,%xmm4
  movsd  %xmm3,0x10(%r12)
  pop    %rbp
  mulpd  %xmm1,%xmm4
  movapd %xmm2,%xmm1
  unpcklpd %xmm1,%xmm1
  mulpd  %xmm6,%xmm1
  addpd  %xmm4,%xmm1
  mulpd  %xmm5,%xmm1
  addpd  %xmm1,%xmm0
  movups %xmm0,(%r12)
  pop    %r12
  ret
  nopl   0x0(%rax)
L3:
  movsd  D16(%rip),%xmm5
  movapd %xmm7,%xmm2
  pxor   %xmm4,%xmm4
  jmp    L11
```

tool_calls: name: retrieve_data
arguments: data_tag: D28
type_infered: qword[2]
name: retrieve_data
arguments: data_tag: D16
type_infered: f64

tool: {"D28": [0x7fffffffffffffff,0x0000000000000000]}

tool: D16: 1

assistant: ```c
void approximate_intersection_pt(int *L, double *c, double *pt) {
  double a;
  double z0, z1, z2, z3;
  double b1, b2;
  double x1, y1;
  double x2, y2;
  double z;
  assert(L[0] != L[2]);
  assert(L[1] != L[3]);
  z0 = c[3 * L[0] + 2];
  z1 = c[3 * L[1] + 2];
  z2 = c[3 * L[2] + 2];
  z3 = c[3 * L[3] + 2];
  if (fabs((z1 - z0) - (z3 - z2)) > 0.0) {
    a = (z2 - z0) / ((z1 - z0) - (z3 - z2));
  } else {
    a = 0;
  }
  z = z0 * (1.0 - a) + z1 * a;
  b1 = (z2 - z) / (z2 - z0);
  b2 = (z - z0) / (z2 - z0);
  x1 = c[3 * L[0] + 0] * b1 + c[3 * L[2] + 0] * b2;
  y1 = c[3 * L[0] + 1] * b1 + c[3 * L[2] + 1] * b2;
  b1 = (z - z3) / (z1 - z3);
  b2 = (z1 - z) / (z1 - z3);
  x2 = c[3 * L[1] + 0] * b1 + c[3 * L[3] + 0] * b2;
  y2 = c[3 * L[1] + 1] * b1 + c[3 * L[3] + 1] * b2;
  pt[0] = x1 * (1.0 - a) + x2 * a;
  pt[1] = y1 * (1.0 - a) + y2 * a;
  pt[2] = z;
}
```