user: 请从给定的汇编指令推导出C源代码:

```asm
<corrc_precise>:
  endbr64
  sub    $0x18,%rsp
  test   %ecx,%ecx
  jle    L166
  test   %edx,%edx
  jle    L169
  lea    -0x1(%rdx),%eax
  cmp    $0x2,%eax
  jbe    L68
  mov    %edx,%ecx
  pxor   %xmm8,%xmm8
  mov    %rsi,%rax
  shr    $0x2,%ecx
  movaps %xmm8,%xmm4
  sub    $0x1,%ecx
  shl    $0x4,%rcx
  lea    0x10(%rsi,%rcx,1),%rcx
  nopl   0x0(%rax)
L159:
  movups (%rax),%xmm1
  add    $0x10,%rax
  addss  %xmm1,%xmm4
  movaps %xmm1,%xmm2
  shufps $0x55,%xmm1,%xmm2
  addss  %xmm2,%xmm4
  movaps %xmm1,%xmm2
  unpckhps %xmm1,%xmm2
  shufps $0xff,%xmm1,%xmm1
  addss  %xmm2,%xmm4
  addss  %xmm1,%xmm4
  cmp    %rax,%rcx
  jne    L159
  mov    %edx,%eax
  and    $0xfffffffc,%eax
  test   $0x3,%dl
  je     L87
L31:
  movslq %eax,%rcx
  addss  (%rsi,%rcx,4),%xmm4
  lea    0x0(,%rcx,4),%r8
  lea    0x1(%rax),%ecx
  cmp    %edx,%ecx
  jge    L87
  add    $0x2,%eax
  addss  0x4(%rsi,%r8,1),%xmm4
  cmp    %edx,%eax
  jge    L87
  addss  0x8(%rsi,%r8,1),%xmm4
L87:
  pxor   %xmm1,%xmm1
  cvtsi2ss %edx,%xmm1
  divss  %xmm1,%xmm4
  test   %edx,%edx
  jle    L33
L7:
  lea    -0x1(%rdx),%eax
  cmp    $0x2,%eax
  jbe    L112
  mov    %edx,%ecx
  movaps %xmm4,%xmm5
  movaps %xmm8,%xmm6
  xor    %eax,%eax
  shr    $0x2,%ecx
  movaps %xmm8,%xmm3
  shufps $0x0,%xmm5,%xmm5
  shl    $0x4,%rcx
  nopl   (%rax)
L81:
  movups (%rsi,%rax,1),%xmm1
  movups (%rdi,%rax,1),%xmm2
  add    $0x10,%rax
  subps  %xmm5,%xmm1
  mulps  %xmm1,%xmm2
  mulps  %xmm1,%xmm1
  movaps %xmm2,%xmm7
  addss  %xmm3,%xmm7
  movaps %xmm2,%xmm3
  shufps $0x55,%xmm2,%xmm3
  addss  %xmm7,%xmm3
  movaps %xmm2,%xmm7
  unpckhps %xmm2,%xmm7
  shufps $0xff,%xmm2,%xmm2
  addss  %xmm7,%xmm3
  addss  %xmm2,%xmm3
  movaps %xmm1,%xmm2
  addss  %xmm6,%xmm2
  movaps %xmm1,%xmm6
  shufps $0x55,%xmm1,%xmm6
  addss  %xmm6,%xmm2
  movaps %xmm1,%xmm6
  unpckhps %xmm1,%xmm6
  shufps $0xff,%xmm1,%xmm1
  addss  %xmm6,%xmm2
  movaps %xmm2,%xmm6
  addss  %xmm1,%xmm6
  cmp    %rcx,%rax
  jne    L81
  mov    %edx,%ecx
  and    $0xfffffffc,%ecx
  mov    %ecx,%eax
  cmp    %edx,%ecx
  je     L137
L146:
  sub    %ecx,%edx
  cmp    $0x1,%edx
  je     L144
  movq   (%rsi,%rcx,4),%xmm1
  movaps %xmm4,%xmm2
  shufps $0xe0,%xmm2,%xmm2
  subps  %xmm2,%xmm1
  movq   (%rdi,%rcx,4),%xmm2
  mov    %edx,%ecx
  and    $0xfffffffe,%ecx
  add    %ecx,%eax
  mulps  %xmm1,%xmm2
  mulps  %xmm1,%xmm1
  addss  %xmm2,%xmm3
  shufps $0xe5,%xmm2,%xmm2
  addss  %xmm2,%xmm3
  movaps %xmm1,%xmm2
  shufps $0xe5,%xmm1,%xmm1
  addss  %xmm6,%xmm2
  movaps %xmm1,%xmm6
  addss  %xmm2,%xmm6
  cmp    %ecx,%edx
  je     L137
L144:
  cltq
  movss  (%rsi,%rax,4),%xmm1
  movss  (%rdi,%rax,4),%xmm2
  subss  %xmm4,%xmm1
  mulss  %xmm1,%xmm2
  mulss  %xmm1,%xmm1
  addss  %xmm2,%xmm3
  addss  %xmm1,%xmm6
L137:
  mulss  %xmm6,%xmm0
  movss  %xmm8,0x8(%rsp)
  movss  %xmm3,0xc(%rsp)
  call   <sqrt@plt>
  comiss D7(%rip),%xmm0
  movss  0x8(%rsp),%xmm8
  jbe    L103
  movss  0xc(%rsp),%xmm3
  divss  %xmm0,%xmm3
  movaps %xmm3,%xmm8
L103:
  movaps %xmm8,%xmm0
  add    $0x18,%rsp
  ret
  nop
L166:
  pxor   %xmm8,%xmm8
  movaps %xmm8,%xmm4
  test   %edx,%edx
  jg     L7
L33:
  movaps %xmm8,%xmm6
  movaps %xmm8,%xmm3
  jmp    L137
L68:
  pxor   %xmm8,%xmm8
  xor    %eax,%eax
  movaps %xmm8,%xmm4
  jmp    L31
L112:
  xor    %ecx,%ecx
  movaps %xmm8,%xmm6
  movaps %xmm8,%xmm3
  xor    %eax,%eax
  jmp    L146
L169:
  pxor   %xmm8,%xmm8
  movaps %xmm8,%xmm4
  jmp    L87
```

tool_calls: name: parse_data
arguments: data_label: D7
type_guessed: byte[4]

tool: {"D7": [0xbd,0x37,0x86,0x35]}

assistant: ```c
float corrc_precise(float *templates, float sum_square_template, float *data, int n_samples_template, int normalize) {
  int i;
  float numerator = 0, sum_square_data = 0, denominator = 0, cc = 0, mean = 0, sample;
  if (normalize > 0) {
    for (i = 0; i < n_samples_template; i++) {
      mean += data[i];
    }
    mean /= n_samples_template;
  }
  for (i = 0; i < n_samples_template; i++) {
    sample = data[i] - mean;
    numerator += templates[i] * sample;
    sum_square_data += sample * sample;
  }
  denominator = sqrt(sum_square_template * sum_square_data);
  if (denominator > 0.000001f) {
    cc = numerator / denominator;
  }
  return cc;
}
```