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

```asm
<tqli>:
  endbr64
  push   %r15
  push   %r14
  push   %r13
  push   %r12
  push   %rbp
  push   %rbx
  sub    $0x38,%rsp
  mov    %rdi,%r13
  mov    %rsi,%r15
  mov    %edx,%r12d
  mov    %rcx,%rbp
  cmp    $0x1,%edx
  jle    L213
  lea    0x4(%rsi),%rax
  lea    -0x2(%rdx),%edx
  lea    0x8(%rsi,%rdx,4),%rdx
L168:
  movss  0x4(%rax),%xmm0
  movss  %xmm0,(%rax)
  add    $0x4,%rax
  cmp    %rdx,%rax
  jne    L168
  movslq %r12d,%rax
  movl   $0x0,(%r15,%rax,4)
L38:
  movq   $0x1,0x18(%rsp)
  jmp    L151
L213:
  movslq %edx,%rax
  movl   $0x0,(%rsi,%rax,4)
  je     L38
L33:
  add    $0x38,%rsp
  pop    %rbx
  pop    %rbp
  pop    %r12
  pop    %r13
  pop    %r14
  pop    %r15
  ret
L31:
  cmpl   $0x1e,0x2c(%rsp)
  je     L107
L49:
  mov    0x18(%rsp),%rax
  movss  0x0(%r13,%rax,4),%xmm7
  movss  %xmm7,0x10(%rsp)
  pxor   %xmm5,%xmm5
  cvtss2sd (%r15,%rax,4),%xmm5
  movsd  %xmm5,0x8(%rsp)
  movss  0x4(%r13,%rax,4),%xmm0
  subss  %xmm7,%xmm0
  cvtss2sd %xmm0,%xmm0
  movapd %xmm5,%xmm1
  addsd  %xmm5,%xmm1
  divsd  %xmm1,%xmm0
  cvtsd2ss %xmm0,%xmm0
  movss  %xmm0,0x14(%rsp)
  mulss  %xmm0,%xmm0
  cvtss2sd %xmm0,%xmm0
  addsd  D147(%rip),%xmm0
  pxor   %xmm1,%xmm1
  ucomisd %xmm0,%xmm1
  ja     L179
  sqrtsd %xmm0,%xmm0
L203:
  cvtsd2ss %xmm0,%xmm0
  movslq %r14d,%rdi
  mov    %rdi,0x20(%rsp)
  lea    0x0(,%rdi,4),%rax
  movss  0x0(%r13,%rdi,4),%xmm1
  subss  0x10(%rsp),%xmm1
  cvtss2sd %xmm1,%xmm1
  movss  0x14(%rsp),%xmm5
  pxor   %xmm2,%xmm2
  cvtss2sd %xmm5,%xmm2
  pxor   %xmm3,%xmm3
  comiss %xmm5,%xmm3
  ja     L155
  andps  D121(%rip),%xmm0
  cvtss2sd %xmm0,%xmm0
L249:
  addsd  %xmm0,%xmm2
  movsd  0x8(%rsp),%xmm0
  divsd  %xmm2,%xmm0
  addsd  %xmm1,%xmm0
  pxor   %xmm6,%xmm6
  cvtsd2ss %xmm0,%xmm6
  movss  %xmm6,0x10(%rsp)
  cmp    %ebx,%r14d
  jle    L253
  lea    -0x4(%rax),%rbx
  sub    0x18(%rsp),%r14d
  lea    -0x1(%r14),%edx
  mov    0x20(%rsp),%rax
  sub    %rdx,%rax
  lea    -0x8(,%rax,4),%r14
  movss  D36(%rip),%xmm3
  pxor   %xmm6,%xmm6
  movss  %xmm6,0x8(%rsp)
  movaps %xmm3,%xmm2
  jmp    L163
L107:
  lea    D64(%rip),%rdi
  mov    $0x0,%eax
  call   <erhand@plt>
  jmp    L49
L179:
  call   <sqrt@plt>
  jmp    L203
L155:
  andps  D121(%rip),%xmm0
  cvtss2sd %xmm0,%xmm0
  xorpd  D22(%rip),%xmm0
  jmp    L249
L258:
  call   <sqrt@plt>
L181:
  cvtsd2ss %xmm0,%xmm0
  movss  0x14(%rsp),%xmm1
  mulss  %xmm0,%xmm1
  movss  %xmm1,0x4(%r15,%rbx,1)
  movss  D36(%rip),%xmm2
  divss  %xmm0,%xmm2
  movss  0x10(%rsp),%xmm3
  mulss  %xmm2,%xmm3
L248:
  lea    0x4(%rbx),%rsi
  movss  0x4(%r13,%rbx,1),%xmm1
  subss  0x8(%rsp),%xmm1
  movss  0x0(%r13,%rbx,1),%xmm0
  subss  %xmm1,%xmm0
  mulss  %xmm2,%xmm0
  cvtss2sd %xmm0,%xmm0
  pxor   %xmm4,%xmm4
  cvtss2sd %xmm3,%xmm4
  addsd  %xmm4,%xmm4
  movss  0x28(%rsp),%xmm6
  pxor   %xmm5,%xmm5
  cvtss2sd %xmm6,%xmm5
  mulsd  %xmm5,%xmm4
  addsd  %xmm4,%xmm0
  cvtsd2ss %xmm0,%xmm0
  movaps %xmm2,%xmm5
  mulss  %xmm0,%xmm5
  movss  %xmm5,0x8(%rsp)
  addss  %xmm5,%xmm1
  movss  %xmm1,0x4(%r13,%rbx,1)
  mulss  %xmm3,%xmm0
  subss  %xmm6,%xmm0
  movss  %xmm0,0x10(%rsp)
  mov    $0x1,%eax
L9:
  mov    0x0(%rbp,%rax,8),%rcx
  lea    (%rcx,%rsi,1),%rdx
  movss  (%rdx),%xmm0
  movaps %xmm2,%xmm1
  mulss  (%rcx,%rbx,1),%xmm1
  movaps %xmm3,%xmm4
  mulss  %xmm0,%xmm4
  addss  %xmm4,%xmm1
  movss  %xmm1,(%rdx)
  mov    %rbx,%rdx
  add    0x0(%rbp,%rax,8),%rdx
  movaps %xmm3,%xmm1
  mulss  (%rdx),%xmm1
  mulss  %xmm2,%xmm0
  subss  %xmm0,%xmm1
  movss  %xmm1,(%rdx)
  add    $0x1,%rax
  cmp    %eax,%r12d
  jge    L9
  sub    $0x4,%rbx
  cmp    %rbx,%r14
  je     L233
L163:
  movss  (%r15,%rbx,1),%xmm0
  movaps %xmm2,%xmm6
  mulss  %xmm0,%xmm6
  movss  %xmm6,0x14(%rsp)
  mulss  %xmm3,%xmm0
  movss  %xmm0,0x28(%rsp)
  movaps %xmm6,%xmm1
  andps  D121(%rip),%xmm1
  movss  0x10(%rsp),%xmm7
  movaps %xmm7,%xmm0
  andps  D121(%rip),%xmm0
  comiss %xmm0,%xmm1
  jb     L169
  divss  %xmm6,%xmm7
  movss  %xmm7,0x10(%rsp)
  movaps %xmm7,%xmm0
  mulss  %xmm7,%xmm0
  cvtss2sd %xmm0,%xmm0
  addsd  D147(%rip),%xmm0
  pxor   %xmm1,%xmm1
  ucomisd %xmm0,%xmm1
  ja     L258
  sqrtsd %xmm0,%xmm0
  jmp    L181
L169:
  movss  0x14(%rsp),%xmm0
  divss  0x10(%rsp),%xmm0
  movss  %xmm0,0x14(%rsp)
  mulss  %xmm0,%xmm0
  cvtss2sd %xmm0,%xmm0
  addsd  D147(%rip),%xmm0
  pxor   %xmm7,%xmm7
  ucomisd %xmm0,%xmm7
  ja     L70
  sqrtsd %xmm0,%xmm0
L32:
  cvtsd2ss %xmm0,%xmm0
  movss  0x10(%rsp),%xmm1
  mulss  %xmm0,%xmm1
  movss  %xmm1,0x4(%r15,%rbx,1)
  movss  D36(%rip),%xmm3
  divss  %xmm0,%xmm3
  movss  0x14(%rsp),%xmm2
  mulss  %xmm3,%xmm2
  jmp    L248
L70:
  call   <sqrt@plt>
  jmp    L32
L253:
  pxor   %xmm5,%xmm5
  movss  %xmm5,0x8(%rsp)
L233:
  mov    0x18(%rsp),%rax
  movss  0x0(%r13,%rax,4),%xmm0
  subss  0x8(%rsp),%xmm0
  movss  %xmm0,0x0(%r13,%rax,4)
  movss  0x10(%rsp),%xmm7
  movss  %xmm7,(%r15,%rax,4)
  mov    0x20(%rsp),%rax
  movl   $0x0,(%r15,%rax,4)
  addl   $0x1,0x2c(%rsp)
L227:
  mov    0x18(%rsp),%rax
  mov    %eax,%ebx
  cmp    %eax,%r12d
  jle    L122
L47:
  mov    %eax,%edx
  mov    %eax,%r14d
  movss  0x0(%r13,%rax,4),%xmm0
  andps  D121(%rip),%xmm0
  movss  0x4(%r13,%rax,4),%xmm1
  andps  D121(%rip),%xmm1
  addss  %xmm1,%xmm0
  cvtss2sd %xmm0,%xmm0
  movss  (%r15,%rax,4),%xmm1
  andps  D121(%rip),%xmm1
  cvtss2sd %xmm1,%xmm1
  addsd  %xmm0,%xmm1
  ucomisd %xmm1,%xmm0
  jp     L20
  je     L193
L20:
  lea    0x1(%rdx),%r14d
  add    $0x1,%rax
  cmp    %eax,%r12d
  jg     L47
L193:
  cmp    %ebx,%r14d
  jne    L31
L122:
  addq   $0x1,0x18(%rsp)
  mov    0x18(%rsp),%rax
  cmp    %eax,%r12d
  jl     L33
L151:
  movl   $0x0,0x2c(%rsp)
  jmp    L227
```

tool_calls: name: disassemble_data
arguments: label: D147
type: f64
name: disassemble_data
arguments: label: D121
type: dword[4]
name: disassemble_data
arguments: label: D36
type: byte[4]
name: disassemble_data
arguments: label: D64
type: string
name: disassemble_data
arguments: label: D22
type: f32[4]

tool: D147: 1

tool: {"D121": [0x7fffffff,0x00000000,0x00000000,0x00000000]}

tool: {"D36": [0x00,0x00,0x80,0x3f]}

tool: D64: No convergence in TLQI.

tool: {"D22": [0.0,-0.0,0.0,0.0]}

assistant: ```c
void tqli(d, e, n, z) float d[], e[], **z;
int n;
{
  int m, l, iter, i, k;
  float s, r, p, g, f, dd, c, b;
  void erhand();
  for (i = 2; i <= n; i++)
    e[i - 1] = e[i];
  e[n] = 0.0;
  for (l = 1; l <= n; l++) {
    iter = 0;
    do {
      for (m = l; m <= n - 1; m++) {
        dd = fabs(d[m]) + fabs(d[m + 1]);
        if (fabs(e[m]) + dd == dd)
          break;
      }
      if (m != l) {
        if (iter++ == 30)
          erhand("No convergence in TLQI.");
        g = (d[l + 1] - d[l]) / (2.0 * e[l]);
        r = sqrt((g * g) + 1.0);
        g = d[m] - d[l] + e[l] / (g + ((g) < 0 ? -fabs(r) : fabs(r)));
        s = c = 1.0;
        p = 0.0;
        for (i = m - 1; i >= l; i--) {
          f = s * e[i];
          b = c * e[i];
          if (fabs(f) >= fabs(g)) {
            c = g / f;
            r = sqrt((c * c) + 1.0);
            e[i + 1] = f * r;
            c *= (s = 1.0 / r);
          } else {
            s = f / g;
            r = sqrt((s * s) + 1.0);
            e[i + 1] = g * r;
            s *= (c = 1.0 / r);
          }
          g = d[i + 1] - p;
          r = (d[i] - g) * s + 2.0 * c * b;
          p = s * r;
          d[i + 1] = g + p;
          g = c * r - b;
          for (k = 1; k <= n; k++) {
            f = z[k][i + 1];
            z[k][i + 1] = s * z[k][i] + c * f;
            z[k][i] = c * z[k][i] - s * f;
          }
        }
        d[l] = d[l] - p;
        e[l] = g;
        e[m] = 0.0;
      }
    } while (m != l);
  }
}
```