user: What would the C source look like for the assembly code provided here:

```asm
<get_face_2d_utopia>:
  endbr64
  push   %r13
  pxor   %xmm4,%xmm4
  pxor   %xmm9,%xmm9
  mov    %esi,%eax
  push   %r12
  mulsd  %xmm0,%xmm1
  lea    (%rax,%r9,1),%ecx
  mov    %edx,%esi
  movsd  D53(%rip),%xmm11
  push   %rbp
  mov    %ecx,%edx
  mov    %r8d,%r12d
  push   %rbx
  mov    0x28(%rsp),%ebp
  xor    %ebx,%ebx
  mov    0x40(%rsp),%r10
  cvtsi2sd %ebp,%xmm4
  movapd %xmm1,%xmm8
  movapd %xmm4,%xmm6
  mulsd  %xmm1,%xmm6
  comisd %xmm9,%xmm6
  setbe  %bl
  imul   %esi,%edx
  imul   %ebx,%r12d
  lea    0x0(%rbp,%rbx,1),%r13d
  add    %edi,%edx
  add    %r8d,%edx
  movslq %edx,%rdx
  movsd  (%r10,%rdx,8),%xmm5
  movslq 0x30(%rsp),%rdx
  movsd  (%r10,%rdx,8),%xmm1
  movapd %xmm5,%xmm3
  mov    %r9d,%edx
  movapd %xmm5,%xmm12
  imul   %ebx,%edx
  sub    %ebp,%ebx
  subsd  %xmm1,%xmm3
  addsd  %xmm1,%xmm12
  add    %eax,%edx
  mulsd  %xmm6,%xmm3
  mov    %edx,%r11d
  movsd  D25(%rip),%xmm6
  imul   %esi,%r11d
  movapd %xmm6,%xmm10
  add    %edi,%r11d
  subsd  %xmm3,%xmm12
  movapd %xmm8,%xmm3
  add    %r12d,%r11d
  mulsd  %xmm8,%xmm3
  movslq %r11d,%r11
  mulsd  %xmm11,%xmm12
  subsd  %xmm3,%xmm10
  movsd  (%r10,%r11,8),%xmm3
  mov    %r13d,%r11d
  mulsd  D58(%rip),%xmm10
  imul   %r9d,%r11d
  movapd %xmm3,%xmm7
  imul   %r8d,%r13d
  addsd  %xmm3,%xmm7
  mulsd  %xmm11,%xmm3
  add    %eax,%r11d
  imul   %esi,%r11d
  mulsd  %xmm10,%xmm7
  mulsd  %xmm2,%xmm3
  add    %edi,%r11d
  add    %r13d,%r11d
  movslq %r11d,%r11
  addsd  %xmm12,%xmm7
  movsd  (%r10,%r11,8),%xmm12
  mov    %ebx,%r11d
  imul   %r9d,%r11d
  imul   %r8d,%ebx
  mulsd  %xmm10,%xmm12
  imul   %ebp,%r9d
  mulsd  %xmm0,%xmm3
  add    %eax,%r11d
  imul   %r8d,%ebp
  imul   %esi,%r11d
  subsd  %xmm12,%xmm7
  movapd %xmm2,%xmm12
  mulsd  %xmm2,%xmm3
  add    %edi,%r11d
  add    %ebx,%r11d
  movslq %r11d,%r11
  mulsd  (%r10,%r11,8),%xmm10
  mov    $0x1,%r11d
  mov    %r11d,%ebx
  sub    %ebp,%r11d
  mulsd  %xmm0,%xmm3
  sub    %r9d,%ebx
  lea    (%rdx,%rbx,1),%r13d
  sub    %ebx,%edx
  imul   %esi,%r13d
  imul   %esi,%edx
  subsd  %xmm10,%xmm7
  movsd  D29(%rip),%xmm10
  mulsd  %xmm10,%xmm12
  add    %edi,%r13d
  add    %r12d,%r13d
  subsd  %xmm3,%xmm7
  add    %r11d,%r13d
  add    %edi,%edx
  movslq %r13d,%r13
  add    %r12d,%edx
  movsd  (%r10,%r13,8),%xmm11
  sub    %r11d,%edx
  mulsd  %xmm0,%xmm12
  movslq %edx,%rdx
  mulsd  %xmm2,%xmm11
  movapd %xmm12,%xmm3
  addsd  %xmm10,%xmm12
  mulsd  %xmm0,%xmm11
  subsd  %xmm10,%xmm3
  mulsd  %xmm3,%xmm11
  movsd  (%r10,%rdx,8),%xmm3
  mulsd  %xmm2,%xmm3
  addsd  %xmm11,%xmm7
  movapd %xmm8,%xmm11
  cmpltsd %xmm9,%xmm11
  mulsd  %xmm0,%xmm3
  mulsd  %xmm2,%xmm0
  mulsd  %xmm12,%xmm3
  comisd %xmm0,%xmm9
  addsd  %xmm7,%xmm3
  movsd  D2(%rip),%xmm7
  andpd  %xmm11,%xmm7
  andnpd %xmm6,%xmm11
  orpd   %xmm11,%xmm7
  jbe    L8
  movq   D5(%rip),%xmm2
  movsd  D2(%rip),%xmm6
  lea    -0x1(%r9),%ebx
  lea    -0x1(%rbp),%r11d
  xorpd  %xmm2,%xmm1
  xorpd  %xmm2,%xmm5
L8:
  mulsd  %xmm10,%xmm0
  sub    %ebx,%eax
  subsd  %xmm8,%xmm7
  imul   %esi,%eax
  mulsd  %xmm4,%xmm1
  mulsd  %xmm4,%xmm5
  add    %edi,%eax
  mulsd  %xmm7,%xmm0
  sub    %r11d,%eax
  cltq
  movsd  (%r10,%rax,8),%xmm2
  mov    %ecx,%eax
  sub    %ebx,%eax
  imul   %esi,%eax
  mulsd  %xmm6,%xmm2
  mulsd  %xmm0,%xmm1
  mulsd  %xmm0,%xmm5
  add    %edi,%eax
  add    %r8d,%eax
  mulsd  %xmm4,%xmm2
  sub    %r11d,%eax
  cltq
  addsd  %xmm3,%xmm1
  mulsd  (%r10,%rax,8),%xmm6
  mov    0x38(%rsp),%rax
  subsd  %xmm5,%xmm1
  mulsd  %xmm0,%xmm2
  mulsd  %xmm4,%xmm6
  subsd  %xmm2,%xmm1
  mulsd  %xmm0,%xmm6
  addsd  %xmm1,%xmm6
  movsd  %xmm6,(%rax)
  pop    %rbx
  pop    %rbp
  pop    %r12
  pop    %r13
  ret
```

tool_calls: name: read_data
arguments: tag: D53
type_infered: f64
name: read_data
arguments: tag: D25
type_infered: f64
name: read_data
arguments: tag: D58
type_infered: f64
name: read_data
arguments: tag: D29
type_infered: f64
name: read_data
arguments: tag: D2
type_infered: f32[2]
name: read_data
arguments: tag: D5
type_infered: f32[2]

tool: D53: 0.5

tool: D25: 1

tool: D58: 0.1666666666666666

tool: D29: 0.25

tool: {"D2": [0.0,-1.875]}

tool: {"D5": [0.0,-0.0]}

assistant: ```c
void get_face_2d_utopia(int iX, int iY, int nX, int nY, int X_nbr, int Y_nbr, int nrm, int tid, double delta_t, double u_face, double u_face_t, double *sc_face, double *sc_old) {
  int nbrid;
  int offset = 1;
  int iwind_t = 1;
  double tmp;
  double tmp_2;
  double sc_face_tmp;
  double wind = 1.;
  double wind_t = 1.;
  double crnt;
  double crnt_t;
  crnt = u_face * delta_t * 1.;
  if (crnt * nrm > 0.)
    offset = 0;
  nbrid = (iY + (Y_nbr)) * nX + iX + (X_nbr);
  sc_face_tmp = 0.5 * (*(sc_old + nbrid) + *(sc_old + tid) - crnt * nrm * (*(sc_old + nbrid) - *(sc_old + tid)));
  tmp = (1. - crnt * crnt) * 0.1666666666666666;
  nbrid = (iY + (offset)*Y_nbr) * nX + iX + (offset)*X_nbr;
  sc_face_tmp += *(sc_old + nbrid) * 2. * tmp;
  nbrid = (iY + (offset + nrm) * Y_nbr) * nX + iX + (offset + nrm) * X_nbr;
  sc_face_tmp -= *(sc_old + nbrid) * tmp;
  nbrid = (iY + (offset - nrm) * Y_nbr) * nX + iX + (offset - nrm) * X_nbr;
  sc_face_tmp -= *(sc_old + nbrid) * tmp;
  nbrid = (iY + (offset)*Y_nbr) * nX + iX + (offset)*X_nbr;
  sc_face_tmp -= *(sc_old + nbrid) * 0.5 * u_face_t * delta_t * 1. * u_face_t * delta_t * 1.;
  nbrid = (iY + (offset)*Y_nbr + (1 - Y_nbr * nrm)) * nX + iX + (offset)*X_nbr + (1 - X_nbr * nrm);
  sc_face_tmp += *(sc_old + nbrid) * u_face_t * delta_t * 1. * (-0.25 + 0.25 * u_face_t * delta_t * 1.);
  nbrid = (iY + (offset)*Y_nbr - (1 - Y_nbr * nrm)) * nX + iX + (offset)*X_nbr - (1 - X_nbr * nrm);
  sc_face_tmp += *(sc_old + nbrid) * u_face_t * delta_t * 1. * (0.25 + 0.25 * u_face_t * delta_t * 1.);
  if (crnt < 0.)
    wind = -1.;
  crnt_t = u_face_t * delta_t * 1.;
  if (crnt_t < 0.) {
    wind_t = -1.;
    iwind_t = -1;
  }
  tmp_2 = 0.25 * crnt_t * (wind - crnt);
  sc_face_tmp += *(sc_old + tid) * wind_t * nrm * tmp_2;
  nbrid = (iY + (Y_nbr)) * nX + iX + (X_nbr);
  sc_face_tmp -= *(sc_old + nbrid) * wind_t * nrm * tmp_2;
  nbrid = (iY - iwind_t * (1 - Y_nbr * nrm)) * nX + iX - iwind_t * (1 - X_nbr * nrm);
  sc_face_tmp -= *(sc_old + nbrid) * wind_t * nrm * tmp_2;
  nbrid = (iY + (Y_nbr)-iwind_t * (1 - Y_nbr * nrm)) * nX + iX + (X_nbr)-iwind_t * (1 - X_nbr * nrm);
  sc_face_tmp += *(sc_old + nbrid) * wind_t * nrm * tmp_2;
  *sc_face = sc_face_tmp;
}
```