user: 请从给定的汇编指令推导出C源代码:

```asm
<cholesky_tri_inv>:
  endbr64
  test   %edx,%edx
  jle    L56
  push   %r15
  lea    -0x1(%rdx),%eax
  mov    %rsi,%r8
  push   %r14
  push   %r13
  xor    %r13d,%r13d
  push   %r12
  mov    %edx,%r12d
  push   %rbp
  mov    %rdi,%rbp
  movslq %edx,%rdi
  push   %rbx
  mov    %rcx,%rbx
  sub    $0x38,%rsp
  mov    %eax,0x28(%rsp)
  cltq
  lea    (%rcx,%rax,8),%rax
  mov    %rdi,0x18(%rsp)
  mov    %rax,0x20(%rsp)
  lea    -0x2(%rdx),%eax
  mov    %eax,0x2c(%rsp)
  nopw   0x0(%rax,%rax,1)
L121:
  mov    D12(%rip),%rax
  mov    %r13d,%r15d
  mov    %r13d,%r14d
  mov    %rax,(%rcx)
  lea    0x1(%r13),%eax
  cmp    %eax,%r12d
  jle    L13
  mov    0x2c(%rsp),%eax
  lea    0x8(%rcx),%rdi
  xor    %esi,%esi
  mov    %r8,0x10(%rsp)
  mov    %rcx,0x8(%rsp)
  sub    %r13d,%eax
  lea    0x8(,%rax,8),%rdx
  call   <memset@plt>
  mov    0x8(%rsp),%rcx
  mov    0x10(%rsp),%r8
  mov    %rax,%rdi
  movsd  (%rcx),%xmm1
L94:
  lea    0x1(%r13),%r11
  mov    %rcx,%rdx
  mov    %r11,%rax
  nopl   0x0(%rax)
L117:
  lea    -0x1(%rax),%esi
  mov    %eax,%r10d
  mov    %esi,%r9d
  imul   %eax,%r9d
  mov    %r9d,%ecx
  shr    $0x1f,%ecx
  add    %r9d,%ecx
  sar    %ecx
  add    %esi,%ecx
  movslq %ecx,%rcx
  divsd  0x0(%rbp,%rcx,8),%xmm1
  movsd  %xmm1,(%rdx)
  cmp    %eax,%r12d
  jle    L64
  movsd  0x8(%rdx),%xmm1
  cmp    %r13d,%eax
  jle    L79
  lea    0x1(%r10),%ecx
  imul   %r10d,%ecx
  sar    %ecx
  movslq %ecx,%rcx
  lea    0x0(%rbp,%rcx,8),%rsi
  mov    %r13,%rcx
  nopl   0x0(%rax,%rax,1)
L19:
  movsd  (%rbx,%rcx,8),%xmm0
  mulsd  (%rsi,%rcx,8),%xmm0
  add    $0x1,%rcx
  subsd  %xmm0,%xmm1
  movsd  %xmm1,0x8(%rdx)
  cmp    %rcx,%rax
  jne    L19
L79:
  add    $0x1,%rax
  add    $0x8,%rdx
  jmp    L117
  cs nopw 0x0(%rax,%rax,1)
L64:
  mov    0x20(%rsp),%r9
  mov    %r12d,%esi
  cmp    %r13d,0x28(%rsp)
  jl     L80
  nop
L55:
  mov    %esi,%ecx
  sub    $0x1,%esi
  cmp    %ecx,%r12d
  jle    L14
  movsd  (%r9),%xmm1
  movslq %ecx,%rdx
  nopw   0x0(%rax,%rax,1)
L108:
  lea    0x1(%rdx),%r10d
  imul   %edx,%r10d
  mov    %r10d,%eax
  shr    $0x1f,%eax
  add    %r10d,%eax
  sar    %eax
  add    %esi,%eax
  cltq
  movsd  0x0(%rbp,%rax,8),%xmm0
  mulsd  (%rbx,%rdx,8),%xmm0
  add    $0x1,%rdx
  subsd  %xmm0,%xmm1
  movsd  %xmm1,(%r9)
  cmp    %edx,%r12d
  jg     L108
L14:
  imul   %esi,%ecx
  movsd  (%r9),%xmm0
  sub    $0x8,%r9
  sar    %ecx
  lea    (%rcx,%rsi,1),%eax
  add    %r14d,%ecx
  cltq
  movslq %ecx,%rcx
  divsd  0x0(%rbp,%rax,8),%xmm0
  movsd  %xmm0,0x8(%r9)
  movsd  %xmm0,(%r8,%rcx,8)
  cmp    %esi,%r15d
  jne    L55
L80:
  mov    %rdi,%rcx
  cmp    0x18(%rsp),%r11
  je     L103
  mov    %r11,%r13
  jmp    L121
L13:
  mov    D12(%rip),%rax
  lea    0x8(%rcx),%rdi
  movq   %rax,%xmm1
  jmp    L94
L103:
  add    $0x38,%rsp
  pop    %rbx
  pop    %rbp
  pop    %r12
  pop    %r13
  pop    %r14
  pop    %r15
  ret
L56:
  ret
```

tool_calls: name: retrieve_data
arguments: data_label: D12
type: f64

tool: D12: 1

assistant: ```c
void cholesky_tri_inv(const double *L_, double *invA, const int n, double *x) {
  int i, k, l;
  for (l = 0; l < n; l++) {
    x[l] = 1.0;
    for (k = l + 1; k < n; k++)
      x[k] = 0.0;
    for (k = l; k < n; k++) {
      for (i = l; i < k; i++)
        x[k] -= x[i] * L_[(((k) * ((k) + 1)) / 2 + (i))];
      x[k] /= L_[(((k) * ((k) + 1)) / 2 + (k))];
    }
    for (k = n - 1; k >= l; k--) {
      for (i = k + 1; i < n; i++)
        x[k] -= x[i] * L_[(((i) * ((i) + 1)) / 2 + (k))];
      x[k] /= L_[(((k) * ((k) + 1)) / 2 + (k))];
      invA[(((k) * ((k) + 1)) / 2 + (l))] = x[k];
    }
  }
}
```