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

```asm
<find_out_point>:
  endbr64
  push   %rbp
  mov    %rdi,%r10
  mov    %rsi,%r11
  mov    %rcx,%rdi
  push   %rbx
  mov    %rdx,%rbx
  sub    $0x68,%rsp
  mov    %fs:0x28,%rax
  mov    %rax,0x58(%rsp)
  xor    %eax,%eax
  movq   $0xffffffffffffffff,(%r9)
  mov    0x80(%rsp),%rbp
  lea    0x20(%rsp),%rsi
  movl   $0xffffffff,0x8(%r9)
  nopw   0x0(%rax,%rax,1)
L114:
  mov    %eax,%edx
  mov    %eax,%ecx
  pxor   %xmm0,%xmm0
  sar    %edx
  and    $0x1,%ecx
  movslq %edx,%rdx
  add    (%rbx,%rdx,4),%ecx
  cvtsi2sd %ecx,%xmm0
  mulsd  (%r11,%rdx,8),%xmm0
  addsd  (%r10,%rdx,8),%xmm0
  movsd  %xmm0,(%rsi,%rax,8)
  add    $0x1,%rax
  cmp    $0x6,%rax
  jne    L114
  movsd  D16(%rip),%xmm2
  xor    %eax,%eax
  pxor   %xmm3,%xmm3
  mov    %rsp,%rcx
L166:
  movsd  (%r8,%rax,1),%xmm0
  comisd %xmm3,%xmm0
  jbe    L226
  addsd  %xmm2,%xmm0
  movsd  0x8(%rsi,%rax,2),%xmm1
  subsd  (%rdi,%rax,1),%xmm1
  divsd  %xmm0,%xmm1
  movsd  %xmm1,(%rcx,%rax,1)
L7:
  add    $0x8,%rax
  cmp    $0x18,%rax
  jne    L166
  movsd  0x20(%rsp),%xmm3
  movsd  0x28(%rsp),%xmm5
  xor    %eax,%eax
  mov    $0xffffffff,%r11d
  movsd  0x30(%rsp),%xmm6
  movsd  0x38(%rsp),%xmm7
  movsd  0x40(%rsp),%xmm8
  movsd  0x48(%rsp),%xmm9
  movsd  D14(%rip),%xmm1
L4:
  movsd  (%rcx,%rax,8),%xmm0
  mov    %eax,%r10d
  comisd %xmm0,%xmm1
  jbe    L165
  comisd %xmm2,%xmm0
  ja     L102
L165:
  add    $0x1,%rax
  cmp    $0x3,%rax
  jne    L4
  movsd  (%rdi),%xmm0
  cmp    $0x2,%r11d
  jbe    L220
  movsd  %xmm0,0x0(%rbp)
  movsd  0x8(%rdi),%xmm1
  xor    %r8d,%r8d
  movsd  %xmm1,0x8(%rbp)
  movsd  0x10(%rdi),%xmm1
  movsd  %xmm1,0x10(%rbp)
L60:
  movq   D7(%rip),%xmm4
  xor    %eax,%eax
L52:
  movapd %xmm0,%xmm1
  lea    (%rax,%rax,1),%edx
  subsd  %xmm3,%xmm1
  andpd  %xmm4,%xmm1
  comisd %xmm1,%xmm2
  ja     L219
  subsd  0x8(%rsi),%xmm0
  add    $0x1,%edx
  andpd  %xmm4,%xmm0
  comisd %xmm0,%xmm2
  jbe    L132
L219:
  mov    %edx,(%r9,%rax,4)
L132:
  add    $0x1,%rax
  add    $0x10,%rsi
  cmp    $0x3,%rax
  je     L54
  movsd  0x0(%rbp,%rax,8),%xmm0
  movsd  (%rsi),%xmm3
  jmp    L52
  xchg   %ax,%ax
L226:
  comisd %xmm0,%xmm3
  jbe    L7
  movapd %xmm2,%xmm4
  movsd  (%rdi,%rax,1),%xmm1
  subsd  (%rsi,%rax,2),%xmm1
  subsd  %xmm0,%xmm4
  divsd  %xmm4,%xmm1
  movsd  %xmm1,(%rcx,%rax,1)
  jmp    L7
  nopw   0x0(%rax,%rax,1)
L54:
  mov    0x58(%rsp),%rax
  sub    %fs:0x28,%rax
  jne    L83
  add    $0x68,%rsp
  mov    %r8d,%eax
  pop    %rbx
  pop    %rbp
  ret
  xchg   %ax,%ax
L220:
  xor    %eax,%eax
L8:
  movsd  (%r8,%rax,1),%xmm0
  mulsd  %xmm1,%xmm0
  addsd  (%rdi,%rax,1),%xmm0
  movsd  %xmm0,0x0(%rbp,%rax,1)
  add    $0x8,%rax
  cmp    $0x18,%rax
  jne    L8
  movsd  0x0(%rbp),%xmm0
  mov    $0x1,%r8d
  jmp    L60
  nopl   0x0(%rax)
L102:
  xor    %edx,%edx
L179:
  movsd  (%r8,%rdx,1),%xmm4
  mulsd  %xmm0,%xmm4
  addsd  (%rdi,%rdx,1),%xmm4
  movsd  %xmm4,0x0(%rbp,%rdx,1)
  add    $0x8,%rdx
  cmp    $0x18,%rdx
  jne    L179
  movapd %xmm3,%xmm10
  movsd  0x0(%rbp),%xmm4
  subsd  %xmm2,%xmm10
  comisd %xmm10,%xmm4
  jb     L165
  movapd %xmm5,%xmm10
  addsd  %xmm2,%xmm10
  comisd %xmm4,%xmm10
  jb     L165
  movapd %xmm6,%xmm10
  movsd  0x8(%rbp),%xmm4
  subsd  %xmm2,%xmm10
  comisd %xmm10,%xmm4
  jb     L165
  movapd %xmm7,%xmm10
  addsd  %xmm2,%xmm10
  comisd %xmm4,%xmm10
  jb     L165
  movapd %xmm8,%xmm10
  movsd  0x10(%rbp),%xmm4
  subsd  %xmm2,%xmm10
  comisd %xmm10,%xmm4
  jb     L165
  movapd %xmm9,%xmm11
  movapd %xmm4,%xmm10
  addsd  %xmm2,%xmm11
  cmpnlesd %xmm11,%xmm10
  ucomisd %xmm4,%xmm11
  andpd  %xmm10,%xmm1
  andnpd %xmm0,%xmm10
  cmovae %r10d,%r11d
  orpd   %xmm10,%xmm1
  jmp    L165
L83:
  call   <__stack_chk_fail@plt>
```

tool_calls: name: extract_symbolic_data
arguments: tag: D16
data_type: f64
name: extract_symbolic_data
arguments: tag: D14
data_type: byte[8]
name: extract_symbolic_data
arguments: tag: D7
data_type: qword

tool: D16: 1e-08

tool: {"D14": [0x00,0xa0,0xd8,0x85,0x57,0x34,0x76,0x43]}

tool: D7: 9223372036854775807

assistant: ```c
int find_out_point(double orig_xyz[3], double r_dxyz[3], int ijk[3], double in_point[3], double ray_direction[3], int face_sect[3], double out_point[3]) {
  int i, j, mincomp, intersection;
  double minmax[6], t[3], mint;
  int i1, j1;
  for (i = 0; i < 3; i++)
    face_sect[i] = -1;
  for (i = 0; i < 6; i++) {
    i1 = i / 2;
    j1 = i % 2;
    minmax[i] = orig_xyz[i1] + (ijk[i1] + j1) * r_dxyz[i1];
  }
  for (i = 0; i < 3; i++) {
    if (ray_direction[i] > 0)
      t[i] = (minmax[i * 2 + 1] - in_point[i]) / (ray_direction[i] + 0.00000001);
    else if (ray_direction[i] < 0)
      t[i] = (in_point[i] - minmax[i * 2]) / (-ray_direction[i] + 0.00000001);
  }
  mint = 1.0E+17;
  mincomp = -1;
  for (i = 0; i < 3; i++) {
    if ((mint > t[i]) && (t[i] > 0.00000001)) {
      for (j = 0; j < 3; j++)
        out_point[j] = in_point[j] + t[i] * ray_direction[j];
      if ((out_point[0] >= minmax[0] - 0.00000001) && (out_point[0] <= minmax[1] + 0.00000001) && (out_point[1] >= minmax[2] - 0.00000001) && (out_point[1] <= minmax[3] + 0.00000001) && (out_point[2] >= minmax[4] - 0.00000001) && (out_point[2] <= minmax[5] + 0.00000001)) {
        mint = t[i];
        mincomp = i;
      }
    }
  }
  if ((mincomp >= 0) && (mincomp <= 2)) {
    intersection = 1;
    for (i = 0; i < 3; i++)
      out_point[i] = in_point[i] + mint * ray_direction[i];
  } else {
    intersection = 0;
    for (i = 0; i < 3; i++)
      out_point[i] = in_point[i];
  }
  for (i = 0; i < 3; i++) {
    if (fabs(out_point[i] - minmax[i * 2]) < 0.00000001)
      face_sect[i] = i * 2;
    else if (fabs(out_point[i] - minmax[i * 2 + 1]) < 0.00000001)
      face_sect[i] = i * 2 + 1;
  }
  return (intersection);
}
```