user: Demonstrate the C code that generates the assembly output below:

```asm
<jacobi>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  push   %r15
  push   %r14
  push   %r13
  push   %r12
  push   %rbx
  sub    $0x88,%rsp
  mov    %rdi,%r15
  mov    %rsi,%r13
  mov    %rdx,-0xa8(%rbp)
  mov    %fs:0x28,%rax
  mov    %rax,-0x38(%rbp)
  xor    %eax,%eax
  mov    %rsp,%rax
L60:
  cmp    %rax,%rsp
  je     L63
  sub    $0x1000,%rsp
  orq    $0x0,0xff8(%rsp)
  jmp    L60
L63:
  sub    $0x320,%rsp
  orq    $0x0,0x318(%rsp)
  mov    %rsp,-0xb0(%rbp)
  mov    %rsp,%rax
L26:
  cmp    %rax,%rsp
  je     L124
  sub    $0x1000,%rsp
  orq    $0x0,0xff8(%rsp)
  jmp    L26
L124:
  sub    $0x320,%rsp
  orq    $0x0,0x318(%rsp)
  mov    %rsp,-0xa0(%rbp)
  mov    $0x8,%eax
  movsd  D72(%rip),%xmm0
  mov    -0xa8(%rbp),%rdx
L301:
  mov    (%rdx,%rax,1),%rcx
  movq   $0x0,0x8(%rcx)
  mov    (%rdx,%rax,1),%rcx
  movq   $0x0,0x10(%rcx)
  mov    (%rdx,%rax,1),%rcx
  movq   $0x0,0x18(%rcx)
  mov    (%rdx,%rax,1),%rcx
  movsd  %xmm0,(%rcx,%rax,1)
  add    $0x8,%rax
  cmp    $0x20,%rax
  jne    L301
  mov    $0x8,%eax
  mov    -0xb0(%rbp),%rcx
  mov    -0xa0(%rbp),%rsi
L80:
  mov    (%r15,%rax,1),%rdx
  movsd  (%rdx,%rax,1),%xmm0
  movsd  %xmm0,0x0(%r13,%rax,1)
  movsd  %xmm0,(%rcx,%rax,1)
  movq   $0x0,(%rsi,%rax,1)
  add    $0x8,%rax
  cmp    $0x20,%rax
  jne    L80
  movl   $0x1,-0x5c(%rbp)
  jmp    L305
L359:
  mulsd  D4(%rip),%xmm0
  divsd  D13(%rip),%xmm0
  movsd  %xmm0,-0x78(%rbp)
  jmp    L284
L14:
  mov    -0x48(%rbp),%rax
  mov    (%rax),%rax
  movsd  (%rax,%r12,1),%xmm0
  call   <fabs@plt>
  cvtss2sd %xmm0,%xmm0
  comisd -0x78(%rbp),%xmm0
  ja     L168
L303:
  add    $0x1,%rbx
  cmp    $0x3,%ebx
  ja     L13
L138:
  mov    -0x68(%rbp),%rax
  mov    %rax,-0x48(%rbp)
  lea    0x0(,%rbx,8),%r12
  mov    (%rax),%rax
  movsd  (%rax,%rbx,8),%xmm0
  call   <fabs@plt>
  mulss  D99(%rip),%xmm0
  pxor   %xmm7,%xmm7
  cvtss2sd %xmm0,%xmm7
  movsd  %xmm7,-0x50(%rbp)
  cmpl   $0x4,-0x5c(%rbp)
  jle    L14
  movsd  (%r14,%r13,8),%xmm0
  call   <fabs@plt>
  cvtss2sd %xmm0,%xmm0
  addsd  -0x50(%rbp),%xmm0
  movsd  %xmm0,-0x58(%rbp)
  movsd  (%r14,%r13,8),%xmm0
  call   <fabs@plt>
  cvtss2sd %xmm0,%xmm0
  movsd  -0x58(%rbp),%xmm6
  ucomisd %xmm0,%xmm6
  jp     L14
  jne    L14
  movsd  (%r14,%rbx,8),%xmm0
  call   <fabs@plt>
  cvtss2sd %xmm0,%xmm0
  addsd  -0x50(%rbp),%xmm0
  movsd  %xmm0,-0x58(%rbp)
  movsd  (%r14,%rbx,8),%xmm0
  call   <fabs@plt>
  cvtss2sd %xmm0,%xmm0
  movsd  -0x58(%rbp),%xmm2
  ucomisd %xmm0,%xmm2
  jp     L14
  jne    L14
  mov    -0x48(%rbp),%rax
  mov    (%rax),%rax
  movq   $0x0,(%rax,%r12,1)
  jmp    L303
L168:
  movsd  (%r14,%rbx,8),%xmm0
  subsd  (%r14,%r13,8),%xmm0
  movsd  %xmm0,-0x58(%rbp)
  call   <fabs@plt>
  cvtss2sd %xmm0,%xmm0
  movapd %xmm0,%xmm2
  addsd  -0x50(%rbp),%xmm2
  movsd  %xmm2,-0x50(%rbp)
  movsd  -0x58(%rbp),%xmm0
  call   <fabs@plt>
  cvtss2sd %xmm0,%xmm0
  movsd  -0x50(%rbp),%xmm2
  ucomisd %xmm0,%xmm2
  jp     L375
  jne    L375
  mov    -0x48(%rbp),%rax
  mov    (%rax),%rax
  movsd  (%rax,%r12,1),%xmm0
  movapd %xmm0,%xmm6
  divsd  -0x58(%rbp),%xmm6
  movsd  %xmm6,-0x50(%rbp)
L127:
  movsd  -0x50(%rbp),%xmm6
  movapd %xmm6,%xmm0
  mulsd  %xmm6,%xmm0
  addsd  D72(%rip),%xmm0
  cvtsd2ss %xmm0,%xmm0
  call   <sqrt@plt>
  movaps %xmm0,%xmm1
  movss  D9(%rip),%xmm0
  divss  %xmm1,%xmm0
  cvtss2sd %xmm0,%xmm0
  movsd  -0x50(%rbp),%xmm6
  movapd %xmm6,%xmm2
  mulsd  %xmm0,%xmm2
  addsd  D72(%rip),%xmm0
  movapd %xmm2,%xmm3
  divsd  %xmm0,%xmm3
  mov    -0x48(%rbp),%rdx
  mov    (%rdx),%rax
  mulsd  (%rax,%r12,1),%xmm6
  movapd %xmm6,%xmm0
  mov    -0xa0(%rbp),%rax
  movsd  (%rax,%r13,8),%xmm1
  subsd  %xmm6,%xmm1
  movsd  %xmm1,(%rax,%r13,8)
  movapd %xmm6,%xmm1
  addsd  (%rax,%rbx,8),%xmm1
  movsd  %xmm1,(%rax,%rbx,8)
  movsd  (%r14,%r13,8),%xmm1
  subsd  %xmm6,%xmm1
  movsd  %xmm1,(%r14,%r13,8)
  addsd  (%r14,%rbx,8),%xmm0
  movsd  %xmm0,(%r14,%rbx,8)
  mov    (%rdx),%rax
  movq   $0x0,(%rax,%r12,1)
  cmp    $0x1,%r13d
  jle    L206
  mov    -0x80(%rbp),%rax
  mov    -0x90(%rbp),%rdx
  mov    -0x88(%rbp),%rcx
L265:
  mov    (%rax),%rdi
  lea    (%rdi,%rcx,1),%rsi
  movsd  (%rsi),%xmm0
  movsd  (%rdi,%r12,1),%xmm4
  movapd %xmm3,%xmm1
  mulsd  %xmm0,%xmm1
  addsd  %xmm4,%xmm1
  mulsd  %xmm2,%xmm1
  movapd %xmm0,%xmm5
  subsd  %xmm1,%xmm5
  movsd  %xmm5,(%rsi)
  mov    (%rax),%rsi
  movapd %xmm3,%xmm1
  mulsd  %xmm4,%xmm1
  subsd  %xmm1,%xmm0
  mulsd  %xmm2,%xmm0
  addsd  %xmm4,%xmm0
  movsd  %xmm0,(%rsi,%r12,1)
  add    $0x8,%rax
  cmp    %rax,%rdx
  jne    L265
L206:
  cmp    -0x70(%rbp),%ebx
  jle    L130
  mov    %ebx,%eax
  sub    -0x60(%rbp),%eax
  lea    -0x1(%rax),%eax
  lea    0x2(%r13,%rax,1),%rcx
  shl    $0x3,%rcx
  mov    -0x98(%rbp),%rax
  mov    -0x48(%rbp),%rdx
L199:
  mov    %rax,%rsi
  add    (%rdx),%rsi
  movsd  (%rsi),%xmm0
  mov    (%r15,%rax,1),%rdi
  movsd  (%rdi,%r12,1),%xmm4
  movapd %xmm3,%xmm1
  mulsd  %xmm0,%xmm1
  addsd  %xmm4,%xmm1
  mulsd  %xmm2,%xmm1
  movapd %xmm0,%xmm5
  subsd  %xmm1,%xmm5
  movsd  %xmm5,(%rsi)
  mov    (%r15,%rax,1),%rsi
  movapd %xmm3,%xmm1
  mulsd  %xmm4,%xmm1
  subsd  %xmm1,%xmm0
  mulsd  %xmm2,%xmm0
  addsd  %xmm4,%xmm0
  movsd  %xmm0,(%rsi,%r12,1)
  add    $0x8,%rax
  cmp    %rcx,%rax
  jne    L199
L130:
  lea    0x1(%rbx),%eax
  cmp    $0x3,%eax
  ja     L160
  cltq
  shl    $0x3,%rax
  mov    $0x2,%edx
  sub    %ebx,%edx
  lea    0x2(%rbx,%rdx,1),%rcx
  shl    $0x3,%rcx
  mov    -0x48(%rbp),%rdx
L194:
  mov    %rax,%rsi
  add    (%rdx),%rsi
  movsd  (%rsi),%xmm0
  mov    (%r15,%rbx,8),%rdi
  movsd  (%rdi,%rax,1),%xmm4
  movapd %xmm3,%xmm1
  mulsd  %xmm0,%xmm1
  addsd  %xmm4,%xmm1
  mulsd  %xmm2,%xmm1
  movapd %xmm0,%xmm5
  subsd  %xmm1,%xmm5
  movsd  %xmm5,(%rsi)
  mov    (%r15,%rbx,8),%rsi
  movapd %xmm3,%xmm1
  mulsd  %xmm4,%xmm1
  subsd  %xmm1,%xmm0
  mulsd  %xmm2,%xmm0
  addsd  %xmm4,%xmm0
  movsd  %xmm0,(%rsi,%rax,1)
  add    $0x8,%rax
  cmp    %rax,%rcx
  jne    L194
L160:
  mov    -0xa8(%rbp),%rdi
  lea    0x8(%rdi),%rax
  lea    0x20(%rdi),%rcx
L222:
  mov    (%rax),%rsi
  mov    -0x88(%rbp),%rdi
  lea    (%rsi,%rdi,1),%rdx
  movsd  (%rdx),%xmm0
  movsd  (%rsi,%r12,1),%xmm4
  movapd %xmm3,%xmm1
  mulsd  %xmm0,%xmm1
  addsd  %xmm4,%xmm1
  mulsd  %xmm2,%xmm1
  movapd %xmm0,%xmm5
  subsd  %xmm1,%xmm5
  movsd  %xmm5,(%rdx)
  mov    (%rax),%rdx
  movapd %xmm3,%xmm1
  mulsd  %xmm4,%xmm1
  subsd  %xmm1,%xmm0
  mulsd  %xmm2,%xmm0
  addsd  %xmm4,%xmm0
  movsd  %xmm0,(%rdx,%r12,1)
  add    $0x8,%rax
  cmp    %rcx,%rax
  jne    L222
  jmp    L303
L375:
  movsd  -0x58(%rbp),%xmm0
  mulsd  D59(%rip),%xmm0
  mov    -0x48(%rbp),%rax
  mov    (%rax),%rax
  divsd  (%rax,%r12,1),%xmm0
  movsd  %xmm0,-0x58(%rbp)
  call   <fabs@plt>
  movss  %xmm0,-0x50(%rbp)
  movsd  -0x58(%rbp),%xmm6
  movapd %xmm6,%xmm7
  mulsd  %xmm6,%xmm7
  movapd %xmm7,%xmm0
  addsd  D72(%rip),%xmm0
  cvtsd2ss %xmm0,%xmm0
  call   <sqrt@plt>
  movss  -0x50(%rbp),%xmm1
  addss  %xmm0,%xmm1
  movss  D9(%rip),%xmm0
  divss  %xmm1,%xmm0
  pxor   %xmm3,%xmm3
  cvtss2sd %xmm0,%xmm3
  movsd  %xmm3,-0x50(%rbp)
  pxor   %xmm0,%xmm0
  comisd -0x58(%rbp),%xmm0
  jbe    L127
  xorpd  D77(%rip),%xmm3
  movsd  %xmm3,-0x50(%rbp)
  jmp    L127
L13:
  addq   $0x1,-0x70(%rbp)
  mov    -0x70(%rbp),%rax
  add    $0x1,%r13
  addq   $0x8,-0x68(%rbp)
  cmp    $0x4,%rax
  je     L123
L370:
  mov    -0x70(%rbp),%rcx
  mov    %ecx,-0x60(%rbp)
  cmp    $0x3,%ecx
  ja     L13
  lea    0x0(,%r13,8),%rax
  mov    %rax,-0x88(%rbp)
  lea    -0x3(%rcx),%eax
  lea    0x10(%r15,%rax,8),%rax
  mov    %rax,-0x90(%rbp)
  lea    0x0(,%rcx,8),%rax
  mov    %rax,-0x98(%rbp)
  mov    %rcx,%rbx
  jmp    L138
L123:
  mov    %r14,%r13
  mov    $0x8,%eax
  mov    -0xb0(%rbp),%rdx
  mov    -0xa0(%rbp),%rcx
L314:
  movsd  (%rdx,%rax,1),%xmm0
  addsd  (%rcx,%rax,1),%xmm0
  movsd  %xmm0,(%rdx,%rax,1)
  movsd  %xmm0,0x0(%r13,%rax,1)
  movq   $0x0,(%rcx,%rax,1)
  add    $0x8,%rax
  cmp    $0x20,%rax
  jne    L314
  addl   $0x1,-0x5c(%rbp)
  mov    -0x5c(%rbp),%eax
  cmp    $0x33,%eax
  je     L342
L305:
  lea    0x8(%r15),%rax
  mov    %rax,-0x80(%rbp)
  mov    0x8(%r15),%rax
  movsd  0x10(%rax),%xmm0
  call   <fabs@plt>
  cvtss2sd %xmm0,%xmm0
  pxor   %xmm6,%xmm6
  addsd  %xmm6,%xmm0
  movsd  %xmm0,-0x48(%rbp)
  mov    0x8(%r15),%rax
  movsd  0x18(%rax),%xmm0
  call   <fabs@plt>
  cvtss2sd %xmm0,%xmm0
  movapd %xmm0,%xmm3
  addsd  -0x48(%rbp),%xmm3
  movsd  %xmm3,-0x48(%rbp)
  mov    0x10(%r15),%rax
  movsd  0x18(%rax),%xmm0
  call   <fabs@plt>
  cvtss2sd %xmm0,%xmm0
  addsd  -0x48(%rbp),%xmm0
  pxor   %xmm7,%xmm7
  ucomisd %xmm7,%xmm0
  jp     L273
  je     L37
L273:
  pxor   %xmm7,%xmm7
  movsd  %xmm7,-0x78(%rbp)
  cmpl   $0x3,-0x5c(%rbp)
  jle    L359
L284:
  mov    -0x80(%rbp),%rax
  mov    %rax,-0x68(%rbp)
  mov    $0x1,%r14d
  movq   $0x2,-0x70(%rbp)
  mov    %r13,%rax
  mov    %r14,%r13
  mov    %rax,%r14
  jmp    L370
L342:
  mov    $0x0,%edi
  call   <assert@plt>
  mov    $0x1,%eax
  jmp    L136
L37:
  mov    $0x0,%eax
L136:
  mov    -0x38(%rbp),%rdx
  sub    %fs:0x28,%rdx
  jne    L313
  lea    -0x28(%rbp),%rsp
  pop    %rbx
  pop    %r12
  pop    %r13
  pop    %r14
  pop    %r15
  pop    %rbp
  ret
L313:
  call   <__stack_chk_fail@plt>
```

tool_calls: name: unpack_data
arguments: tag: D72
type: byte[8]
name: unpack_data
arguments: tag: D4
type: byte[8]
name: unpack_data
arguments: tag: D13
type: byte[8]
name: unpack_data
arguments: tag: D99
type: byte[4]
name: unpack_data
arguments: tag: D9
type: byte[4]
name: unpack_data
arguments: tag: D59
type: byte[8]
name: unpack_data
arguments: tag: D77
type: byte[16]

tool: {"D72": [0x00,0x00,0x00,0x00,0x00,0x00,0xf0,0x3f]}

tool: {"D4": [0x00,0x00,0x00,0xa0,0x99,0x99,0xc9,0x3f]}

tool: {"D13": [0x00,0x00,0x00,0x00,0x00,0x00,0x22,0x40]}

tool: {"D99": [0x00,0x00,0xc8,0x42]}

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

tool: {"D59": [0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0x3f]}

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

assistant: ```c
int jacobi(double **a, double *d, double **v) {
  int nrot = 0;
  const unsigned int nmax = 100, n = 3;
  double b[nmax], z[nmax], tresh, sm, g, h, t, theta, c, s, tau;
  int i, j, ip, iq;
  for (ip = 1; ip <= n; ip++) {
    for (iq = 1; iq <= n; iq++)
      v[ip][iq] = 0.0f;
    v[ip][ip] = 1.0f;
  }
  for (ip = 1; ip <= n; ip++) {
    b[ip] = d[ip] = a[ip][ip];
    z[ip] = 0.0f;
  }
  for (i = 1; i <= 50; i++) {
    sm = 0.0f;
    for (ip = 1; ip <= n - 1; ip++) {
      for (iq = ip + 1; iq <= n; iq++)
        sm += fabs(a[ip][iq]);
    }
    if (sm == 0.0f)
      return (0);
    if (i < 4) {
      tresh = 0.2f * sm / (n * n);
    } else {
      tresh = 0.0f;
    }
    for (ip = 1; ip <= n - 1; ip++) {
      for (iq = ip + 1; iq <= n; iq++) {
        g = 100.0f * fabs(a[ip][iq]);
        if ((i > 4) && (double)(fabs(d[ip]) + g) == (double)fabs(d[ip]) && (double)(fabs(d[iq]) + g) == (double)fabs(d[iq]))
          a[ip][iq] = 0.0f;
        else if (fabs(a[ip][iq]) > tresh) {
          h = d[iq] - d[ip];
          if ((fabs(h) + g) == fabs(h))
            t = a[ip][iq] / h;
          else {
            theta = 0.5f * h / (a[ip][iq]);
            t = 1.0f / (fabs(theta) + sqrt(1.0f + theta * theta));
            if (theta < 0.0f)
              t *= -1.0f;
          }
          c = 1.0f / sqrt(1.0f + t * t);
          s = t * c;
          tau = s / (1.0f + c);
          h = t * a[ip][iq];
          z[ip] -= h;
          z[iq] += h;
          d[ip] -= h;
          d[iq] += h;
          a[ip][iq] = 0.0f;
          for (j = 1; j <= ip - 1; j++) {
            g = a[j][ip];
            h = a[j][iq];
            a[j][ip] = g - s * (h + g * tau);
            a[j][iq] = h + s * (g - h * tau);
            ;
          }
          for (j = ip + 1; j <= iq - 1; j++) {
            g = a[ip][j];
            h = a[j][iq];
            a[ip][j] = g - s * (h + g * tau);
            a[j][iq] = h + s * (g - h * tau);
            ;
          }
          for (j = iq + 1; j <= n; j++) {
            g = a[ip][j];
            h = a[iq][j];
            a[ip][j] = g - s * (h + g * tau);
            a[iq][j] = h + s * (g - h * tau);
            ;
          }
          for (j = 1; j <= n; j++) {
            g = v[j][ip];
            h = v[j][iq];
            v[j][ip] = g - s * (h + g * tau);
            v[j][iq] = h + s * (g - h * tau);
            ;
          }
          ++nrot;
        }
      }
    }
    for (ip = 1; ip <= n; ip++) {
      b[ip] += z[ip];
      d[ip] = b[ip];
      z[ip] = 0.0f;
    }
  }
  assert(i < 50);
  return 1;
}
```