user: Translate the below assembly code into C programming language:

```asm
<do_2D_filterF>:
  endbr64
  push   %r15
  sub    %r9d,%ecx
  push   %r14
  push   %r13
  push   %r12
  push   %rbp
  push   %rbx
  mov    %ecx,-0x1c(%rsp)
  test   %ecx,%ecx
  jle    L18
  mov    %edx,%r12d
  mov    %r9d,%eax
  sub    %r9d,%edx
  mov    %r8,%r14
  sar    %eax
  mov    %r12d,%ecx
  mov    %r9d,%r8d
  imul   %eax,%ecx
  test   %edx,%edx
  jle    L18
  cltq
  movslq %ecx,%rcx
  mov    %rdi,%r10
  mov    %rsi,%rdi
  add    %rcx,%rax
  mov    %r9d,%esi
  lea    -0x1(%r9),%r15d
  movslq %r12d,%rbx
  lea    (%rdi,%rax,4),%rax
  shr    $0x2,%esi
  movq   $0x0,-0x28(%rsp)
  movsd  D9(%rip),%xmm3
  mov    %rax,-0x38(%rsp)
  movslq %edx,%rax
  sub    $0x1,%esi
  movl   $0x0,-0x20(%rsp)
  add    $0x1,%rsi
  mov    %rax,-0x10(%rsp)
  shl    $0x4,%rsi
  mov    %rbx,-0x18(%rsp)
  mov    %r9d,%ebx
  and    $0xfffffffc,%ebx
L71:
  mov    -0x28(%rsp),%rdi
  mov    -0x10(%rsp),%rax
  add    %rdi,%rax
  mov    %rdi,%r13
  mov    %rax,-0x30(%rsp)
  nopl   0x0(%rax)
L76:
  movss  D5(%rip),%xmm0
  pxor   %xmm1,%xmm1
  xor    %edi,%edi
  test   %r8d,%r8d
  jle    L39
  nopw   0x0(%rax,%rax,1)
L97:
  mov    %r12d,%ecx
  movslq %edi,%rax
  imul   %edi,%ecx
  mov    (%r14,%rax,8),%rdx
  movslq %ecx,%rcx
  add    %r13,%rcx
  cmp    $0x2,%r15d
  jbe    L102
  lea    (%r10,%rcx,4),%r9
  xor    %eax,%eax
  nopl   0x0(%rax,%rax,1)
L23:
  movups (%r9,%rax,1),%xmm0
  movups (%rdx,%rax,1),%xmm4
  add    $0x10,%rax
  mulps  %xmm4,%xmm0
  addss  %xmm0,%xmm1
  movaps %xmm0,%xmm2
  shufps $0x55,%xmm0,%xmm2
  addss  %xmm1,%xmm2
  movaps %xmm0,%xmm1
  unpckhps %xmm0,%xmm1
  shufps $0xff,%xmm0,%xmm0
  addss  %xmm2,%xmm1
  addss  %xmm0,%xmm1
  cmp    %rsi,%rax
  jne    L23
  mov    %ebx,%eax
  cmp    %r8d,%ebx
  je     L20
L54:
  movslq %eax,%r11
  lea    (%r11,%rcx,1),%rbp
  lea    0x0(,%r11,4),%r9
  movss  (%r10,%rbp,4),%xmm0
  mulss  (%rdx,%r11,4),%xmm0
  lea    0x1(%rax),%r11d
  addss  %xmm0,%xmm1
  cmp    %r11d,%r8d
  jle    L20
  movslq %r11d,%r11
  add    $0x2,%eax
  add    %rcx,%r11
  movss  (%r10,%r11,4),%xmm0
  mulss  0x4(%rdx,%r9,1),%xmm0
  addss  %xmm0,%xmm1
  cmp    %eax,%r8d
  jle    L20
  cltq
  add    %rcx,%rax
  movss  (%r10,%rax,4),%xmm0
  mulss  0x8(%rdx,%r9,1),%xmm0
  addss  %xmm0,%xmm1
L20:
  add    $0x1,%edi
  cmp    %edi,%r8d
  jg     L97
  pxor   %xmm0,%xmm0
  cvtss2sd %xmm1,%xmm0
  mulsd  %xmm3,%xmm0
  addsd  %xmm3,%xmm0
  cvtsd2ss %xmm0,%xmm0
L39:
  mov    -0x38(%rsp),%rax
  movss  %xmm0,(%rax,%r13,4)
  add    $0x1,%r13
  cmp    %r13,-0x30(%rsp)
  jne    L76
  addl   $0x1,-0x20(%rsp)
  mov    -0x18(%rsp),%rdx
  mov    -0x20(%rsp),%eax
  add    %rdx,-0x28(%rsp)
  cmp    -0x1c(%rsp),%eax
  jne    L71
L18:
  pop    %rbx
  pop    %rbp
  pop    %r12
  pop    %r13
  pop    %r14
  pop    %r15
  ret
  nopl   0x0(%rax)
L102:
  xor    %eax,%eax
  jmp    L54
```

tool_calls: name: parse_data
arguments: label: D9
datatype: f64
name: parse_data
arguments: label: D5
datatype: byte[4]

tool: D9: 0.5

tool: {"D5": [0x00,0x00,0x00,0x3f]}

assistant: ```c
void do_2D_filterF(float *src, float *dst, int w, int h, float **fmask, int mw, float fnorm) {
  int i, j;
  int ii, jj;
  float sum;
  long offset;
  for (jj = 0; jj < h - mw; jj++) {
    for (ii = 0; ii < w - mw; ii++) {
      sum = 0;
      offset = (jj * w + ii);
      for (j = 0; j < mw; j++) {
        for (i = 0; i < mw; i++) {
          sum += fmask[j][i] * src[offset + j * w + i];
        }
      }
      dst[offset + w * (mw >> 1) + (mw >> 1)] = (0.5 * sum + 0.5);
    }
  }
  return;
}
```