user: What is the c source code of the assembly code below:

```asm
<cledirh_gordan>:
  endbr64
  push   %r15
  push   %r14
  push   %r13
  push   %r12
  push   %rbp
  push   %rbx
  sub    $0x68,%rsp
  mov    %edi,%r12d
  mov    %esi,%ebx
  mov    %edx,%ebp
  mov    %ecx,0x18(%rsp)
  mov    %r8d,0x8(%rsp)
  cmp    %edx,%esi
  mov    %edx,%eax
  cmovle %esi,%eax
  movl   $0xffffffff,0x1c(%rsp)
  cmp    %edi,%eax
  jg     L56
  cmp    %esi,%edi
  mov    %esi,%eax
  cmovle %edi,%eax
  cmp    %eax,%edx
  jge    L78
  mov    %r8d,%eax
  add    %ecx,%eax
  mov    %ecx,0x8(%rsp)
  neg    %eax
  mov    %eax,0x18(%rsp)
  mov    %edi,%ebx
  mov    %edx,%r12d
  mov    %esi,%ebp
  movl   $0x1,0x1c(%rsp)
L56:
  lea    (%rbx,%r12,1),%eax
  mov    %eax,0x28(%rsp)
  mov    %eax,%edx
  sub    %ebp,%edx
  lea    (%rbx,%rbp,1),%eax
  sub    %r12d,%eax
  mov    %eax,%esi
  mov    %eax,0x2c(%rsp)
  lea    (%r12,%rbp,1),%eax
  mov    %eax,%edi
  sub    %ebx,%edi
  mov    %edi,0x30(%rsp)
  cmp    $0xffffffff,%edx
  setl   %al
  cmp    $0xffffffff,%esi
  setl   %cl
  or     %cl,%al
  jne    L97
  cmp    $0xffffffff,%edi
  jl     L97
  mov    0x8(%rsp),%esi
  mov    %esi,%eax
  neg    %eax
  cmovs  %esi,%eax
  mov    D50(%rip),%r13
  cmp    %ebx,%eax
  jg     L38
  mov    0x18(%rsp),%r9d
  mov    %r9d,%eax
  neg    %eax
  cmovs  %r9d,%eax
  cmp    %r12d,%eax
  jg     L38
  mov    %esi,%ecx
  add    %r9d,%ecx
  mov    %ecx,%eax
  neg    %eax
  cmovs  %ecx,%eax
  cmp    %ebp,%eax
  jg     L38
  mov    %edx,%eax
  shr    $0x1f,%eax
  add    %edx,%eax
  sar    %eax
  mov    %eax,%r14d
  mov    %eax,0x44(%rsp)
  mov    %ebx,%eax
  sub    %ebp,%eax
  add    %r9d,%eax
  mov    %eax,%ecx
  shr    $0x1f,%ecx
  add    %ecx,%eax
  sar    %eax
  mov    %eax,%r15d
  mov    %eax,0x10(%rsp)
  mov    %r12d,%eax
  sub    %ebp,%eax
  sub    %esi,%eax
  mov    %eax,%ecx
  shr    $0x1f,%ecx
  add    %ecx,%eax
  sar    %eax
  mov    %eax,%r10d
  mov    %eax,0x20(%rsp)
  mov    %ebx,%ecx
  sub    %esi,%ecx
  mov    %ecx,%eax
  shr    $0x1f,%eax
  add    %ecx,%eax
  sar    %eax
  mov    %eax,%r8d
  mov    %eax,0x48(%rsp)
  lea    (%r12,%r9,1),%ecx
  mov    %ecx,%eax
  shr    $0x1f,%eax
  add    %ecx,%eax
  sar    %eax
  mov    %eax,%r11d
  mov    %eax,0x4c(%rsp)
  cmp    %r10d,%r15d
  cmovge %r15d,%r10d
  test   %r10d,%r10d
  mov    $0x0,%eax
  cmovns %r10d,%eax
  mov    %eax,%r10d
  mov    %eax,%r15d
  mov    %r11d,%eax
  cmp    %r11d,%r8d
  cmovle %r8d,%eax
  cmp    %r14d,%eax
  cmovg  %r14d,%eax
  mov    %eax,0x3c(%rsp)
  cmp    %eax,%r10d
  jg     L38
  mov    %r12d,%eax
  sub    %r9d,%eax
  mov    %eax,0x50(%rsp)
  cmp    $0x259,%edx
  jg     L130
  cmp    $0x259,%edi
  jg     L130
  cmp    $0x259,%ecx
  jg     L130
  cmp    $0x259,%eax
  jle    L103
L130:
  lea    D23(%rip),%rdi
  call   <printf@plt>
  mov    $0x1,%edi
  call   <exit@plt>
L103:
  mov    %ebx,%eax
  shr    $0x1f,%eax
  add    %ebx,%eax
  sar    %eax
  mov    %eax,0x34(%rsp)
  mov    %ebp,%eax
  shr    $0x1f,%eax
  add    %ebp,%eax
  sar    %eax
  mov    %eax,0x38(%rsp)
  mov    %r15d,%esi
  mov    %r15d,%eax
  and    $0x1,%eax
  add    %eax,%eax
  mov    $0x1,%edx
  sub    %eax,%edx
  mov    %edx,%r11d
  movslq %r15d,%r13
  mov    0x48(%rsp),%edi
  mov    %edi,%r15d
  sub    %esi,%r15d
  mov    0x4c(%rsp),%edx
  sub    %esi,%edx
  movslq %edx,%rdx
  lea    D34(%rip),%rcx
  lea    (%rcx,%rdx,8),%r14
  mov    %esi,%eax
  sub    0x10(%rsp),%eax
  cltq
  sub    %r13,%rax
  lea    (%rcx,%rax,8),%rcx
  pxor   %xmm2,%xmm2
  movsd  %xmm2,0x10(%rsp)
  sub    0x20(%rsp),%edi
  mov    %edi,0x40(%rsp)
  mov    0x44(%rsp),%eax
  sub    %esi,%eax
  cltq
  sub    %rdx,%rax
  mov    %r12d,0x54(%rsp)
  mov    %ebx,0x58(%rsp)
  mov    %r11d,%ebx
  mov    %ebp,0x5c(%rsp)
  mov    %rcx,%rbp
  mov    %rax,%r12
L3:
  mov    0x34(%rsp),%esi
  mov    %r15d,%edi
  call   <fac_ratio@plt>
  divsd  (%r14),%xmm0
  movsd  %xmm0,0x20(%rsp)
  mov    0x40(%rsp),%edi
  sub    %r15d,%edi
  mov    0x38(%rsp),%esi
  call   <fac_ratio@plt>
  movapd %xmm0,%xmm1
  pxor   %xmm0,%xmm0
  cvtsi2sd %ebx,%xmm0
  divsd  (%r14,%r12,8),%xmm0
  lea    D34(%rip),%rax
  divsd  (%rax,%r13,8),%xmm0
  divsd  0x0(%rbp,%r13,8),%xmm1
  mulsd  0x20(%rsp),%xmm1
  mulsd  %xmm1,%xmm0
  addsd  0x10(%rsp),%xmm0
  movsd  %xmm0,0x10(%rsp)
  neg    %ebx
  add    $0x1,%r13
  sub    $0x1,%r15d
  sub    $0x8,%r14
  cmp    %r13d,0x3c(%rsp)
  jge    L3
  mov    0x54(%rsp),%r12d
  mov    0x58(%rsp),%ebx
  mov    0x5c(%rsp),%ebp
  mov    0x8(%rsp),%r14d
  add    %r14d,%ebx
  mov    %ebx,%esi
  shr    $0x1f,%esi
  add    %ebx,%esi
  sar    %esi
  mov    0x34(%rsp),%r15d
  mov    %r15d,%edi
  call   <fac_ratio@plt>
  movq   %xmm0,%rbx
  mov    0x48(%rsp),%esi
  mov    %r15d,%edi
  call   <fac_ratio@plt>
  movq   %rbx,%xmm5
  mulsd  %xmm0,%xmm5
  movsd  %xmm5,0x8(%rsp)
  mov    0x2c(%rsp),%eax
  mov    %eax,%esi
  shr    $0x1f,%esi
  add    %eax,%esi
  sar    %esi
  mov    0x28(%rsp),%eax
  add    %ebp,%eax
  mov    %eax,%edi
  shr    $0x1f,%edi
  add    %eax,%edi
  sar    %edi
  add    $0x1,%edi
  call   <fac_ratio@plt>
  mulsd  0x8(%rsp),%xmm0
  movsd  %xmm0,0x8(%rsp)
  lea    0x0(%rbp,%r14,1),%eax
  mov    0x18(%rsp),%r15d
  add    %r15d,%eax
  mov    %eax,%esi
  shr    $0x1f,%esi
  add    %eax,%esi
  sar    %esi
  mov    0x38(%rsp),%ebx
  mov    %ebx,%edi
  call   <fac_ratio@plt>
  movapd %xmm0,%xmm7
  mulsd  0x8(%rsp),%xmm7
  movsd  %xmm7,0x8(%rsp)
  mov    %ebp,%eax
  sub    %r14d,%eax
  sub    %r15d,%eax
  mov    %eax,%esi
  shr    $0x1f,%esi
  add    %eax,%esi
  sar    %esi
  mov    %ebx,%edi
  call   <fac_ratio@plt>
  mulsd  0x8(%rsp),%xmm0
  lea    D34(%rip),%rdx
  movslq 0x4c(%rsp),%rax
  mulsd  (%rdx,%rax,8),%xmm0
  mov    0x50(%rsp),%ebx
  mov    %ebx,%eax
  shr    $0x1f,%eax
  add    %ebx,%eax
  sar    %eax
  cltq
  mulsd  (%rdx,%rax,8),%xmm0
  movslq 0x44(%rsp),%rax
  mulsd  (%rdx,%rax,8),%xmm0
  mov    0x30(%rsp),%ebx
  mov    %ebx,%eax
  shr    $0x1f,%eax
  add    %ebx,%eax
  sar    %eax
  cltq
  mulsd  (%rdx,%rax,8),%xmm0
  lea    0x1(%rbp),%eax
  pxor   %xmm1,%xmm1
  cvtsi2sd %eax,%xmm1
  mulsd  %xmm1,%xmm0
  cvttsd2si %xmm0,%edi
  call   <sqrt@plt>
  pxor   %xmm0,%xmm0
  cvtsi2sd %eax,%xmm0
  mulsd  0x10(%rsp),%xmm0
  movq   %xmm0,%r13
  cmpl   $0xffffffff,0x1c(%rsp)
  je     L121
  cmpl   $0x1,0x1c(%rsp)
  jne    L38
  pxor   %xmm0,%xmm0
  cvtsi2sd %r12d,%xmm0
  movsd  D56(%rip),%xmm2
  addsd  %xmm2,%xmm0
  pxor   %xmm1,%xmm1
  cvtsi2sd %ebp,%xmm1
  addsd  %xmm2,%xmm1
  divsd  %xmm1,%xmm0
  cvttsd2si %xmm0,%edi
  call   <sqrt@plt>
  mov    %eax,%ecx
  mov    0x48(%rsp),%edx
  mov    %edx,%eax
  neg    %eax
  cmovs  %edx,%eax
  and    $0x1,%eax
  add    %eax,%eax
  mov    $0x1,%edx
  sub    %eax,%edx
  imul   %ecx,%edx
  pxor   %xmm0,%xmm0
  cvtsi2sd %edx,%xmm0
  movq   %r13,%xmm2
  mulsd  %xmm0,%xmm2
  movq   %xmm2,%r13
  jmp    L38
L78:
  mov    0x8(%rsp),%eax
  mov    0x18(%rsp),%edx
  mov    %edx,0x8(%rsp)
  mov    %eax,0x18(%rsp)
  mov    %edi,%ebx
  mov    %esi,%r12d
  movl   $0x0,0x1c(%rsp)
  jmp    L56
L121:
  mov    0x44(%rsp),%edx
  mov    %edx,%eax
  neg    %eax
  cmovs  %edx,%eax
  and    $0x1,%eax
  add    %eax,%eax
  mov    $0x1,%edx
  sub    %eax,%edx
  pxor   %xmm0,%xmm0
  cvtsi2sd %edx,%xmm0
  movq   %r13,%xmm2
  mulsd  %xmm0,%xmm2
  movq   %xmm2,%r13
  jmp    L38
L97:
  mov    D50(%rip),%r13
L38:
  movq   %r13,%xmm0
  add    $0x68,%rsp
  pop    %rbx
  pop    %rbp
  pop    %r12
  pop    %r13
  pop    %r14
  pop    %r15
  ret
```

tool_calls: name: unpack_data
arguments: data_tag: D50
type: f64
name: unpack_data
arguments: data_tag: D23
type: string
name: unpack_data
arguments: data_tag: D34
type: f64
name: unpack_data
arguments: data_tag: D56
type: f64

tool: D50: 0

tool: D23: 

Termination from VCC. - too large factorials


tool: D34: 1

tool: D56: 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);
}
```