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

```asm
<matrix_inverse>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  sub    $0x30,%rsp
  mov    %rdi,-0x18(%rbp)
  mov    %rsi,-0x20(%rbp)
  mov    %edx,-0x24(%rbp)
  mov    %fs:0x28,%rax
  mov    %rax,-0x8(%rbp)
  xor    %eax,%eax
  mov    -0x24(%rbp),%edx
  mov    -0x20(%rbp),%rcx
  lea    -0xc(%rbp),%rax
  mov    %rcx,%rsi
  mov    %rax,%rdi
  call   <matrix_determinant@plt>
  cmpl   $0x9,-0x24(%rbp)
  je     L83
  cmpl   $0x9,-0x24(%rbp)
  jg     L119
  cmpl   $0x6,-0x24(%rbp)
  je     L91
  cmpl   $0x6,-0x24(%rbp)
  jg     L119
  cmpl   $0x1,-0x24(%rbp)
  je     L118
  cmpl   $0x4,-0x24(%rbp)
  je     L117
  jmp    L119
L118:
  mov    -0x20(%rbp),%rax
  movss  (%rax),%xmm1
  movss  D56(%rip),%xmm0
  divss  %xmm1,%xmm0
  mov    -0x18(%rbp),%rax
  movss  %xmm0,(%rax)
  mov    $0x1,%eax
  jmp    L113
L117:
  mov    -0x20(%rbp),%rax
  add    $0xc,%rax
  movss  (%rax),%xmm0
  movss  -0xc(%rbp),%xmm1
  divss  %xmm1,%xmm0
  mov    -0x18(%rbp),%rax
  movss  %xmm0,(%rax)
  mov    -0x20(%rbp),%rax
  add    $0x4,%rax
  movss  (%rax),%xmm0
  movss  D1(%rip),%xmm1
  xorps  %xmm1,%xmm0
  movss  -0xc(%rbp),%xmm1
  mov    -0x18(%rbp),%rax
  add    $0x4,%rax
  divss  %xmm1,%xmm0
  movss  %xmm0,(%rax)
  mov    -0x20(%rbp),%rax
  add    $0x8,%rax
  movss  (%rax),%xmm0
  movss  D1(%rip),%xmm1
  xorps  %xmm1,%xmm0
  movss  -0xc(%rbp),%xmm1
  mov    -0x18(%rbp),%rax
  add    $0x8,%rax
  divss  %xmm1,%xmm0
  movss  %xmm0,(%rax)
  mov    -0x20(%rbp),%rax
  movss  (%rax),%xmm0
  movss  -0xc(%rbp),%xmm1
  mov    -0x18(%rbp),%rax
  add    $0xc,%rax
  divss  %xmm1,%xmm0
  movss  %xmm0,(%rax)
  mov    $0x4,%eax
  jmp    L113
L91:
  mov    -0x20(%rbp),%rax
  add    $0x10,%rax
  movss  (%rax),%xmm0
  movss  -0xc(%rbp),%xmm1
  divss  %xmm1,%xmm0
  mov    -0x18(%rbp),%rax
  movss  %xmm0,(%rax)
  mov    -0x20(%rbp),%rax
  add    $0x4,%rax
  movss  (%rax),%xmm0
  movss  D1(%rip),%xmm1
  xorps  %xmm1,%xmm0
  movss  -0xc(%rbp),%xmm1
  mov    -0x18(%rbp),%rax
  add    $0x4,%rax
  divss  %xmm1,%xmm0
  movss  %xmm0,(%rax)
  mov    -0x20(%rbp),%rax
  add    $0x4,%rax
  movss  (%rax),%xmm1
  mov    -0x20(%rbp),%rax
  add    $0x14,%rax
  movss  (%rax),%xmm0
  mulss  %xmm1,%xmm0
  mov    -0x20(%rbp),%rax
  add    $0x8,%rax
  movss  (%rax),%xmm2
  mov    -0x20(%rbp),%rax
  add    $0x10,%rax
  movss  (%rax),%xmm1
  mulss  %xmm2,%xmm1
  subss  %xmm1,%xmm0
  movss  -0xc(%rbp),%xmm1
  mov    -0x18(%rbp),%rax
  add    $0x8,%rax
  divss  %xmm1,%xmm0
  movss  %xmm0,(%rax)
  mov    -0x20(%rbp),%rax
  add    $0xc,%rax
  movss  (%rax),%xmm0
  movss  D1(%rip),%xmm1
  xorps  %xmm1,%xmm0
  movss  -0xc(%rbp),%xmm1
  mov    -0x18(%rbp),%rax
  add    $0xc,%rax
  divss  %xmm1,%xmm0
  movss  %xmm0,(%rax)
  mov    -0x20(%rbp),%rax
  movss  (%rax),%xmm0
  movss  -0xc(%rbp),%xmm1
  mov    -0x18(%rbp),%rax
  add    $0x10,%rax
  divss  %xmm1,%xmm0
  movss  %xmm0,(%rax)
  mov    -0x20(%rbp),%rax
  add    $0x8,%rax
  movss  (%rax),%xmm1
  mov    -0x20(%rbp),%rax
  add    $0xc,%rax
  movss  (%rax),%xmm0
  mulss  %xmm1,%xmm0
  mov    -0x20(%rbp),%rax
  movss  (%rax),%xmm2
  mov    -0x20(%rbp),%rax
  add    $0x14,%rax
  movss  (%rax),%xmm1
  mulss  %xmm2,%xmm1
  subss  %xmm1,%xmm0
  movss  -0xc(%rbp),%xmm1
  mov    -0x18(%rbp),%rax
  add    $0x14,%rax
  divss  %xmm1,%xmm0
  movss  %xmm0,(%rax)
  mov    $0x6,%eax
  jmp    L113
L83:
  mov    -0x20(%rbp),%rax
  add    $0x10,%rax
  movss  (%rax),%xmm1
  mov    -0x20(%rbp),%rax
  add    $0x20,%rax
  movss  (%rax),%xmm0
  mulss  %xmm1,%xmm0
  mov    -0x20(%rbp),%rax
  add    $0x14,%rax
  movss  (%rax),%xmm2
  mov    -0x20(%rbp),%rax
  add    $0x1c,%rax
  movss  (%rax),%xmm1
  mulss  %xmm2,%xmm1
  subss  %xmm1,%xmm0
  movss  -0xc(%rbp),%xmm1
  divss  %xmm1,%xmm0
  mov    -0x18(%rbp),%rax
  movss  %xmm0,(%rax)
  mov    -0x20(%rbp),%rax
  add    $0x8,%rax
  movss  (%rax),%xmm1
  mov    -0x20(%rbp),%rax
  add    $0x1c,%rax
  movss  (%rax),%xmm0
  mulss  %xmm1,%xmm0
  mov    -0x20(%rbp),%rax
  add    $0x4,%rax
  movss  (%rax),%xmm2
  mov    -0x20(%rbp),%rax
  add    $0x20,%rax
  movss  (%rax),%xmm1
  mulss  %xmm2,%xmm1
  subss  %xmm1,%xmm0
  movss  -0xc(%rbp),%xmm1
  mov    -0x18(%rbp),%rax
  add    $0x4,%rax
  divss  %xmm1,%xmm0
  movss  %xmm0,(%rax)
  mov    -0x20(%rbp),%rax
  add    $0x4,%rax
  movss  (%rax),%xmm1
  mov    -0x20(%rbp),%rax
  add    $0x14,%rax
  movss  (%rax),%xmm0
  mulss  %xmm1,%xmm0
  mov    -0x20(%rbp),%rax
  add    $0x8,%rax
  movss  (%rax),%xmm2
  mov    -0x20(%rbp),%rax
  add    $0x10,%rax
  movss  (%rax),%xmm1
  mulss  %xmm2,%xmm1
  subss  %xmm1,%xmm0
  movss  -0xc(%rbp),%xmm1
  mov    -0x18(%rbp),%rax
  add    $0x8,%rax
  divss  %xmm1,%xmm0
  movss  %xmm0,(%rax)
  mov    -0x20(%rbp),%rax
  add    $0x14,%rax
  movss  (%rax),%xmm1
  mov    -0x20(%rbp),%rax
  add    $0x18,%rax
  movss  (%rax),%xmm0
  mulss  %xmm1,%xmm0
  mov    -0x20(%rbp),%rax
  add    $0xc,%rax
  movss  (%rax),%xmm2
  mov    -0x20(%rbp),%rax
  add    $0x20,%rax
  movss  (%rax),%xmm1
  mulss  %xmm2,%xmm1
  subss  %xmm1,%xmm0
  movss  -0xc(%rbp),%xmm1
  mov    -0x18(%rbp),%rax
  add    $0xc,%rax
  divss  %xmm1,%xmm0
  movss  %xmm0,(%rax)
  mov    -0x20(%rbp),%rax
  movss  (%rax),%xmm1
  mov    -0x20(%rbp),%rax
  add    $0x20,%rax
  movss  (%rax),%xmm0
  mulss  %xmm1,%xmm0
  mov    -0x20(%rbp),%rax
  add    $0x8,%rax
  movss  (%rax),%xmm2
  mov    -0x20(%rbp),%rax
  add    $0x18,%rax
  movss  (%rax),%xmm1
  mulss  %xmm2,%xmm1
  subss  %xmm1,%xmm0
  movss  -0xc(%rbp),%xmm1
  mov    -0x18(%rbp),%rax
  add    $0x10,%rax
  divss  %xmm1,%xmm0
  movss  %xmm0,(%rax)
  mov    -0x20(%rbp),%rax
  add    $0x8,%rax
  movss  (%rax),%xmm1
  mov    -0x20(%rbp),%rax
  add    $0xc,%rax
  movss  (%rax),%xmm0
  mulss  %xmm1,%xmm0
  mov    -0x20(%rbp),%rax
  movss  (%rax),%xmm2
  mov    -0x20(%rbp),%rax
  add    $0x14,%rax
  movss  (%rax),%xmm1
  mulss  %xmm2,%xmm1
  subss  %xmm1,%xmm0
  movss  -0xc(%rbp),%xmm1
  mov    -0x18(%rbp),%rax
  add    $0x14,%rax
  divss  %xmm1,%xmm0
  movss  %xmm0,(%rax)
  mov    -0x20(%rbp),%rax
  add    $0xc,%rax
  movss  (%rax),%xmm1
  mov    -0x20(%rbp),%rax
  add    $0x1c,%rax
  movss  (%rax),%xmm0
  mulss  %xmm1,%xmm0
  mov    -0x20(%rbp),%rax
  add    $0x10,%rax
  movss  (%rax),%xmm2
  mov    -0x20(%rbp),%rax
  add    $0x18,%rax
  movss  (%rax),%xmm1
  mulss  %xmm2,%xmm1
  subss  %xmm1,%xmm0
  movss  -0xc(%rbp),%xmm1
  mov    -0x18(%rbp),%rax
  add    $0x18,%rax
  divss  %xmm1,%xmm0
  movss  %xmm0,(%rax)
  mov    -0x20(%rbp),%rax
  add    $0x4,%rax
  movss  (%rax),%xmm1
  mov    -0x20(%rbp),%rax
  add    $0x18,%rax
  movss  (%rax),%xmm0
  mulss  %xmm1,%xmm0
  mov    -0x20(%rbp),%rax
  movss  (%rax),%xmm2
  mov    -0x20(%rbp),%rax
  add    $0x1c,%rax
  movss  (%rax),%xmm1
  mulss  %xmm2,%xmm1
  subss  %xmm1,%xmm0
  movss  -0xc(%rbp),%xmm1
  mov    -0x18(%rbp),%rax
  add    $0x1c,%rax
  divss  %xmm1,%xmm0
  movss  %xmm0,(%rax)
  mov    -0x20(%rbp),%rax
  movss  (%rax),%xmm1
  mov    -0x20(%rbp),%rax
  add    $0x10,%rax
  movss  (%rax),%xmm0
  mulss  %xmm1,%xmm0
  mov    -0x20(%rbp),%rax
  add    $0x4,%rax
  movss  (%rax),%xmm2
  mov    -0x20(%rbp),%rax
  add    $0xc,%rax
  movss  (%rax),%xmm1
  mulss  %xmm2,%xmm1
  subss  %xmm1,%xmm0
  movss  -0xc(%rbp),%xmm1
  mov    -0x18(%rbp),%rax
  add    $0x20,%rax
  divss  %xmm1,%xmm0
  movss  %xmm0,(%rax)
  mov    $0x9,%eax
  jmp    L113
L119:
  mov    -0x24(%rbp),%eax
  mov    %eax,%esi
  lea    D49(%rip),%rax
  mov    %rax,%rdi
  call   <fail@plt>
L113:
  mov    -0x8(%rbp),%rdx
  sub    %fs:0x28,%rdx
  je     L75
  call   <__stack_chk_fail@plt>
L75:
  leave
  ret
```

tool_calls: name: extract_symbolic_data
arguments: tag: D56
data_type: byte[4]
name: extract_symbolic_data
arguments: tag: D1
data_type: byte[4]
name: extract_symbolic_data
arguments: tag: D49
data_type: string

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

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

tool: D49: can not compute inversion of object of size %d

assistant: ```c
int matrix_inverse(float *r, float *a, int n) {
  float det;
  matrix_determinant(&det, a, n);
  switch (n) {
  case 1:
    r[0] = 1 / a[0];
    return 1;
  case 4:
    r[0] = a[3] / det;
    r[1] = -a[1] / det;
    r[2] = -a[2] / det;
    r[3] = a[0] / det;
    return 4;
  case 6:
    r[0] = a[4] / det;
    r[1] = -a[1] / det;
    r[2] = (a[1] * a[5] - a[2] * a[4]) / det;
    r[3] = -a[3] / det;
    r[4] = a[0] / det;
    r[5] = (a[2] * a[3] - a[0] * a[5]) / det;
    return 6;
  case 9:
    r[0] = (a[4] * a[8] - a[5] * a[7]) / det;
    r[1] = (a[2] * a[7] - a[1] * a[8]) / det;
    r[2] = (a[1] * a[5] - a[2] * a[4]) / det;
    r[3] = (a[5] * a[6] - a[3] * a[8]) / det;
    r[4] = (a[0] * a[8] - a[2] * a[6]) / det;
    r[5] = (a[2] * a[3] - a[0] * a[5]) / det;
    r[6] = (a[3] * a[7] - a[4] * a[6]) / det;
    r[7] = (a[1] * a[6] - a[0] * a[7]) / det;
    r[8] = (a[0] * a[4] - a[1] * a[3]) / det;
    return 9;
  default:
    fail("can not compute inversion of object of size %d", n);
  }
}
```