user: Translate the below assembly code into C programming language:

```asm
<fz_invert3x3>:
  endbr64
  movss  0x10(%rsi),%xmm4
  movss  0x1c(%rsi),%xmm1
  mov    %rdi,%rdx
  mov    %rsi,%rax
  movss  0x20(%rsi),%xmm2
  movss  0x14(%rsi),%xmm5
  movaps %xmm4,%xmm0
  movaps %xmm1,%xmm3
  movss  0xc(%rsi),%xmm7
  movss  0x18(%rsi),%xmm6
  mulss  %xmm5,%xmm3
  mulss  %xmm2,%xmm0
  mulss  %xmm6,%xmm5
  mulss  %xmm7,%xmm2
  mulss  %xmm7,%xmm1
  mulss  %xmm6,%xmm4
  subss  %xmm3,%xmm0
  movss  (%rsi),%xmm3
  subss  %xmm5,%xmm2
  mulss  0x4(%rsi),%xmm2
  mulss  %xmm0,%xmm3
  subss  %xmm4,%xmm1
  mulss  0x8(%rsi),%xmm1
  subss  %xmm2,%xmm3
  addss  %xmm1,%xmm3
  ucomiss D14(%rip),%xmm3
  movaps %xmm3,%xmm2
  jp     L20
  movss  D25(%rip),%xmm1
  jne    L20
L12:
  movss  %xmm0,(%rdx)
  movss  0x4(%rax),%xmm2
  movss  0x8(%rax),%xmm0
  movaps %xmm1,%xmm3
  mulss  0x20(%rax),%xmm2
  shufps $0x0,%xmm3,%xmm3
  mulss  0x1c(%rax),%xmm0
  subss  %xmm2,%xmm0
  movss  %xmm0,0x4(%rdx)
  movss  0x4(%rax),%xmm0
  movss  0x8(%rax),%xmm2
  mulss  0x14(%rax),%xmm0
  mulss  0x10(%rax),%xmm2
  subss  %xmm2,%xmm0
  movss  %xmm0,0x8(%rdx)
  movss  0xc(%rax),%xmm2
  movss  0x14(%rax),%xmm0
  mulss  0x20(%rax),%xmm2
  mulss  0x18(%rax),%xmm0
  subss  %xmm2,%xmm0
  movss  %xmm0,0xc(%rdx)
  movss  (%rax),%xmm0
  movss  0x8(%rax),%xmm2
  mulss  0x20(%rax),%xmm0
  mulss  0x18(%rax),%xmm2
  subss  %xmm2,%xmm0
  movss  %xmm0,0x10(%rdx)
  movss  (%rax),%xmm2
  movss  0x8(%rax),%xmm0
  mulss  0x14(%rax),%xmm2
  mulss  0xc(%rax),%xmm0
  subss  %xmm2,%xmm0
  movss  %xmm0,0x14(%rdx)
  movss  0xc(%rax),%xmm0
  movss  0x10(%rax),%xmm2
  mulss  0x1c(%rax),%xmm0
  mulss  0x18(%rax),%xmm2
  subss  %xmm2,%xmm0
  movss  %xmm0,0x18(%rdx)
  movss  (%rax),%xmm2
  mulss  0x1c(%rax),%xmm2
  movss  0x4(%rax),%xmm0
  mulss  0x18(%rax),%xmm0
  subss  %xmm2,%xmm0
  movss  %xmm0,0x1c(%rdx)
  movss  (%rax),%xmm0
  movss  0x4(%rax),%xmm2
  mulss  0x10(%rax),%xmm0
  mulss  0xc(%rax),%xmm2
  subss  %xmm2,%xmm0
  movups (%rdx),%xmm2
  mulps  %xmm3,%xmm2
  mulss  %xmm1,%xmm0
  movups %xmm2,(%rdx)
  movups 0x10(%rdx),%xmm2
  movss  %xmm0,0x20(%rdx)
  mulps  %xmm3,%xmm2
  movups %xmm2,0x10(%rdx)
  ret
  nopw   0x0(%rax,%rax,1)
L20:
  movss  D25(%rip),%xmm1
  divss  %xmm2,%xmm1
  jmp    L12
```

tool_calls: name: read_data
arguments: data_label: D14
type: byte[4]
name: read_data
arguments: data_label: D25
type: f32

tool: {"D14": [0x00,0x00,0x00,0x00]}

tool: D25: 1

assistant: ```c
void fz_invert3x3(float *dst, float *m) {
  float det;
  int i;
  det = ((m)[3 * 0 + 0] * ((m)[3 * 1 + 1] * (m)[3 * 2 + 2] - (m)[3 * 2 + 1] * (m)[3 * 1 + 2])) - ((m)[3 * 0 + 1] * ((m)[3 * 1 + 0] * (m)[3 * 2 + 2] - (m)[3 * 2 + 0] * (m)[3 * 1 + 2])) + ((m)[3 * 0 + 2] * ((m)[3 * 1 + 0] * (m)[3 * 2 + 1] - (m)[3 * 2 + 0] * (m)[3 * 1 + 1]));
  if (det == 0)
    det = 1.0;
  det = 1.0 / det;
  (dst)[3 * 0 + 0] = (m)[3 * 1 + 1] * (m)[3 * 2 + 2] - (m)[3 * 1 + 2] * (m)[3 * 2 + 1];
  (dst)[3 * 0 + 1] = -(m)[3 * 0 + 1] * (m)[3 * 2 + 2] + (m)[3 * 0 + 2] * (m)[3 * 2 + 1];
  (dst)[3 * 0 + 2] = (m)[3 * 0 + 1] * (m)[3 * 1 + 2] - (m)[3 * 0 + 2] * (m)[3 * 1 + 1];
  (dst)[3 * 1 + 0] = -(m)[3 * 1 + 0] * (m)[3 * 2 + 2] + (m)[3 * 1 + 2] * (m)[3 * 2 + 0];
  (dst)[3 * 1 + 1] = (m)[3 * 0 + 0] * (m)[3 * 2 + 2] - (m)[3 * 0 + 2] * (m)[3 * 2 + 0];
  (dst)[3 * 1 + 2] = -(m)[3 * 0 + 0] * (m)[3 * 1 + 2] + (m)[3 * 0 + 2] * (m)[3 * 1 + 0];
  (dst)[3 * 2 + 0] = (m)[3 * 1 + 0] * (m)[3 * 2 + 1] - (m)[3 * 1 + 1] * (m)[3 * 2 + 0];
  (dst)[3 * 2 + 1] = -(m)[3 * 0 + 0] * (m)[3 * 2 + 1] + (m)[3 * 0 + 1] * (m)[3 * 2 + 0];
  (dst)[3 * 2 + 2] = (m)[3 * 0 + 0] * (m)[3 * 1 + 1] - (m)[3 * 0 + 1] * (m)[3 * 1 + 0];
  for (i = 0; i < 9; i++)
    dst[i] *= det;
}
```