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

```asm
<blur_matrix>:
  endbr64
  mov    %edx,%eax
  push   %r15
  imul   %ecx,%eax
  push   %r14
  push   %r13
  push   %r12
  push   %rbp
  shl    $0x3,%eax
  mov    %ecx,%ebp
  push   %rbx
  mov    %rsi,%rbx
  sub    $0x28,%rsp
  mov    %eax,0x1c(%rsp)
  lea    -0x1(%rdx),%eax
  mov    %rdi,0x10(%rsp)
  mov    %eax,0x8(%rsp)
  cmp    %rsi,%rdi
  je     L74
  mov    0x1c(%rsp),%edx
  mov    (%rsi),%rsi
  mov    %rdi,%r12
  mov    (%rdi),%rdi
  call   <memcpy@plt>
  cmpl   $0x1,0x8(%rsp)
  jle    L37
L118:
  cmp    $0x2,%ebp
  jle    L41
  lea    -0x2(%rbp),%edi
  lea    -0x3(%rbp),%r14d
  movapd D5(%rip),%xmm6
  movapd D36(%rip),%xmm5
  mov    %edi,%eax
  mov    %edi,0x18(%rsp)
  movapd D32(%rip),%xmm4
  mov    $0x1,%r11d
  shr    %eax
  movsd  D5(%rip),%xmm1
  add    $0x2,%r14
  movsd  D36(%rip),%xmm3
  lea    -0x1(%rax),%r13d
  mov    %edi,%eax
  or     $0x1,%edi
  movsd  D32(%rip),%xmm2
  and    $0xfffffffe,%eax
  movslq %edi,%rdi
  add    $0x1,%r13
  mov    %eax,0xc(%rsp)
  shl    $0x3,%rdi
  shl    $0x4,%r13
  lea    0x8(%rdi),%r10
  lea    -0x8(%rdi),%r9
  xchg   %ax,%ax
L104:
  mov    (%r12,%r11,8),%r8
  mov    0x8(%rbx,%r11,8),%rcx
  mov    (%rbx,%r11,8),%rdx
  mov    -0x8(%rbx,%r11,8),%rsi
  mov    %r8,%rax
  sub    %rcx,%rax
  cmp    $0x10,%rax
  mov    %r8,%rax
  seta   %r15b
  sub    %rdx,%rax
  cmp    $0x10,%rax
  seta   %al
  and    %r15d,%eax
  cmp    $0x3,%ebp
  setne  %r15b
  test   %r15b,%al
  je     L116
  mov    %r8,%r15
  xor    %eax,%eax
  sub    %rsi,%r15
  cmp    $0x10,%r15
  jbe    L116
  nopw   0x0(%rax,%rax,1)
L75:
  movupd 0x8(%rsi,%rax,1),%xmm7
  movupd 0x8(%rcx,%rax,1),%xmm0
  movupd (%rcx,%rax,1),%xmm10
  movupd 0x10(%rsi,%rax,1),%xmm11
  addpd  %xmm7,%xmm0
  movupd 0x10(%rdx,%rax,1),%xmm7
  movupd (%rsi,%rax,1),%xmm12
  addpd  %xmm7,%xmm0
  movupd (%rdx,%rax,1),%xmm7
  addpd  %xmm7,%xmm0
  movupd 0x8(%rdx,%rax,1),%xmm7
  mulpd  %xmm5,%xmm7
  mulpd  %xmm6,%xmm0
  addpd  %xmm7,%xmm0
  movupd 0x10(%rcx,%rax,1),%xmm7
  addpd  %xmm10,%xmm7
  addpd  %xmm11,%xmm7
  addpd  %xmm12,%xmm7
  mulpd  %xmm4,%xmm7
  addpd  %xmm7,%xmm0
  movups %xmm0,0x8(%r8,%rax,1)
  add    $0x10,%rax
  cmp    %r13,%rax
  jne    L75
  mov    0x18(%rsp),%r15d
  cmp    %r15d,0xc(%rsp)
  je     L80
  movsd  (%rsi,%rdi,1),%xmm0
  addsd  (%rcx,%rdi,1),%xmm0
  addsd  (%rdx,%r10,1),%xmm0
  addsd  (%rdx,%r9,1),%xmm0
  movsd  (%rdx,%rdi,1),%xmm7
  mulsd  %xmm1,%xmm0
  mulsd  %xmm3,%xmm7
  addsd  %xmm7,%xmm0
  movsd  (%rcx,%r9,1),%xmm7
  addsd  (%rcx,%r10,1),%xmm7
  addsd  (%rsi,%r10,1),%xmm7
  addsd  (%rsi,%r9,1),%xmm7
  mulsd  %xmm2,%xmm7
  addsd  %xmm7,%xmm0
  movsd  %xmm0,(%r8,%rdi,1)
L80:
  add    $0x1,%r11
  cmp    %r11d,0x8(%rsp)
  jg     L104
L41:
  cmp    %rbx,0x10(%rsp)
  je     L103
L37:
  add    $0x28,%rsp
  pop    %rbx
  pop    %rbp
  pop    %r12
  pop    %r13
  pop    %r14
  pop    %r15
  ret
  xchg   %ax,%ax
L116:
  movsd  D36(%rip),%xmm9
  mov    $0x1,%eax
  movsd  D32(%rip),%xmm8
  nopw   0x0(%rax,%rax,1)
L21:
  movsd  (%rsi,%rax,8),%xmm0
  addsd  (%rcx,%rax,8),%xmm0
  addsd  0x8(%rdx,%rax,8),%xmm0
  addsd  -0x8(%rdx,%rax,8),%xmm0
  movsd  (%rdx,%rax,8),%xmm7
  mulsd  %xmm1,%xmm0
  mulsd  %xmm9,%xmm7
  addsd  %xmm7,%xmm0
  movsd  -0x8(%rcx,%rax,8),%xmm7
  addsd  0x8(%rcx,%rax,8),%xmm7
  addsd  0x8(%rsi,%rax,8),%xmm7
  addsd  -0x8(%rsi,%rax,8),%xmm7
  mulsd  %xmm8,%xmm7
  addsd  %xmm7,%xmm0
  movsd  %xmm0,(%r8,%rax,8)
  add    $0x1,%rax
  cmp    %rax,%r14
  jne    L21
  jmp    L80
L74:
  mov    %ecx,%esi
  mov    %edx,%edi
  call   <new_matrix2@plt>
  mov    0x1c(%rsp),%edx
  mov    %rax,%r12
  mov    0x10(%rsp),%rax
  mov    (%r12),%rdi
  mov    (%rax),%rsi
  call   <memcpy@plt>
  cmpl   $0x1,0x8(%rsp)
  jg     L118
L103:
  mov    0x10(%rsp),%rax
  mov    0x1c(%rsp),%edx
  mov    (%r12),%rsi
  mov    (%rax),%rdi
  call   <memcpy@plt>
  add    $0x28,%rsp
  mov    %r12,%rdi
  pop    %rbx
  pop    %rbp
  pop    %r12
  pop    %r13
  pop    %r14
  pop    %r15
  jmp    1080 <free_matrix2@plt>
```

tool_calls: name: disassemble_data
arguments: data_tag: D5
type_guessed: byte[16]
name: disassemble_data
arguments: data_tag: D36
type_guessed: byte[16]
name: disassemble_data
arguments: data_tag: D32
type_guessed: byte[16]

tool: {"D5": [0xf9,0xa0,0x67,0xb3,0xea,0x73,0xb5,0x3f,0xf9,0xa0,0x67,0xb3,0xea,0x73,0xb5,0x3f]}

tool: {"D36": [0xa8,0x35,0xcd,0x3b,0x4e,0xd1,0xe3,0x3f,0xa8,0x35,0xcd,0x3b,0x4e,0xd1,0xe3,0x3f]}

tool: {"D32": [0x4d,0xf3,0x8e,0x53,0x74,0x24,0x87,0x3f,0x4d,0xf3,0x8e,0x53,0x74,0x24,0x87,0x3f]}

assistant: ```c
void blur_matrix(double **dst, double **src, int n, int m) {
  double G[3] = {.6193, .0838, .0113};
  double **I = (dst == src ? new_matrix2(n, m) : dst);
  memcpy(I[0], src[0], n * m * sizeof(double));
  int i, j;
  for (i = 1; i < n - 1; i++)
    for (j = 1; j < m - 1; j++)
      I[i][j] = G[0] * src[i][j] + G[1] * (src[i + 1][j] + src[i - 1][j] + src[i][j + 1] + src[i][j - 1]) + G[2] * (src[i + 1][j + 1] + src[i + 1][j - 1] + src[i - 1][j + 1] + src[i - 1][j - 1]);
  if (dst == src) {
    memcpy(dst[0], I[0], n * m * sizeof(double));
    free_matrix2(I);
  }
}
```