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

```asm
<cledirh_gordan>:
  endbr64
  push   %r15
  mov    %edx,%eax
  push   %r14
  mov    %ecx,%r14d
  push   %r13
  mov    %edi,%r13d
  push   %r12
  push   %rbp
  mov    %edx,%ebp
  push   %rbx
  mov    %esi,%ebx
  sub    $0x68,%rsp
  cmp    %edx,%esi
  cmovle %esi,%eax
  movl   $0xffffffff,0x10(%rsp)
  cmp    %edi,%eax
  jg     L88
  cmp    %esi,%edi
  mov    %esi,%eax
  cmovle %edi,%eax
  cmp    %eax,%edx
  jge    L138
  lea    (%rcx,%r8,1),%eax
  movl   $0x1,0x10(%rsp)
  mov    %edi,%ebx
  mov    %esi,%ebp
  neg    %eax
  mov    %ecx,%r8d
  mov    %edx,%r13d
  mov    %eax,%r14d
L88:
  lea    (%rbx,%rbp,1),%ecx
  lea    (%rbx,%r13,1),%eax
  mov    %ecx,%edx
  lea    0x0(%r13,%rbp,1),%ecx
  mov    %eax,0x14(%rsp)
  sub    %ebp,%eax
  mov    %ecx,%edi
  sub    %r13d,%edx
  sub    %ebx,%edi
  cmp    $0xffffffff,%eax
  mov    %edx,0x18(%rsp)
  setl   %cl
  cmp    $0xffffffff,%edx
  mov    %edi,0x1c(%rsp)
  setl   %sil
  or     %sil,%cl
  jne    L7
  cmp    $0xffffffff,%edi
  jl     L7
  mov    %r8d,%ecx
  pxor   %xmm0,%xmm0
  neg    %ecx
  cmovs  %r8d,%ecx
  cmp    %ebx,%ecx
  jg     L129
  mov    %r14d,%ecx
  neg    %ecx
  cmovs  %r14d,%ecx
  cmp    %r13d,%ecx
  jg     L129
  lea    (%r8,%r14,1),%esi
  mov    %esi,%ecx
  neg    %ecx
  cmovs  %esi,%ecx
  cmp    %ebp,%ecx
  jg     L129
  mov    %eax,%ecx
  shr    $0x1f,%ecx
  add    %eax,%ecx
  sar    %ecx
  mov    %ecx,%r15d
  mov    %ecx,0x3c(%rsp)
  mov    %ebx,%ecx
  sub    %ebp,%ecx
  add    %r14d,%ecx
  mov    %ecx,%esi
  shr    $0x1f,%esi
  add    %esi,%ecx
  mov    %ecx,%edx
  mov    %r13d,%ecx
  sub    %ebp,%ecx
  sar    %edx
  sub    %r8d,%ecx
  mov    %ecx,%esi
  shr    $0x1f,%esi
  add    %esi,%ecx
  mov    %ebx,%esi
  sar    %ecx
  sub    %r8d,%esi
  mov    %ecx,%r10d
  mov    %ecx,0x38(%rsp)
  mov    %esi,%ecx
  shr    $0x1f,%ecx
  mov    %r10d,%r9d
  add    %esi,%ecx
  sar    %ecx
  mov    %ecx,%r12d
  mov    %ecx,0x20(%rsp)
  lea    0x0(%r13,%r14,1),%ecx
  mov    %ecx,%esi
  shr    $0x1f,%esi
  add    %ecx,%esi
  sar    %esi
  cmp    %r10d,%edx
  cmovge %edx,%r9d
  mov    %esi,%r11d
  mov    %esi,0x40(%rsp)
  xor    %esi,%esi
  test   %r9d,%r9d
  cmovs  %esi,%r9d
  cmp    %r11d,%r12d
  mov    %r11d,%esi
  cmovle %r12d,%esi
  cmp    %r15d,%esi
  cmovg  %r15d,%esi
  mov    %esi,0x24(%rsp)
  cmp    %esi,%r9d
  jg     L129
  mov    %r13d,%esi
  sub    %r14d,%esi
  mov    %esi,0x44(%rsp)
  cmp    $0x259,%eax
  jg     L113
  cmp    $0x259,%edi
  jg     L113
  cmp    $0x259,%ecx
  jg     L113
  cmp    $0x259,%esi
  jle    L94
L113:
  lea    D16(%rip),%rdi
  mov    %edx,0x28(%rsp)
  mov    %r8d,0x8(%rsp)
  mov    %r9d,(%rsp)
  call   <printf@plt>
  mov    $0x1,%edi
  call   <exit@plt>
  mov    0x28(%rsp),%edx
  mov    0x8(%rsp),%r8d
  mov    (%rsp),%r9d
L94:
  mov    0x40(%rsp),%edi
  lea    D57(%rip),%rsi
  mov    %r9d,%eax
  mov    %ebp,%ecx
  and    $0x1,%eax
  mov    $0x1,%r10d
  sar    %ecx
  mov    0x20(%rsp),%r15d
  sub    %r9d,%edi
  add    %eax,%eax
  mov    %ebx,%r11d
  mov    %ecx,0x48(%rsp)
  movslq %edi,%rdi
  sub    %eax,%r10d
  movslq %r9d,%rax
  mov    %r8d,0x5c(%rsp)
  lea    (%rsi,%rdi,8),%r12
  mov    %r9d,%esi
  sub    %r9d,%r15d
  sar    %r11d
  sub    %edx,%esi
  lea    D57(%rip),%rdx
  pxor   %xmm2,%xmm2
  mov    %ebx,0x50(%rsp)
  movslq %esi,%rsi
  mov    %r13d,0x4c(%rsp)
  mov    %r11d,%ebx
  mov    %r10d,%r13d
  sub    %rax,%rsi
  mov    %ebp,0x54(%rsp)
  mov    %ecx,%ebp
  lea    (%rdx,%rsi,8),%rdx
  mov    %r14d,0x58(%rsp)
  mov    %r15d,%r14d
  mov    %rax,%r15
  mov    %rdx,0x28(%rsp)
  mov    0x3c(%rsp),%edx
  movsd  %xmm2,(%rsp)
  sub    %r9d,%edx
  movslq %edx,%rdx
  sub    %rdi,%rdx
  mov    %rdx,0x30(%rsp)
  nopl   (%rax)
L155:
  mov    %r14d,%edi
  mov    %ebx,%esi
  call   <fac_ratio@plt>
  mov    0x20(%rsp),%edi
  sub    0x38(%rsp),%edi
  mov    %ebp,%esi
  sub    %r14d,%edi
  divsd  (%r12),%xmm0
  movsd  %xmm0,0x8(%rsp)
  sub    $0x1,%r14d
  call   <fac_ratio@plt>
  mov    0x30(%rsp),%rax
  movapd %xmm0,%xmm1
  pxor   %xmm0,%xmm0
  cvtsi2sd %r13d,%xmm0
  divsd  (%r12,%rax,8),%xmm0
  neg    %r13d
  lea    D57(%rip),%rax
  divsd  (%rax,%r15,8),%xmm0
  mov    0x28(%rsp),%rax
  sub    $0x8,%r12
  divsd  (%rax,%r15,8),%xmm1
  mulsd  0x8(%rsp),%xmm1
  add    $0x1,%r15
  mulsd  %xmm1,%xmm0
  addsd  (%rsp),%xmm0
  movsd  %xmm0,(%rsp)
  cmp    %r15d,0x24(%rsp)
  jge    L155
  mov    %ebx,%r11d
  mov    0x5c(%rsp),%r8d
  mov    0x50(%rsp),%ebx
  mov    %r11d,%edi
  mov    %r11d,0x24(%rsp)
  mov    0x54(%rsp),%ebp
  add    %r8d,%ebx
  mov    %r8d,0x38(%rsp)
  mov    0x58(%rsp),%r14d
  mov    %ebx,%esi
  mov    0x4c(%rsp),%r13d
  shr    $0x1f,%esi
  add    %ebx,%esi
  sar    %esi
  call   <fac_ratio@plt>
  mov    0x20(%rsp),%esi
  mov    0x24(%rsp),%edi
  movsd  %xmm0,0x8(%rsp)
  call   <fac_ratio@plt>
  mov    0x18(%rsp),%eax
  movsd  0x8(%rsp),%xmm6
  mulsd  %xmm0,%xmm6
  mov    %eax,%esi
  shr    $0x1f,%esi
  add    %eax,%esi
  mov    0x14(%rsp),%eax
  sar    %esi
  add    %ebp,%eax
  mov    %eax,%edi
  movsd  %xmm6,0x8(%rsp)
  shr    $0x1f,%edi
  add    %eax,%edi
  sar    %edi
  add    $0x1,%edi
  call   <fac_ratio@plt>
  mov    0x38(%rsp),%r8d
  mulsd  0x8(%rsp),%xmm0
  mov    0x48(%rsp),%ebx
  lea    0x0(%rbp,%r8,1),%eax
  mov    %r8d,0x14(%rsp)
  add    %r14d,%eax
  mov    %ebx,%edi
  mov    %eax,%esi
  shr    $0x1f,%esi
  movsd  %xmm0,0x8(%rsp)
  add    %eax,%esi
  sar    %esi
  call   <fac_ratio@plt>
  mov    0x14(%rsp),%r8d
  mov    %ebp,%eax
  mov    %ebx,%edi
  movsd  0x8(%rsp),%xmm3
  lea    D57(%rip),%rbx
  sub    %r8d,%eax
  mulsd  %xmm0,%xmm3
  sub    %r14d,%eax
  mov    %eax,%esi
  shr    $0x1f,%esi
  add    %eax,%esi
  sar    %esi
  movsd  %xmm3,0x8(%rsp)
  call   <fac_ratio@plt>
  mov    0x44(%rsp),%edx
  movslq 0x40(%rsp),%rax
  pxor   %xmm1,%xmm1
  mulsd  0x8(%rsp),%xmm0
  mulsd  (%rbx,%rax,8),%xmm0
  mov    %edx,%eax
  shr    $0x1f,%eax
  add    %edx,%eax
  mov    0x1c(%rsp),%edx
  sar    %eax
  cltq
  mulsd  (%rbx,%rax,8),%xmm0
  movslq 0x3c(%rsp),%rax
  mulsd  (%rbx,%rax,8),%xmm0
  mov    %edx,%eax
  shr    $0x1f,%eax
  add    %edx,%eax
  sar    %eax
  cltq
  mulsd  (%rbx,%rax,8),%xmm0
  lea    0x1(%rbp),%eax
  cvtsi2sd %eax,%xmm1
  mulsd  %xmm1,%xmm0
  cvttsd2si %xmm0,%edi
  call   <sqrt@plt>
  pxor   %xmm0,%xmm0
  cmpl   $0xffffffff,0x10(%rsp)
  cvtsi2sd %eax,%xmm0
  mulsd  (%rsp),%xmm0
  je     L123
  cmpl   $0x1,0x10(%rsp)
  jne    L129
  pxor   %xmm1,%xmm1
  pxor   %xmm2,%xmm2
  movsd  %xmm0,(%rsp)
  movsd  D52(%rip),%xmm3
  cvtsi2sd %r13d,%xmm1
  cvtsi2sd %ebp,%xmm2
  addsd  %xmm3,%xmm1
  addsd  %xmm3,%xmm2
  divsd  %xmm2,%xmm1
  cvttsd2si %xmm1,%edi
  call   <sqrt@plt>
  pxor   %xmm1,%xmm1
  movsd  (%rsp),%xmm0
  mov    %eax,%r8d
  mov    0x20(%rsp),%eax
  mov    %eax,%edx
  neg    %edx
  cmovs  %eax,%edx
  mov    0x10(%rsp),%eax
  and    $0x1,%edx
  add    %edx,%edx
  sub    %edx,%eax
  imul   %r8d,%eax
  cvtsi2sd %eax,%xmm1
  mulsd  %xmm1,%xmm0
  jmp    L129
  nopw   0x0(%rax,%rax,1)
L7:
  pxor   %xmm0,%xmm0
L129:
  add    $0x68,%rsp
  pop    %rbx
  pop    %rbp
  pop    %r12
  pop    %r13
  pop    %r14
  pop    %r15
  ret
  nopl   0x0(%rax,%rax,1)
L138:
  mov    %r8d,%eax
  movl   $0x0,0x10(%rsp)
  mov    %ecx,%r8d
  mov    %edi,%ebx
  mov    %eax,%r14d
  mov    %esi,%r13d
  jmp    L88
  nopl   0x0(%rax,%rax,1)
L123:
  mov    0x3c(%rsp),%eax
  mov    $0x1,%edx
  pxor   %xmm1,%xmm1
  and    $0x1,%eax
  add    %eax,%eax
  sub    %eax,%edx
  cvtsi2sd %edx,%xmm1
  mulsd  %xmm1,%xmm0
  jmp    L129
```

tool_calls: name: extract_symbolic_data
arguments: data_label: D16
type_infered: string
name: extract_symbolic_data
arguments: data_label: D57
type_infered: f64
name: extract_symbolic_data
arguments: data_label: D52
type_infered: f64

tool: D16: 

Termination from VCC. - too large factorials


tool: D57: 1

tool: D52: 1

assistant: ```c
double cledirh_gordan(int j1, int j2, int j3, int m1, int m2) {
  static double fac[150] = {.1000000000000000E+01, .3162277660168379E-01, .2000000000000000E-02, .1897366596101028E-03, .2400000000000000E-04, .3794733192202056E-05, .7200000000000002E-06, .1593787940724864E-06, .4032000000000001E-07, .1147527317321902E-07, .3628800000000002E-08, .1262280049054092E-08, .4790016000000003E-09, .1969156876524384E-09, .8717829120000006E-10, .4135229440701207E-10, .2092278988800002E-10, .1124782407870728E-10, .6402373705728006E-11, .3846755834917892E-11, .2432902008176642E-11, .1615637450665515E-11, .1124000727777609E-11, .8175125500367506E-12, .6204484017332402E-12, .4905075300220504E-12, .4032914611266062E-12, .3443362860754794E-12, .3048883446117143E-12, .2796010642932893E-12, .2652528598121915E-12, .2600289897927591E-12, .2631308369336940E-12, .2745906132211536E-12, .2952327990396046E-12, .3267628297331728E-12, .3719933267899019E-12, .4352480892045862E-12, .5230226174666021E-12, .6450376682011969E-12, .8159152832478993E-12, .1057861775849963E-11, .1405006117752883E-11, .1910498367185033E-11, .2658271574788455E-11, .3782786767026367E-11, .5502622159812102E-11, .8178384990311005E-11, .1241391559253610E-10, .1923556149721149E-10, .3041409320171346E-10, .4905068181788930E-10, .8065817517094409E-10, .1351836790901029E-09, .2308436973392420E-09, .4014955268976057E-09, .7109985878048654E-09, .1281573721857157E-08, .2350561331282885E-08, .4385545276195193E-08, .8320987112741415E-08, .1605109571087441E-07, .3146997326038803E-07, .6269557984667544E-07, .1268869321858846E-06, .2608136121621699E-06, .5443449390774448E-06, .1153317792981115E-05, .2480035542436839E-05, .5411367084667394E-05, .1197857166996993E-04, .2689449441079695E-04, .6123445837688631E-04, .1413574626231488E-03, .3307885441519399E-03, .7845339175584759E-03, .1885494701666058E-02, .4591092485552201E-02, .1132428117820634E-01, .2829031189597267E-01, .7156945704626409E-01, .1833212210859029E+00, .4753643337012861E+00, .1247684230710655E+01, .3314240134565367E+01, .8908465407274079E+01, .2422709538367284E+02, .6665313817722467E+02, .1854826422573992E+03, .5220273782040236E+03, .1485715964481768E+04, .4275404227490954E+04, .1243841405464136E+05, .3658035857041260E+05, .1087366156656748E+06, .3266626020337846E+06, .9916779348709544E+06, .3041882150138602E+07, .9426890448883294E+07, .2951234062064472E+08, .9332621544394462E+08, .2980746402685117E+09, .9614466715035176E+09, .3131572170660985E+10, .1029901674514568E+11, .3419676810361796E+11, .1146280563734714E+12, .3878597438312349E+12, .1324641819451836E+13, .4565884904381298E+13, .1588245541522752E+14, .5574945468249565E+14, .1974506857221085E+15, .7055650984616650E+15, .2543559733472202E+16, .9249958440832429E+16, .3393108684451918E+17, .1255404359589777E+18, .4684525849754318E+18, .1762838801735966E+19, .6689502913449167E+19, .2559641940120622E+20, .9875044200833661E+20, .3840998695345006E+21, .1506141741511150E+22, .5953547977784760E+22, .2372173242880062E+23, .9526867474051174E+23, .3856204823625829E+24, .1573076357315330E+25, .6466855489220516E+25, .2678949036508007E+26, .1118248651196012E+27, .4703162928493458E+27, .1992942746161532E+28, .8508021737644667E+28, .3659042881952573E+29, .1585214610157954E+30, .6917786472619537E+30, .3040758665204989E+31, .1346201247571762E+32, .6002457605114648E+32, .2695364137888182E+33, .1218859041294581E+34, .5550293832739345E+34, .2544977678223085E+35, .1174997204390920E+36, .5462031093002385E+36, .2556323917872885E+37, .1204487096628886E+38};
  double value;
  int temp, change;
  int jz1, jz2, jz3, jt1, jt2, jt3, jt4, jt5, j4, j5;
  int loop_min, loop_max, phase, loop;
  double factor;
  value = 0.0;
  if ((j1 < j2) && (j1 < j3)) {
    temp = j1;
    j1 = j2;
    j2 = temp;
    temp = m1;
    m1 = m2;
    m2 = temp;
    change = -1;
  } else if ((j3 < j1) && (j3 < j2)) {
    temp = j2;
    j2 = j3;
    j3 = temp;
    m2 = -(m1 + m2);
    change = 1;
  } else
    change = 0;
  jz1 = (j1 + j2 - j3) / 2;
  jz2 = (j1 + j3 - j2) / 2;
  jz3 = (j2 + j3 - j1) / 2;
  if ((jz1 < 0) || (jz2 < 0) || (jz3 < 0))
    return value;
  if ((j1 < abs(m1)) || (j2 < abs(m2)) || (j3 < abs(m1 + m2)))
    return value;
  jt1 = (j1 - j3 + m2) / 2;
  jt2 = (j2 - j3 - m1) / 2;
  jt3 = (j1 - m1) / 2;
  jt4 = (j2 + m2) / 2;
  jt5 = (j2 - m2) / 2;
  j4 = j1 / 2;
  j5 = j3 / 2;
  loop_min = ((((((jt1) > (jt2)) ? (jt1) : (jt2))) > (0)) ? ((((jt1) > (jt2)) ? (jt1) : (jt2))) : (0));
  loop_max = ((((((jt3) < (jt4)) ? (jt3) : (jt4))) < (jz1)) ? ((((jt3) < (jt4)) ? (jt3) : (jt4))) : (jz1));
  if (loop_min > loop_max)
    return value;
  if ((jz1 > 300) || (jz3 > 300) || (jt4 > 300) || (jt5 > 300)) {
    printf("\n\nTermination from VCC. - too large factorials\n");
    exit(1);
  }
  for (loop = loop_min, phase = (1 - 2 * (abs(loop_min) % 2)); loop <= loop_max; phase *= -1, loop++) {
    value += (fac_ratio(jt3 - loop, j4) / fac[jt4 - loop]) * (fac_ratio(loop - jt2, j5) / fac[loop - jt1]) * ((phase / fac[jz1 - loop]) / fac[loop]);
  }
  factor = fac_ratio(j4, (j1 + m1) / 2) * fac_ratio(j4, jt3) * fac_ratio((j1 + j2 + j3) / 2 + 1, jz2) * fac_ratio(j5, (j3 + m1 + m2) / 2) * fac_ratio(j5, (j3 - m1 - m2) / 2) * fac[jt4] * fac[jt5] * fac[jz1] * fac[jz3] * (j3 + 1);
  value *= sqrt(factor);
  if (change == -1)
    value *= (1 - 2 * (abs(jz1) % 2));
  else if (change == 1)
    value *= (1 - 2 * (abs(jt3) % 2)) * sqrt((j2 + 1.0) / (j3 + 1.0));
  return (value);
}
```