user: 下面的汇编指令对应的C源代码是什么：

```asm
<matrix_inverse>:
  endbr64
  push   %r12
  mov    %rdi,%r12
  push   %rbp
  mov    %edx,%ebp
  push   %rbx
  mov    %rsi,%rbx
  sub    $0x10,%rsp
  mov    %fs:0x28,%rax
  mov    %rax,0x8(%rsp)
  xor    %eax,%eax
  lea    0x4(%rsp),%rdi
  call   <matrix_determinant@plt>
  cmp    $0x6,%ebp
  je     L15
  jg     L67
  cmp    $0x1,%ebp
  je     L29
  cmp    $0x4,%ebp
  jne    L26
  movss  0xc(%rbx),%xmm0
  movss  0x4(%rsp),%xmm1
  movss  D12(%rip),%xmm2
  divss  %xmm1,%xmm0
  movss  %xmm0,(%r12)
  movss  0x4(%rbx),%xmm0
  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)
L4:
  mov    %ebp,%eax
L20:
  mov    0x8(%rsp),%rdx
  sub    %fs:0x28,%rdx
  jne    L80
  add    $0x10,%rsp
  pop    %rbx
  pop    %rbp
  pop    %r12
  ret
L67:
  cmp    $0x9,%ebp
  jne    L26
  movss  0x10(%rbx),%xmm1
  movss  0x14(%rbx),%xmm2
  mulss  0x20(%rbx),%xmm1
  movss  0x4(%rsp),%xmm0
  mulss  0x1c(%rbx),%xmm2
  subss  %xmm2,%xmm1
  divss  %xmm0,%xmm1
  movss  %xmm1,(%r12)
  movss  0x8(%rbx),%xmm1
  movss  0x4(%rbx),%xmm2
  mulss  0x1c(%rbx),%xmm1
  mulss  0x20(%rbx),%xmm2
  subss  %xmm2,%xmm1
  divss  %xmm0,%xmm1
  movss  %xmm1,0x4(%r12)
  movss  0x4(%rbx),%xmm1
  movss  0x8(%rbx),%xmm2
  mulss  0x14(%rbx),%xmm1
  mulss  0x10(%rbx),%xmm2
  subss  %xmm2,%xmm1
  divss  %xmm0,%xmm1
  movss  %xmm1,0x8(%r12)
  movss  0x14(%rbx),%xmm1
  movss  0xc(%rbx),%xmm2
  mulss  0x18(%rbx),%xmm1
  mulss  0x20(%rbx),%xmm2
  subss  %xmm2,%xmm1
  divss  %xmm0,%xmm1
  movss  %xmm1,0xc(%r12)
  movss  (%rbx),%xmm1
  movss  0x8(%rbx),%xmm2
  mulss  0x20(%rbx),%xmm1
  mulss  0x18(%rbx),%xmm2
  subss  %xmm2,%xmm1
  divss  %xmm0,%xmm1
  movss  %xmm1,0x10(%r12)
  movss  0x8(%rbx),%xmm1
  movss  (%rbx),%xmm2
  mulss  0xc(%rbx),%xmm1
  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
  movss  (%rbx),%xmm2
  mulss  0x18(%rbx),%xmm1
  mulss  0x1c(%rbx),%xmm2
  subss  %xmm2,%xmm1
  divss  %xmm0,%xmm1
  movss  %xmm1,0x1c(%r12)
  movss  (%rbx),%xmm1
  movss  0x4(%rbx),%xmm2
  mulss  0x10(%rbx),%xmm1
  mulss  0xc(%rbx),%xmm2
  subss  %xmm2,%xmm1
  divss  %xmm0,%xmm1
  movss  %xmm1,0x20(%r12)
  jmp    L4
  nopw   0x0(%rax,%rax,1)
L15:
  movss  0x10(%rbx),%xmm0
  movss  0x4(%rsp),%xmm1
  movss  D12(%rip),%xmm3
  divss  %xmm1,%xmm0
  movss  %xmm0,(%r12)
  movss  0x4(%rbx),%xmm0
  xorps  %xmm3,%xmm0
  divss  %xmm1,%xmm0
  movss  %xmm0,0x4(%r12)
  movss  0x4(%rbx),%xmm0
  movss  0x8(%rbx),%xmm2
  mulss  0x14(%rbx),%xmm0
  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
  movss  (%rbx),%xmm2
  mulss  0xc(%rbx),%xmm0
  mulss  0x14(%rbx),%xmm2
  subss  %xmm2,%xmm0
  divss  %xmm1,%xmm0
  movss  %xmm0,0x14(%r12)
  jmp    L4
  nopl   0x0(%rax)
L26:
  mov    %ebp,%esi
  lea    D14(%rip),%rdi
  call   <fail@plt>
  jmp    L20
  nopl   0x0(%rax,%rax,1)
L29:
  movss  D21(%rip),%xmm0
  divss  (%rbx),%xmm0
  movss  %xmm0,(%r12)
  jmp    L4
L80:
  call   <__stack_chk_fail@plt>
```

tool_calls: name: read_data
arguments: label: D12
type_guessed: byte[4]
name: read_data
arguments: label: D14
type_guessed: string
name: read_data
arguments: label: D21
type_guessed: byte[4]

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

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

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

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