user: What is the c source code of the assembly code below?

```asm
<mod_huiliers_area2>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  sub    $0xa0,%rsp
  mov    %edi,-0x74(%rbp)
  mov    %rsi,-0x80(%rbp)
  mov    %rdx,-0x88(%rbp)
  movsd  %xmm0,-0x90(%rbp)
  movsd  %xmm1,-0x98(%rbp)
  mov    %fs:0x28,%rax
  mov    %rax,-0x8(%rbp)
  xor    %eax,%eax
  cmpl   $0x2,-0x74(%rbp)
  jg     L25
  pxor   %xmm0,%xmm0
  jmp    L26
L25:
  pxor   %xmm0,%xmm0
  movsd  %xmm0,-0x68(%rbp)
  lea    -0x60(%rbp),%rdx
  movsd  -0x98(%rbp),%xmm0
  mov    -0x90(%rbp),%rax
  mov    %rdx,%rdi
  movapd %xmm0,%xmm1
  movq   %rax,%xmm0
  call   <lonlat_to_xyz@plt>
  mov    -0x88(%rbp),%rax
  movsd  (%rax),%xmm0
  mov    -0x80(%rbp),%rax
  mov    (%rax),%rax
  lea    -0x40(%rbp),%rdx
  mov    %rdx,%rdi
  movapd %xmm0,%xmm1
  movq   %rax,%xmm0
  call   <lonlat_to_xyz@plt>
  movl   $0x1,-0x6c(%rbp)
  jmp    L80
L83:
  mov    -0x6c(%rbp),%eax
  cltq
  lea    0x0(,%rax,8),%rdx
  mov    -0x80(%rbp),%rax
  add    %rdx,%rax
  movsd  (%rax),%xmm1
  mov    -0x6c(%rbp),%eax
  cltq
  shl    $0x3,%rax
  lea    -0x8(%rax),%rdx
  mov    -0x80(%rbp),%rax
  add    %rdx,%rax
  movsd  (%rax),%xmm0
  comisd %xmm1,%xmm0
  seta   %al
  xor    $0x1,%eax
  test   %al,%al
  je     L85
  mov    -0x6c(%rbp),%eax
  cltq
  shl    $0x3,%rax
  lea    -0x8(%rax),%rdx
  mov    -0x80(%rbp),%rax
  add    %rdx,%rax
  movsd  (%rax),%xmm1
  mov    -0x6c(%rbp),%eax
  cltq
  lea    0x0(,%rax,8),%rdx
  mov    -0x80(%rbp),%rax
  add    %rdx,%rax
  movsd  (%rax),%xmm0
  comisd %xmm1,%xmm0
  seta   %al
  xor    $0x1,%eax
  test   %al,%al
  je     L85
  mov    -0x6c(%rbp),%eax
  cltq
  lea    0x0(,%rax,8),%rdx
  mov    -0x88(%rbp),%rax
  add    %rdx,%rax
  movsd  (%rax),%xmm1
  mov    -0x6c(%rbp),%eax
  cltq
  shl    $0x3,%rax
  lea    -0x8(%rax),%rdx
  mov    -0x88(%rbp),%rax
  add    %rdx,%rax
  movsd  (%rax),%xmm0
  comisd %xmm1,%xmm0
  seta   %al
  xor    $0x1,%eax
  test   %al,%al
  je     L85
  mov    -0x6c(%rbp),%eax
  cltq
  shl    $0x3,%rax
  lea    -0x8(%rax),%rdx
  mov    -0x88(%rbp),%rax
  add    %rdx,%rax
  movsd  (%rax),%xmm1
  mov    -0x6c(%rbp),%eax
  cltq
  lea    0x0(,%rax,8),%rdx
  mov    -0x88(%rbp),%rax
  add    %rdx,%rax
  movsd  (%rax),%xmm0
  comisd %xmm1,%xmm0
  seta   %al
  xor    $0x1,%eax
  test   %al,%al
  jne    L95
L85:
  mov    -0x6c(%rbp),%eax
  cltq
  lea    0x0(,%rax,8),%rdx
  mov    -0x88(%rbp),%rax
  add    %rdx,%rax
  movsd  (%rax),%xmm0
  mov    -0x6c(%rbp),%eax
  cltq
  lea    0x0(,%rax,8),%rdx
  mov    -0x80(%rbp),%rax
  add    %rdx,%rax
  mov    (%rax),%rax
  lea    -0x20(%rbp),%rdx
  mov    %rdx,%rdi
  movapd %xmm0,%xmm1
  movq   %rax,%xmm0
  call   <lonlat_to_xyz@plt>
  lea    -0x20(%rbp),%rdx
  lea    -0x40(%rbp),%rcx
  lea    -0x60(%rbp),%rax
  mov    %rcx,%rsi
  mov    %rax,%rdi
  call   <mod_tri_area@plt>
  pxor   %xmm0,%xmm0
  cvtsi2sd %rax,%xmm0
  movsd  -0x68(%rbp),%xmm1
  addsd  %xmm1,%xmm0
  movsd  %xmm0,-0x68(%rbp)
  movsd  -0x20(%rbp),%xmm0
  movsd  %xmm0,-0x40(%rbp)
  movsd  -0x18(%rbp),%xmm0
  movsd  %xmm0,-0x38(%rbp)
  movsd  -0x10(%rbp),%xmm0
  movsd  %xmm0,-0x30(%rbp)
  jmp    L52
L95:
  nop
L52:
  addl   $0x1,-0x6c(%rbp)
L80:
  mov    -0x6c(%rbp),%eax
  cmp    -0x74(%rbp),%eax
  jl     L83
  mov    -0x80(%rbp),%rax
  movsd  (%rax),%xmm1
  mov    -0x74(%rbp),%eax
  cltq
  shl    $0x3,%rax
  lea    -0x8(%rax),%rdx
  mov    -0x80(%rbp),%rax
  add    %rdx,%rax
  movsd  (%rax),%xmm0
  comisd %xmm1,%xmm0
  ja     L69
  mov    -0x74(%rbp),%eax
  cltq
  shl    $0x3,%rax
  lea    -0x8(%rax),%rdx
  mov    -0x80(%rbp),%rax
  add    %rdx,%rax
  movsd  (%rax),%xmm1
  mov    -0x80(%rbp),%rax
  movsd  (%rax),%xmm0
  comisd %xmm1,%xmm0
  ja     L69
  mov    -0x88(%rbp),%rax
  movsd  (%rax),%xmm1
  mov    -0x74(%rbp),%eax
  cltq
  shl    $0x3,%rax
  lea    -0x8(%rax),%rdx
  mov    -0x88(%rbp),%rax
  add    %rdx,%rax
  movsd  (%rax),%xmm0
  comisd %xmm1,%xmm0
  ja     L69
  mov    -0x74(%rbp),%eax
  cltq
  shl    $0x3,%rax
  lea    -0x8(%rax),%rdx
  mov    -0x88(%rbp),%rax
  add    %rdx,%rax
  movsd  (%rax),%xmm1
  mov    -0x88(%rbp),%rax
  movsd  (%rax),%xmm0
  comisd %xmm1,%xmm0
  jbe    L102
L69:
  mov    -0x88(%rbp),%rax
  movsd  (%rax),%xmm0
  mov    -0x80(%rbp),%rax
  mov    (%rax),%rax
  lea    -0x20(%rbp),%rdx
  mov    %rdx,%rdi
  movapd %xmm0,%xmm1
  movq   %rax,%xmm0
  call   <lonlat_to_xyz@plt>
  lea    -0x20(%rbp),%rdx
  lea    -0x40(%rbp),%rcx
  lea    -0x60(%rbp),%rax
  mov    %rcx,%rsi
  mov    %rax,%rdi
  call   <mod_tri_area@plt>
  pxor   %xmm0,%xmm0
  cvtsi2sd %rax,%xmm0
  movsd  -0x68(%rbp),%xmm1
  addsd  %xmm1,%xmm0
  movsd  %xmm0,-0x68(%rbp)
L102:
  movsd  -0x68(%rbp),%xmm0
L26:
  movq   %xmm0,%rax
  mov    -0x8(%rbp),%rdx
  sub    %fs:0x28,%rdx
  je     L113
  call   <__stack_chk_fail@plt>
L113:
  movq   %rax,%xmm0
  leave
  ret
```

assistant: ```c
double mod_huiliers_area2(int num_corners, double *cell_corner_lon, double *cell_corner_lat, double cell_center_lon, double cell_center_lat) {
  if (num_corners < 3)
    return 0;
  double sum = 0.0;
  double pnt1[3], pnt2[3], pnt3[3];
  lonlat_to_xyz(cell_center_lon, cell_center_lat, pnt1);
  lonlat_to_xyz(cell_corner_lon[0], cell_corner_lat[0], pnt2);
  for (int i = 1; i < num_corners; i++) {
    if ((!(cell_corner_lon[i] < cell_corner_lon[i - 1] || cell_corner_lon[i - 1] < cell_corner_lon[i])) && (!(cell_corner_lat[i] < cell_corner_lat[i - 1] || cell_corner_lat[i - 1] < cell_corner_lat[i])))
      continue;
    lonlat_to_xyz(cell_corner_lon[i], cell_corner_lat[i], pnt3);
    sum += mod_tri_area(pnt1, pnt2, pnt3);
    pnt2[0] = pnt3[0];
    pnt2[1] = pnt3[1];
    pnt2[2] = pnt3[2];
  }
  if (!((!(cell_corner_lon[0] < cell_corner_lon[num_corners - 1] || cell_corner_lon[num_corners - 1] < cell_corner_lon[0])) && (!(cell_corner_lat[0] < cell_corner_lat[num_corners - 1] || cell_corner_lat[num_corners - 1] < cell_corner_lat[0])))) {
    lonlat_to_xyz(cell_corner_lon[0], cell_corner_lat[0], pnt3);
    sum += mod_tri_area(pnt1, pnt2, pnt3);
  }
  return (sum);
}
```