user: Please show me the C implementation that matches the assembly code listed below:

```asm
<get_face_2d_utopia>:
  endbr64
  push   %r13
  push   %r12
  push   %rbp
  push   %rbx
  mov    %edi,%ecx
  mov    %esi,%eax
  mov    %edx,%esi
  mov    %r9d,%r10d
  mov    0x28(%rsp),%ebp
  mov    0x40(%rsp),%rdi
  movapd %xmm1,%xmm7
  mulsd  %xmm0,%xmm7
  pxor   %xmm4,%xmm4
  cvtsi2sd %ebp,%xmm4
  movapd %xmm4,%xmm6
  mulsd  %xmm7,%xmm6
  pxor   %xmm8,%xmm8
  comisd %xmm8,%xmm6
  setbe  %r11b
  movzbl %r11b,%r11d
  lea    (%rax,%r9,1),%edx
  mov    %edx,%r9d
  imul   %esi,%r9d
  add    %ecx,%r9d
  add    %r8d,%r9d
  movslq %r9d,%r9
  movsd  (%rdi,%r9,8),%xmm5
  movslq 0x30(%rsp),%r9
  movsd  (%rdi,%r9,8),%xmm1
  movapd %xmm5,%xmm11
  addsd  %xmm1,%xmm11
  movapd %xmm5,%xmm3
  subsd  %xmm1,%xmm3
  mulsd  %xmm6,%xmm3
  subsd  %xmm3,%xmm11
  movsd  D2(%rip),%xmm10
  mulsd  %xmm10,%xmm11
  movapd %xmm7,%xmm3
  mulsd  %xmm7,%xmm3
  movsd  D81(%rip),%xmm9
  subsd  %xmm3,%xmm9
  mulsd  D37(%rip),%xmm9
  mov    %r10d,%r9d
  imul   %r11d,%r9d
  add    %eax,%r9d
  mov    %r8d,%ebx
  imul   %r11d,%ebx
  mov    %r9d,%r12d
  imul   %esi,%r12d
  add    %ecx,%r12d
  add    %ebx,%r12d
  movslq %r12d,%r12
  movsd  (%rdi,%r12,8),%xmm3
  movapd %xmm3,%xmm6
  addsd  %xmm3,%xmm6
  mulsd  %xmm9,%xmm6
  addsd  %xmm11,%xmm6
  lea    0x0(%rbp,%r11,1),%r12d
  mov    %r12d,%r13d
  imul   %r10d,%r13d
  add    %eax,%r13d
  imul   %esi,%r13d
  add    %ecx,%r13d
  imul   %r8d,%r12d
  add    %r13d,%r12d
  movslq %r12d,%r12
  movapd %xmm9,%xmm11
  mulsd  (%rdi,%r12,8),%xmm11
  subsd  %xmm11,%xmm6
  sub    %ebp,%r11d
  mov    %r11d,%r12d
  imul   %r10d,%r12d
  add    %eax,%r12d
  imul   %esi,%r12d
  add    %ecx,%r12d
  imul   %r8d,%r11d
  add    %r11d,%r12d
  movslq %r12d,%r12
  mulsd  (%rdi,%r12,8),%xmm9
  subsd  %xmm9,%xmm6
  mulsd  %xmm10,%xmm3
  mulsd  %xmm2,%xmm3
  mulsd  %xmm0,%xmm3
  mulsd  %xmm2,%xmm3
  mulsd  %xmm0,%xmm3
  subsd  %xmm3,%xmm6
  imul   %ebp,%r10d
  mov    %r10d,%r12d
  mov    $0x1,%r11d
  mov    %r11d,%r10d
  sub    %r12d,%r10d
  imul   %r8d,%ebp
  sub    %ebp,%r11d
  movsd  D63(%rip),%xmm10
  movapd %xmm2,%xmm9
  mulsd  %xmm10,%xmm9
  mulsd  %xmm0,%xmm9
  lea    (%r9,%r10,1),%ebp
  imul   %esi,%ebp
  add    %ecx,%ebp
  add    %ebx,%ebp
  add    %r11d,%ebp
  movslq %ebp,%rbp
  movapd %xmm2,%xmm3
  mulsd  (%rdi,%rbp,8),%xmm3
  mulsd  %xmm0,%xmm3
  movapd %xmm9,%xmm11
  subsd  %xmm10,%xmm11
  mulsd  %xmm11,%xmm3
  addsd  %xmm6,%xmm3
  sub    %r10d,%r9d
  imul   %esi,%r9d
  add    %ecx,%r9d
  add    %ebx,%r9d
  sub    %r11d,%r9d
  movslq %r9d,%r9
  movapd %xmm2,%xmm6
  mulsd  (%rdi,%r9,8),%xmm6
  mulsd  %xmm0,%xmm6
  addsd  %xmm10,%xmm9
  mulsd  %xmm9,%xmm6
  addsd  %xmm3,%xmm6
  movsd  D67(%rip),%xmm9
  comisd %xmm7,%xmm8
  ja     L15
  movsd  D81(%rip),%xmm9
L15:
  mulsd  %xmm2,%xmm0
  movapd %xmm0,%xmm3
  pxor   %xmm0,%xmm0
  comisd %xmm3,%xmm0
  ja     L21
  movsd  D81(%rip),%xmm2
  mov    $0x1,%r9d
L5:
  mulsd  D63(%rip),%xmm3
  subsd  %xmm7,%xmm9
  movapd %xmm3,%xmm0
  mulsd  %xmm9,%xmm0
  mulsd  %xmm2,%xmm1
  mulsd  %xmm4,%xmm1
  mulsd  %xmm0,%xmm1
  addsd  %xmm6,%xmm1
  mulsd  %xmm2,%xmm5
  mulsd  %xmm4,%xmm5
  mulsd  %xmm0,%xmm5
  subsd  %xmm5,%xmm1
  imul   %r9d,%r10d
  imul   %r11d,%r9d
  sub    %r10d,%eax
  imul   %esi,%eax
  add    %ecx,%eax
  sub    %r9d,%eax
  cltq
  movapd %xmm2,%xmm3
  mulsd  (%rdi,%rax,8),%xmm3
  mulsd  %xmm4,%xmm3
  mulsd  %xmm0,%xmm3
  subsd  %xmm3,%xmm1
  mov    %edx,%eax
  sub    %r10d,%eax
  imul   %esi,%eax
  add    %ecx,%eax
  add    %r8d,%eax
  sub    %r9d,%eax
  cltq
  mulsd  (%rdi,%rax,8),%xmm2
  mulsd  %xmm4,%xmm2
  mulsd  %xmm2,%xmm0
  addsd  %xmm1,%xmm0
  mov    0x38(%rsp),%rax
  movsd  %xmm0,(%rax)
  pop    %rbx
  pop    %rbp
  pop    %r12
  pop    %r13
  ret
L21:
  movsd  D67(%rip),%xmm2
  mov    $0xffffffff,%r9d
  jmp    L5
```

tool_calls: name: read_data
arguments: label: D2
type_guessed: f64
name: read_data
arguments: label: D81
type_guessed: f64
name: read_data
arguments: label: D37
type_guessed: f64
name: read_data
arguments: label: D63
type_guessed: f64
name: read_data
arguments: label: D67
type_guessed: f32[2]

tool: D2: 0.5

tool: D81: 1

tool: D37: 0.1666666666666666

tool: D63: 0.25

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

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;
}
```