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

```asm
<matrix_inverse>:
  endbr64
  push   %r12
  push   %rbp
  push   %rbx
  sub    $0x10,%rsp
  mov    %rdi,%r12
  mov    %rsi,%rbx
  mov    %edx,%ebp
  mov    %fs:0x28,%rax
  mov    %rax,0x8(%rsp)
  xor    %eax,%eax
  lea    0x4(%rsp),%rdi
  call   <matrix_determinant@plt>
  cmp    $0x6,%ebp
  je     L10
  jg     L82
  cmp    $0x1,%ebp
  je     L94
  cmp    $0x4,%ebp
  jne    L3
  movss  0x4(%rsp),%xmm1
  movss  0xc(%rbx),%xmm0
  divss  %xmm1,%xmm0
  movss  %xmm0,(%r12)
  movss  0x4(%rbx),%xmm0
  movss  D17(%rip),%xmm2
  xorps  %xmm2,%xmm0
  divss  %xmm1,%xmm0
  movss  %xmm0,0x4(%r12)
  movss  0x8(%rbx),%xmm0
  xorps  %xmm2,%xmm0
  divss  %xmm1,%xmm0
  movss  %xmm0,0x8(%r12)
  movss  (%rbx),%xmm0
  divss  %xmm1,%xmm0
  movss  %xmm0,0xc(%r12)
  jmp    L25
L82:
  cmp    $0x9,%ebp
  jne    L3
  movss  0x4(%rsp),%xmm0
  movss  0x10(%rbx),%xmm1
  mulss  0x20(%rbx),%xmm1
  movss  0x14(%rbx),%xmm2
  mulss  0x1c(%rbx),%xmm2
  subss  %xmm2,%xmm1
  divss  %xmm0,%xmm1
  movss  %xmm1,(%r12)
  movss  0x8(%rbx),%xmm1
  mulss  0x1c(%rbx),%xmm1
  movss  0x4(%rbx),%xmm2
  mulss  0x20(%rbx),%xmm2
  subss  %xmm2,%xmm1
  divss  %xmm0,%xmm1
  movss  %xmm1,0x4(%r12)
  movss  0x4(%rbx),%xmm1
  mulss  0x14(%rbx),%xmm1
  movss  0x8(%rbx),%xmm2
  mulss  0x10(%rbx),%xmm2
  subss  %xmm2,%xmm1
  divss  %xmm0,%xmm1
  movss  %xmm1,0x8(%r12)
  movss  0x14(%rbx),%xmm1
  mulss  0x18(%rbx),%xmm1
  movss  0xc(%rbx),%xmm2
  mulss  0x20(%rbx),%xmm2
  subss  %xmm2,%xmm1
  divss  %xmm0,%xmm1
  movss  %xmm1,0xc(%r12)
  movss  (%rbx),%xmm1
  mulss  0x20(%rbx),%xmm1
  movss  0x8(%rbx),%xmm2
  mulss  0x18(%rbx),%xmm2
  subss  %xmm2,%xmm1
  divss  %xmm0,%xmm1
  movss  %xmm1,0x10(%r12)
  movss  0x8(%rbx),%xmm1
  mulss  0xc(%rbx),%xmm1
  movss  (%rbx),%xmm2
  mulss  0x14(%rbx),%xmm2
  subss  %xmm2,%xmm1
  divss  %xmm0,%xmm1
  movss  %xmm1,0x14(%r12)
  movss  0xc(%rbx),%xmm1
  mulss  0x1c(%rbx),%xmm1
  movss  0x10(%rbx),%xmm2
  mulss  0x18(%rbx),%xmm2
  subss  %xmm2,%xmm1
  divss  %xmm0,%xmm1
  movss  %xmm1,0x18(%r12)
  movss  0x4(%rbx),%xmm1
  mulss  0x18(%rbx),%xmm1
  movss  (%rbx),%xmm2
  mulss  0x1c(%rbx),%xmm2
  subss  %xmm2,%xmm1
  divss  %xmm0,%xmm1
  movss  %xmm1,0x1c(%r12)
  movss  (%rbx),%xmm1
  mulss  0x10(%rbx),%xmm1
  movss  0x4(%rbx),%xmm2
  mulss  0xc(%rbx),%xmm2
  subss  %xmm2,%xmm1
  divss  %xmm0,%xmm1
  movss  %xmm1,0x20(%r12)
  jmp    L25
L94:
  movss  D39(%rip),%xmm0
  divss  (%rbx),%xmm0
  movss  %xmm0,(%r12)
L25:
  mov    %ebp,%eax
L65:
  mov    0x8(%rsp),%rdx
  sub    %fs:0x28,%rdx
  jne    L41
  add    $0x10,%rsp
  pop    %rbx
  pop    %rbp
  pop    %r12
  ret
L10:
  movss  0x4(%rsp),%xmm1
  movss  0x10(%rbx),%xmm0
  divss  %xmm1,%xmm0
  movss  %xmm0,(%r12)
  movss  0x4(%rbx),%xmm0
  movss  D17(%rip),%xmm3
  xorps  %xmm3,%xmm0
  divss  %xmm1,%xmm0
  movss  %xmm0,0x4(%r12)
  movss  0x4(%rbx),%xmm0
  mulss  0x14(%rbx),%xmm0
  movss  0x8(%rbx),%xmm2
  mulss  0x10(%rbx),%xmm2
  subss  %xmm2,%xmm0
  divss  %xmm1,%xmm0
  movss  %xmm0,0x8(%r12)
  movss  0xc(%rbx),%xmm0
  xorps  %xmm3,%xmm0
  divss  %xmm1,%xmm0
  movss  %xmm0,0xc(%r12)
  movss  (%rbx),%xmm0
  divss  %xmm1,%xmm0
  movss  %xmm0,0x10(%r12)
  movss  0x8(%rbx),%xmm0
  mulss  0xc(%rbx),%xmm0
  movss  (%rbx),%xmm2
  mulss  0x14(%rbx),%xmm2
  subss  %xmm2,%xmm0
  divss  %xmm1,%xmm0
  movss  %xmm0,0x14(%r12)
  jmp    L25
L3:
  mov    %ebp,%esi
  lea    D7(%rip),%rdi
  call   <fail@plt>
  jmp    L65
L41:
  call   <__stack_chk_fail@plt>
```

tool_calls: name: unpack_data
arguments: label: D17
type: byte[4]
name: unpack_data
arguments: label: D39
type: byte[4]
name: unpack_data
arguments: label: D7
type: string

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

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

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