user: Please show me the C implementation that matches the assembly code listed below:

```asm
<kendl2>:
  endbr64
  push   %r15
  movslq %esi,%rax
  mov    %rdi,%r11
  movslq %edx,%rdi
  push   %r14
  push   %r13
  push   %r12
  mov    %r8,%r12
  push   %rbp
  mov    %rcx,%rbp
  mov    %eax,%ecx
  push   %rbx
  imul   %edx,%ecx
  sub    $0x18,%rsp
  mov    (%r11,%rax,8),%rax
  mov    %r9,(%rsp)
  movss  (%rax,%rdi,4),%xmm5
  cmp    $0x1,%ecx
  jle    L56
  pxor   %xmm2,%xmm2
  movslq %ecx,%r8
  xor    %ebx,%ebx
  lea    -0x1(%r8),%r13
  movaps %xmm2,%xmm0
  movaps %xmm2,%xmm4
  movss  D3(%rip),%xmm6
  nopw   0x0(%rax,%rax,1)
L96:
  mov    %rbx,%rax
  add    $0x1,%rbx
  cqto
  idiv   %rdi
  mov    %rax,%r9
  mov    0x8(%r11,%rax,8),%rax
  mov    %rdx,%r10
  movss  0x4(%rax,%rdx,4),%xmm3
  addss  %xmm3,%xmm5
  cmp    %rbx,%r8
  jle    L7
  mov    %rbx,%rcx
  jmp    L6
  nopl   0x0(%rax,%rax,1)
L23:
  addss  %xmm1,%xmm2
  addss  %xmm1,%xmm0
  jg     L93
  xorps  %xmm6,%xmm1
L93:
  addss  %xmm1,%xmm4
L51:
  add    $0x1,%rcx
  cmp    %rcx,%r8
  je     L7
L6:
  mov    %rcx,%rax
  cqto
  idiv   %rdi
  mov    %rax,%r14
  mov    %rdx,%rsi
  mov    0x8(%r11,%rax,8),%rax
  sub    %r9,%r14
  sub    %r10,%rsi
  mov    %r14,%r15
  movss  0x4(%rax,%rdx,4),%xmm1
  imul   %rsi,%r15
  mulss  %xmm3,%xmm1
  test   %r15,%r15
  jne    L23
  test   %r14,%r14
  je     L36
  addss  %xmm1,%xmm2
L36:
  test   %rsi,%rsi
  je     L51
  add    $0x1,%rcx
  addss  %xmm1,%xmm0
  cmp    %rcx,%r8
  jne    L6
L7:
  cmp    %r13,%rbx
  jne    L96
  mulss  %xmm2,%xmm0
L43:
  movss  %xmm5,0xc(%rsp)
  movss  %xmm4,0x8(%rsp)
  call   <sqrt@plt>
  movss  0x8(%rsp),%xmm4
  movss  0xc(%rsp),%xmm5
  movsd  D5(%rip),%xmm1
  divss  %xmm0,%xmm4
  cvtss2sd %xmm5,%xmm5
  movsd  D12(%rip),%xmm0
  mulsd  %xmm5,%xmm1
  mulsd  %xmm5,%xmm0
  subsd  D37(%rip),%xmm5
  addsd  D59(%rip),%xmm0
  mulsd  %xmm5,%xmm1
  divsd  %xmm1,%xmm0
  movss  %xmm4,0x0(%rbp)
  movss  %xmm4,0x8(%rsp)
  cvtsd2ss %xmm0,%xmm0
  call   <sqrt@plt>
  movss  0x8(%rsp),%xmm4
  divss  %xmm0,%xmm4
  movss  %xmm4,(%r12)
  movaps %xmm4,%xmm0
  call   <fabs@plt>
  divsd  D14(%rip),%xmm0
  cvtsd2ss %xmm0,%xmm0
  call   <erfcc@plt>
  mov    (%rsp),%rax
  movss  %xmm0,(%rax)
  add    $0x18,%rsp
  pop    %rbx
  pop    %rbp
  pop    %r12
  pop    %r13
  pop    %r14
  pop    %r15
  ret
L56:
  pxor   %xmm0,%xmm0
  movaps %xmm0,%xmm4
  jmp    L43
```

tool_calls: name: retrieve_data
arguments: data_tag: D3
type_infered: byte[4]
name: retrieve_data
arguments: data_tag: D5
type_infered: f64
name: retrieve_data
arguments: data_tag: D12
type_infered: f64
name: retrieve_data
arguments: data_tag: D37
type_infered: f64
name: retrieve_data
arguments: data_tag: D59
type_infered: f64
name: retrieve_data
arguments: data_tag: D14
type_infered: f64

tool: {"D3": [0x00,0x00,0x00,0x80]}

tool: D5: 9

tool: D12: 4

tool: D37: 1

tool: D59: 10

tool: D14: 1.4142136

assistant: ```c
void kendl2(float **tab, int i, int j, float *tau, float *z, float *prob) {
  float erfcc(float x);
  long nn, mm, m2, m1, lj, li, l, kj, ki, k;
  float svar, s = 0.0, points, pairs, en2 = 0.0, en1 = 0.0;
  nn = i * j;
  points = tab[i][j];
  for (k = 0; k <= nn - 2; k++) {
    ki = (k / j);
    kj = k - j * ki;
    points += tab[ki + 1][kj + 1];
    for (l = k + 1; l <= nn - 1; l++) {
      li = l / j;
      lj = l - j * li;
      mm = (m1 = li - ki) * (m2 = lj - kj);
      pairs = tab[ki + 1][kj + 1] * tab[li + 1][lj + 1];
      if (mm) {
        en1 += pairs;
        en2 += pairs;
        s += (mm > 0 ? pairs : -pairs);
      } else {
        if (m1)
          en1 += pairs;
        if (m2)
          en2 += pairs;
      }
    }
  }
  *tau = s / sqrt(en1 * en2);
  svar = (4.0 * points + 10.0) / (9.0 * points * (points - 1.0));
  *z = (*tau) / sqrt(svar);
  *prob = erfcc(fabs(*z) / 1.4142136);
}
```