user: 请显示与下面列出的汇编代码相匹配的C语言实现：

```asm
<Jac2D>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  sub    $0xc0,%rsp
  mov    %rdi,-0xa8(%rbp)
  mov    %rsi,-0xb0(%rbp)
  mov    %rdx,-0xb8(%rbp)
  mov    %ecx,-0xbc(%rbp)
  mov    %fs:0x28,%rax
  mov    %rax,-0x8(%rbp)
  xor    %eax,%eax
  mov    -0xb8(%rbp),%rax
  movsd  (%rax),%xmm0
  cvttsd2si %xmm0,%eax
  mov    %eax,-0x8c(%rbp)
  mov    -0xb8(%rbp),%rax
  add    $0x8,%rax
  movsd  (%rax),%xmm0
  cvttsd2si %xmm0,%eax
  mov    %eax,-0x88(%rbp)
  mov    -0x8c(%rbp),%eax
  lea    0x1(%rax),%edx
  mov    -0x88(%rbp),%eax
  add    $0x1,%eax
  imul   %edx,%eax
  mov    %eax,-0x84(%rbp)
  movl   $0x1,-0x80(%rbp)
  mov    -0x8c(%rbp),%eax
  add    $0x1,%eax
  mov    %eax,-0x7c(%rbp)
  movl   $0x0,-0x9c(%rbp)
  jmp    L56
L66:
  movl   $0x0,-0x98(%rbp)
  jmp    L34
L47:
  movl   $0x0,-0x90(%rbp)
  mov    -0x98(%rbp),%eax
  imul   -0x7c(%rbp),%eax
  mov    %eax,%edx
  mov    -0x9c(%rbp),%eax
  add    %edx,%eax
  mov    %eax,-0x78(%rbp)
  movl   $0x0,-0x94(%rbp)
  jmp    L8
L3:
  mov    -0x78(%rbp),%eax
  movslq %eax,%rdx
  mov    -0x90(%rbp),%eax
  cltq
  add    %rdx,%rax
  lea    0x0(,%rax,8),%rdx
  mov    -0xb0(%rbp),%rax
  add    %rdx,%rax
  mov    %rax,-0x68(%rbp)
  mov    -0x68(%rbp),%rax
  movsd  (%rax),%xmm0
  mov    -0x94(%rbp),%eax
  cltq
  movsd  %xmm0,-0x60(%rbp,%rax,8)
  mov    -0x80(%rbp),%eax
  cltq
  shl    $0x3,%rax
  add    %rax,-0x68(%rbp)
  mov    -0x68(%rbp),%rax
  movsd  (%rax),%xmm0
  mov    -0x94(%rbp),%eax
  cltq
  movsd  %xmm0,-0x50(%rbp,%rax,8)
  mov    -0x7c(%rbp),%eax
  cltq
  shl    $0x3,%rax
  add    %rax,-0x68(%rbp)
  mov    -0x68(%rbp),%rax
  movsd  (%rax),%xmm0
  mov    -0x94(%rbp),%eax
  cltq
  movsd  %xmm0,-0x30(%rbp,%rax,8)
  mov    -0x80(%rbp),%eax
  cltq
  shl    $0x3,%rax
  neg    %rax
  add    %rax,-0x68(%rbp)
  mov    -0x68(%rbp),%rax
  movsd  (%rax),%xmm0
  mov    -0x94(%rbp),%eax
  cltq
  movsd  %xmm0,-0x40(%rbp,%rax,8)
  mov    -0x94(%rbp),%eax
  cltq
  movsd  -0x60(%rbp,%rax,8),%xmm1
  mov    -0x94(%rbp),%eax
  cltq
  movsd  -0x50(%rbp,%rax,8),%xmm0
  addsd  %xmm0,%xmm1
  mov    -0x94(%rbp),%eax
  cltq
  movsd  -0x40(%rbp,%rax,8),%xmm0
  addsd  %xmm0,%xmm1
  mov    -0x94(%rbp),%eax
  cltq
  movsd  -0x30(%rbp,%rax,8),%xmm0
  addsd  %xmm0,%xmm1
  movsd  D6(%rip),%xmm0
  mulsd  %xmm1,%xmm0
  mov    -0x94(%rbp),%eax
  cltq
  movsd  %xmm0,-0x20(%rbp,%rax,8)
  mov    -0x84(%rbp),%eax
  add    %eax,-0x90(%rbp)
  addl   $0x1,-0x94(%rbp)
L8:
  cmpl   $0x1,-0x94(%rbp)
  jle    L3
  lea    -0x20(%rbp),%rdx
  lea    -0x50(%rbp),%rcx
  lea    -0x60(%rbp),%rax
  mov    %rcx,%rsi
  mov    %rax,%rdi
  call   <volTriangle2D@plt>
  movq   %xmm0,%rax
  mov    %rax,-0x70(%rbp)
  lea    -0x20(%rbp),%rdx
  lea    -0x30(%rbp),%rcx
  lea    -0x50(%rbp),%rax
  mov    %rcx,%rsi
  mov    %rax,%rdi
  call   <volTriangle2D@plt>
  movsd  -0x70(%rbp),%xmm1
  addsd  %xmm1,%xmm0
  movsd  %xmm0,-0x70(%rbp)
  lea    -0x20(%rbp),%rdx
  lea    -0x40(%rbp),%rcx
  lea    -0x30(%rbp),%rax
  mov    %rcx,%rsi
  mov    %rax,%rdi
  call   <volTriangle2D@plt>
  movsd  -0x70(%rbp),%xmm1
  addsd  %xmm1,%xmm0
  movsd  %xmm0,-0x70(%rbp)
  lea    -0x20(%rbp),%rdx
  lea    -0x60(%rbp),%rcx
  lea    -0x40(%rbp),%rax
  mov    %rcx,%rsi
  mov    %rax,%rdi
  call   <volTriangle2D@plt>
  movsd  -0x70(%rbp),%xmm1
  addsd  %xmm1,%xmm0
  movsd  %xmm0,-0x70(%rbp)
  mov    -0x98(%rbp),%eax
  imul   -0x8c(%rbp),%eax
  mov    %eax,%edx
  mov    -0x9c(%rbp),%eax
  add    %edx,%eax
  mov    %eax,-0x74(%rbp)
  mov    -0x74(%rbp),%eax
  cltq
  lea    0x0(,%rax,8),%rdx
  mov    -0xa8(%rbp),%rax
  add    %rdx,%rax
  movsd  -0x70(%rbp),%xmm0
  movsd  %xmm0,(%rax)
  addl   $0x1,-0x98(%rbp)
L34:
  mov    -0x98(%rbp),%eax
  cmp    -0x88(%rbp),%eax
  jl     L47
  addl   $0x1,-0x9c(%rbp)
L56:
  mov    -0x9c(%rbp),%eax
  cmp    -0x8c(%rbp),%eax
  jl     L66
  nop
  mov    -0x8(%rbp),%rax
  sub    %fs:0x28,%rax
  je     L67
  call   <__stack_chk_fail@plt>
L67:
  leave
  ret
```

tool_calls: name: extract_symbolic_data
arguments: label: D6
data_type: f64

tool: D6: 0.25

assistant: ```c
void Jac2D(double *volu, const double *yc, const double *m, const int n) {
  double yA[2], yB[2], yC[2], yD[2], yM[2], vol;
  int i1, i2, r, id, idn, comp;
  const int m1 = m[0], m2 = m[1];
  const int nn = (m1 + 1) * (m2 + 1);
  const int inc_x = 1;
  const int inc_y = m1 + 1;
  const double *ptr;
#pragma omp parallel for default(shared) private(ptr, i1, i2, r, id, idn, comp, vol, yA, yB, yC, yD, yM)
  for (i1 = 0; i1 < m1; i1++) {
    for (i2 = 0; i2 < m2; i2++) {
      comp = 0;
      idn = i1 + i2 * inc_y;
      for (r = 0; r < 2; r++) {
        ptr = yc + idn + comp;
        yA[r] = *ptr;
        ptr = ptr + inc_x;
        yB[r] = *ptr;
        ptr = ptr + inc_y;
        yD[r] = *ptr;
        ptr = ptr - inc_x;
        yC[r] = *ptr;
        yM[r] = 0.25 * (yA[r] + yB[r] + yC[r] + yD[r]);
        comp += nn;
      }
      vol = volTriangle2D(yA, yB, yM);
      vol += volTriangle2D(yB, yD, yM);
      vol += volTriangle2D(yD, yC, yM);
      vol += volTriangle2D(yC, yA, yM);
      id = i1 + i2 * m1;
      volu[id] = vol;
    }
  }
  return;
}
```