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

```asm
<at_do_raycast_fov>:
  endbr64
  push   %r15
  movapd %xmm0,%xmm6
  pxor   %xmm7,%xmm7
  mov    %r9d,%r15d
  push   %r14
  cvtsi2sd %r9d,%xmm7
  mov    %r8d,%r14d
  push   %r13
  mov    %rcx,%r13
  push   %r12
  mov    %rdx,%r12
  push   %rbp
  mov    %rsi,%rbp
  push   %rbx
  mov    %rdi,%rbx
  sub    $0x38,%rsp
  movsd  %xmm0,(%rsp)
  pxor   %xmm0,%xmm0
  cvtsi2sd %r8d,%xmm0
  movsd  %xmm7,0x20(%rsp)
  movapd %xmm0,%xmm1
  subsd  %xmm6,%xmm1
  cvttsd2si %xmm1,%r10d
  movapd %xmm0,%xmm1
  pxor   %xmm0,%xmm0
  addsd  %xmm6,%xmm1
  cvtsi2sd %r10d,%xmm0
  mov    %r10d,0x1c(%rsp)
  movsd  %xmm1,0x10(%rsp)
  comisd %xmm0,%xmm1
  jb     L48
  subsd  %xmm6,%xmm7
  mov    %r8d,%r15d
  mov    %rcx,%r14
  mov    %rdx,%r13
  mov    %rsi,%r12
  mov    %rdi,%rbp
  mov    %r10d,%ebx
  cvttsd2si %xmm7,%eax
  movsd  %xmm7,0x28(%rsp)
  mov    %eax,0x18(%rsp)
  nopl   0x0(%rax)
L44:
  mov    0x18(%rsp),%eax
  mov    %r15d,%r8d
  mov    %r14,%rcx
  mov    %r13,%rdx
  mov    %r12,%rsi
  mov    %rbp,%rdi
  push   %rax
  push   %rbx
  movsd  0x10(%rsp),%xmm0
  add    $0x1,%ebx
  mov    %r9d,0x18(%rsp)
  call   <ray@plt>
  pxor   %xmm0,%xmm0
  pop    %r9
  pop    %r10
  cvtsi2sd %ebx,%xmm0
  movsd  0x10(%rsp),%xmm2
  mov    0x8(%rsp),%r9d
  comisd %xmm0,%xmm2
  jae    L44
  movsd  0x20(%rsp),%xmm1
  addsd  (%rsp),%xmm1
  mov    %rbp,%rbx
  mov    %r12,%rbp
  mov    0x1c(%rsp),%r10d
  mov    %r13,%r12
  mov    %r14,%r13
  mov    %r15d,%r14d
  mov    %r14d,%r15d
  mov    %r13,%r14
  mov    %r12,%r13
  mov    %rbp,%r12
  cvttsd2si %xmm1,%eax
  mov    %rbx,%rbp
  movsd  %xmm1,0x8(%rsp)
  mov    %r10d,%ebx
  mov    %eax,0x20(%rsp)
  nopl   0x0(%rax)
L17:
  mov    0x20(%rsp),%eax
  mov    %r15d,%r8d
  mov    %rbp,%rdi
  mov    %r14,%rcx
  mov    %r13,%rdx
  mov    %r12,%rsi
  push   %rax
  push   %rbx
  movsd  0x10(%rsp),%xmm0
  add    $0x1,%ebx
  mov    %r9d,0x28(%rsp)
  call   <ray@plt>
  pxor   %xmm0,%xmm0
  pop    %rdi
  pop    %r8
  cvtsi2sd %ebx,%xmm0
  movsd  0x10(%rsp),%xmm3
  mov    0x18(%rsp),%r9d
  comisd %xmm0,%xmm3
  jae    L17
  mov    %rbp,%rbx
  mov    %r12,%rbp
  mov    %r13,%r12
  mov    %r14,%r13
  mov    %r15d,%r14d
  mov    %r9d,%r15d
L59:
  cvttsd2si 0x28(%rsp),%r11d
  pxor   %xmm0,%xmm0
  movsd  0x8(%rsp),%xmm7
  cvtsi2sd %r11d,%xmm0
  comisd %xmm0,%xmm7
  jb     L31
  mov    %r11d,0x20(%rsp)
  mov    %r15d,%r9d
  mov    %r14d,%r15d
  mov    %r13,%r14
  mov    %r12,%r13
  mov    %rbp,%r12
  mov    %rbx,%rbp
  mov    %r11d,%ebx
  nopl   0x0(%rax,%rax,1)
L34:
  push   %rbx
  mov    0x24(%rsp),%eax
  mov    %r14,%rcx
  mov    %r12,%rsi
  mov    %r15d,%r8d
  mov    %r13,%rdx
  mov    %rbp,%rdi
  add    $0x1,%ebx
  push   %rax
  movsd  0x10(%rsp),%xmm0
  mov    %r9d,0x28(%rsp)
  call   <ray@plt>
  pxor   %xmm0,%xmm0
  pop    %rcx
  pop    %rsi
  cvtsi2sd %ebx,%xmm0
  movsd  0x8(%rsp),%xmm4
  mov    0x18(%rsp),%r9d
  comisd %xmm0,%xmm4
  jae    L34
  cvttsd2si 0x10(%rsp),%eax
  mov    0x20(%rsp),%r11d
  mov    %rbp,%rbx
  mov    %r12,%rbp
  mov    %r13,%r12
  mov    %r14,%r13
  mov    %r13,%r14
  mov    %r12,%r13
  mov    %rbp,%r12
  mov    %rbx,%rbp
  mov    %r11d,%ebx
  mov    %eax,0x18(%rsp)
  nopl   (%rax)
L33:
  push   %rbx
  mov    0x20(%rsp),%eax
  mov    %r13,%rdx
  mov    %r15d,%r8d
  mov    %r14,%rcx
  mov    %r12,%rsi
  mov    %rbp,%rdi
  add    $0x1,%ebx
  push   %rax
  movsd  0x10(%rsp),%xmm0
  mov    %r9d,0x20(%rsp)
  call   <ray@plt>
  pxor   %xmm0,%xmm0
  pop    %rax
  pop    %rdx
  cvtsi2sd %ebx,%xmm0
  movsd  0x8(%rsp),%xmm5
  mov    0x10(%rsp),%r9d
  comisd %xmm0,%xmm5
  jae    L33
L31:
  add    $0x38,%rsp
  pop    %rbx
  pop    %rbp
  pop    %r12
  pop    %r13
  pop    %r14
  pop    %r15
  ret
  nopw   0x0(%rax,%rax,1)
L48:
  movsd  0x20(%rsp),%xmm7
  movsd  (%rsp),%xmm2
  movapd %xmm7,%xmm6
  subsd  %xmm2,%xmm7
  addsd  %xmm2,%xmm6
  movsd  %xmm7,0x28(%rsp)
  movsd  %xmm6,0x8(%rsp)
  jmp    L59
```

assistant: ```c
void at_do_raycast_fov(int *view, int *grid, size_t w, size_t h, double r, int cx, int cy) {
  int v;
  for (v = cx - r; v <= cx + r; ++v)
    ray(view, grid, w, h, r, cx, cy, v, cy - r);
  for (v = cx - r; v <= cx + r; ++v)
    ray(view, grid, w, h, r, cx, cy, v, cy + r);
  for (v = cy - r; v <= cy + r; ++v)
    ray(view, grid, w, h, r, cx, cy, cx - r, v);
  for (v = cy - r; v <= cy + r; ++v)
    ray(view, grid, w, h, r, cx, cy, cx + r, v);
}
```