user: Converte this assembly snippet into its equivalent C code:

```asm
<mtxInvert>:
  endbr64
  push   %r15
  xor    %r15d,%r15d
  push   %r14
  push   %r13
  push   %r12
  push   %rbp
  mov    %rdi,%rbp
  push   %rbx
  mov    %rbp,%rbx
  sub    $0x78,%rsp
  mov    %fs:0x28,%rax
  mov    %rax,0x68(%rsp)
  xor    %eax,%eax
  lea    0x20(%rsp),%r14
  mov    %r14,%rdi
  call   <mtxTranspose@plt>
  mov    %rbp,%rdi
  call   <mtxLoadIdentity@plt>
  lea    0x24(%rsp),%rax
  mov    %r14,0x8(%rsp)
  mov    %rax,0x18(%rsp)
L106:
  mov    0x18(%rsp),%r12
  mov    %r15d,0x14(%rsp)
  lea    0x1(%r15),%r13d
  movss  -0x4(%r12),%xmm6
  movss  %xmm6,0x10(%rsp)
  cmp    $0x3,%r15d
  je     L14
L61:
  movss  (%r12),%xmm0
  call   <fabsf@plt>
  movss  0x10(%rsp),%xmm0
  mov    %rax,(%rsp)
  call   <fabsf@plt>
  cmp    %rax,(%rsp)
  jle    L49
  movss  (%r12),%xmm7
  mov    %r13d,0x14(%rsp)
  movss  %xmm7,0x10(%rsp)
L49:
  add    $0x1,%r13d
  add    $0x4,%r12
  cmp    $0x4,%r13d
  jne    L61
  mov    0x14(%rsp),%edi
  cmp    %r15d,%edi
  je     L14
  movslq %edi,%rcx
  movss  (%rbx),%xmm0
  lea    0xc(%rdi),%r13d
  lea    0x0(,%rcx,4),%rax
  movslq %r13d,%r13
  lea    0x0(%rbp,%rax,1),%rsi
  movss  (%rsi),%xmm1
  movss  %xmm1,(%rbx)
  movss  0x20(%rsp,%rcx,4),%xmm1
  movss  %xmm0,(%rsi)
  movss  (%r14),%xmm0
  lea    0x10(%rbp,%rax,1),%rsi
  movss  %xmm1,(%r14)
  movss  (%rsi),%xmm1
  movss  %xmm0,0x20(%rsp,%rcx,4)
  movss  0x10(%rbx),%xmm0
  lea    0x4(%rdi),%ecx
  movslq %ecx,%rcx
  movss  %xmm1,0x10(%rbx)
  movss  %xmm0,(%rsi)
  movss  0x20(%rsp,%rcx,4),%xmm1
  movss  0x10(%r14),%xmm0
  lea    0x20(%rbp,%rax,1),%rsi
  lea    0x30(%rbp,%rax,1),%rax
  movss  %xmm1,0x10(%r14)
  movss  (%rsi),%xmm1
  movss  %xmm0,0x20(%rsp,%rcx,4)
  movss  0x20(%rbx),%xmm0
  lea    0x8(%rdi),%ecx
  movslq %ecx,%rcx
  movss  %xmm1,0x20(%rbx)
  movss  0x20(%rsp,%rcx,4),%xmm1
  movss  %xmm0,(%rsi)
  movss  0x20(%r14),%xmm0
  movss  %xmm1,0x20(%r14)
  movss  (%rax),%xmm1
  movss  %xmm0,0x20(%rsp,%rcx,4)
  movss  0x30(%rbx),%xmm0
  movss  %xmm1,0x30(%rbx)
  movss  0x20(%rsp,%r13,4),%xmm1
  movss  %xmm0,(%rax)
  movss  0x30(%r14),%xmm0
  movss  %xmm1,0x30(%r14)
  movss  %xmm0,0x20(%rsp,%r13,4)
L14:
  pxor   %xmm0,%xmm0
  ucomiss 0x10(%rsp),%xmm0
  jp     L70
  je     L101
L70:
  movss  0x10(%rbx),%xmm1
  pxor   %xmm0,%xmm0
  divss  0x10(%rsp),%xmm0
  movss  (%r14),%xmm5
  movss  (%rbx),%xmm4
  movss  0x10(%r14),%xmm3
  mulss  %xmm0,%xmm1
  movss  0x20(%r14),%xmm2
  mulss  %xmm0,%xmm5
  mulss  %xmm0,%xmm4
  mulss  %xmm0,%xmm3
  mulss  %xmm0,%xmm2
  movss  %xmm1,0x10(%rbx)
  movss  0x20(%rbx),%xmm1
  movss  %xmm5,(%r14)
  mulss  %xmm0,%xmm1
  movss  %xmm4,(%rbx)
  movss  %xmm3,0x10(%r14)
  movss  %xmm2,0x20(%r14)
  movss  %xmm1,0x20(%rbx)
  movss  0x30(%r14),%xmm1
  mulss  %xmm0,%xmm1
  mulss  0x30(%rbx),%xmm0
  movss  %xmm1,0x30(%r14)
  movss  %xmm0,0x30(%rbx)
  test   %r15,%r15
  je     L37
  mov    0x8(%rsp),%rax
  movss  0x20(%rsp),%xmm6
  movss  (%rax),%xmm0
  mulss  %xmm0,%xmm5
  mulss  %xmm0,%xmm4
  mulss  %xmm0,%xmm3
  mulss  %xmm0,%xmm2
  mulss  %xmm0,%xmm1
  subss  %xmm5,%xmm6
  movss  0x0(%rbp),%xmm5
  subss  %xmm4,%xmm5
  movss  0x30(%rsp),%xmm4
  movss  %xmm6,0x20(%rsp)
  subss  %xmm3,%xmm4
  movss  0x10(%rbp),%xmm3
  movss  %xmm5,0x0(%rbp)
  movss  %xmm4,0x30(%rsp)
  movss  0x10(%rbx),%xmm4
  mulss  %xmm0,%xmm4
  subss  %xmm4,%xmm3
  movss  %xmm3,0x10(%rbp)
  movss  0x40(%rsp),%xmm3
  subss  %xmm2,%xmm3
  movss  0x20(%rbp),%xmm2
  movss  %xmm3,0x40(%rsp)
  movss  0x20(%rbx),%xmm3
  mulss  %xmm0,%xmm3
  subss  %xmm3,%xmm2
  movss  %xmm2,0x20(%rbp)
  mulss  0x30(%rbx),%xmm0
  movss  0x50(%rsp),%xmm2
  subss  %xmm1,%xmm2
  movss  0x30(%rbp),%xmm1
  subss  %xmm0,%xmm1
  movss  %xmm2,0x50(%rsp)
  movss  %xmm1,0x30(%rbp)
  cmp    $0x1,%r15d
  je     L36
L37:
  mov    0x8(%rsp),%rax
  movss  (%r14),%xmm2
  movss  0x24(%rsp),%xmm1
  movss  0x4(%rax),%xmm0
  mulss  %xmm0,%xmm2
  subss  %xmm2,%xmm1
  movss  (%rbx),%xmm2
  mulss  %xmm0,%xmm2
  movss  %xmm1,0x24(%rsp)
  movss  0x4(%rbp),%xmm1
  subss  %xmm2,%xmm1
  movss  0x10(%r14),%xmm2
  mulss  %xmm0,%xmm2
  movss  %xmm1,0x4(%rbp)
  movss  0x34(%rsp),%xmm1
  subss  %xmm2,%xmm1
  movss  0x10(%rbx),%xmm2
  mulss  %xmm0,%xmm2
  movss  %xmm1,0x34(%rsp)
  movss  0x14(%rbp),%xmm1
  subss  %xmm2,%xmm1
  movss  0x20(%r14),%xmm2
  mulss  %xmm0,%xmm2
  movss  %xmm1,0x14(%rbp)
  movss  0x44(%rsp),%xmm1
  subss  %xmm2,%xmm1
  movss  0x20(%rbx),%xmm2
  mulss  %xmm0,%xmm2
  movss  %xmm1,0x44(%rsp)
  movss  0x24(%rbp),%xmm1
  subss  %xmm2,%xmm1
  movss  0x30(%r14),%xmm2
  mulss  %xmm0,%xmm2
  movss  %xmm1,0x24(%rbp)
  movss  0x54(%rsp),%xmm1
  mulss  0x30(%rbx),%xmm0
  subss  %xmm2,%xmm1
  movss  %xmm1,0x54(%rsp)
  movss  0x34(%rbp),%xmm1
  subss  %xmm0,%xmm1
  movss  %xmm1,0x34(%rbp)
  cmp    $0x2,%r15
  je     L18
L36:
  mov    0x8(%rsp),%rax
  movss  (%r14),%xmm2
  movss  0x28(%rsp),%xmm1
  movss  0x8(%rax),%xmm0
  mulss  %xmm0,%xmm2
  subss  %xmm2,%xmm1
  movss  (%rbx),%xmm2
  mulss  %xmm0,%xmm2
  movss  %xmm1,0x28(%rsp)
  movss  0x8(%rbp),%xmm1
  subss  %xmm2,%xmm1
  movss  0x10(%r14),%xmm2
  mulss  %xmm0,%xmm2
  movss  %xmm1,0x8(%rbp)
  movss  0x38(%rsp),%xmm1
  subss  %xmm2,%xmm1
  movss  0x10(%rbx),%xmm2
  mulss  %xmm0,%xmm2
  movss  %xmm1,0x38(%rsp)
  movss  0x18(%rbp),%xmm1
  subss  %xmm2,%xmm1
  movss  0x20(%r14),%xmm2
  mulss  %xmm0,%xmm2
  movss  %xmm1,0x18(%rbp)
  movss  0x48(%rsp),%xmm1
  subss  %xmm2,%xmm1
  movss  0x20(%rbx),%xmm2
  mulss  %xmm0,%xmm2
  movss  %xmm1,0x48(%rsp)
  movss  0x28(%rbp),%xmm1
  subss  %xmm2,%xmm1
  movss  0x30(%r14),%xmm2
  mulss  %xmm0,%xmm2
  movss  %xmm1,0x28(%rbp)
  movss  0x58(%rsp),%xmm1
  mulss  0x30(%rbx),%xmm0
  subss  %xmm2,%xmm1
  movss  %xmm1,0x58(%rsp)
  movss  0x38(%rbp),%xmm1
  subss  %xmm0,%xmm1
  movss  %xmm1,0x38(%rbp)
  cmp    $0x3,%r15
  je     L53
L18:
  mov    0x8(%rsp),%rax
  movss  (%r14),%xmm2
  add    $0x1,%r15
  add    $0x4,%r14
  movss  0x2c(%rsp),%xmm1
  addq   $0x14,0x18(%rsp)
  add    $0x4,%rbx
  movss  0xc(%rax),%xmm0
  add    $0x10,%rax
  mov    %rax,0x8(%rsp)
  mulss  %xmm0,%xmm2
  subss  %xmm2,%xmm1
  movss  -0x4(%rbx),%xmm2
  mulss  %xmm0,%xmm2
  movss  %xmm1,0x2c(%rsp)
  movss  0xc(%rbp),%xmm1
  subss  %xmm2,%xmm1
  movss  0xc(%r14),%xmm2
  mulss  %xmm0,%xmm2
  movss  %xmm1,0xc(%rbp)
  movss  0x3c(%rsp),%xmm1
  subss  %xmm2,%xmm1
  movss  0xc(%rbx),%xmm2
  mulss  %xmm0,%xmm2
  movss  %xmm1,0x3c(%rsp)
  movss  0x1c(%rbp),%xmm1
  subss  %xmm2,%xmm1
  movss  0x1c(%r14),%xmm2
  mulss  %xmm0,%xmm2
  movss  %xmm1,0x1c(%rbp)
  movss  0x4c(%rsp),%xmm1
  subss  %xmm2,%xmm1
  movss  0x1c(%rbx),%xmm2
  mulss  %xmm0,%xmm2
  movss  %xmm1,0x4c(%rsp)
  movss  0x2c(%rbp),%xmm1
  subss  %xmm2,%xmm1
  movss  0x2c(%r14),%xmm2
  mulss  %xmm0,%xmm2
  movss  %xmm1,0x2c(%rbp)
  movss  0x5c(%rsp),%xmm1
  mulss  0x2c(%rbx),%xmm0
  subss  %xmm2,%xmm1
  movss  %xmm1,0x5c(%rsp)
  movss  0x3c(%rbp),%xmm1
  subss  %xmm0,%xmm1
  movss  %xmm1,0x3c(%rbp)
  jmp    L106
  nop
L101:
  mov    %rbp,%rdi
  call   <mtxLoadIdentity@plt>
L53:
  mov    0x68(%rsp),%rax
  sub    %fs:0x28,%rax
  jne    L16
  add    $0x78,%rsp
  pop    %rbx
  pop    %rbp
  pop    %r12
  pop    %r13
  pop    %r14
  pop    %r15
  ret
L16:
  call   <__stack_chk_fail@plt>
```

assistant: ```c
void mtxInvert(float *mtx, const float *src) {
  float tmp[16];
  float val, val2, val_inv, zero, one;
  int i, j, i4, i8, i12, ind;
  mtxTranspose(tmp, src);
  mtxLoadIdentity(mtx);
  for (i = 0; i != 4; i++) {
    val = tmp[(i << 2) + i];
    ind = i;
    i4 = i + 4;
    i8 = i + 8;
    i12 = i + 12;
    for (j = i + 1; j != 4; j++) {
      if (fabsf(tmp[(i << 2) + j]) > fabsf(val)) {
        ind = j;
        val = tmp[(i << 2) + j];
      }
    }
    if (ind != i) {
      val2 = mtx[i];
      mtx[i] = mtx[ind];
      mtx[ind] = val2;
      val2 = tmp[i];
      tmp[i] = tmp[ind];
      tmp[ind] = val2;
      ind += 4;
      val2 = mtx[i4];
      mtx[i4] = mtx[ind];
      mtx[ind] = val2;
      val2 = tmp[i4];
      tmp[i4] = tmp[ind];
      tmp[ind] = val2;
      ind += 4;
      val2 = mtx[i8];
      mtx[i8] = mtx[ind];
      mtx[ind] = val2;
      val2 = tmp[i8];
      tmp[i8] = tmp[ind];
      tmp[ind] = val2;
      ind += 4;
      val2 = mtx[i12];
      mtx[i12] = mtx[ind];
      mtx[ind] = val2;
      val2 = tmp[i12];
      tmp[i12] = tmp[ind];
      tmp[ind] = val2;
    }
    if (val == zero) {
      mtxLoadIdentity(mtx);
      return;
    }
    val_inv = one / val;
    tmp[i] *= val_inv;
    mtx[i] *= val_inv;
    tmp[i4] *= val_inv;
    mtx[i4] *= val_inv;
    tmp[i8] *= val_inv;
    mtx[i8] *= val_inv;
    tmp[i12] *= val_inv;
    mtx[i12] *= val_inv;
    if (i != 0) {
      val = tmp[i << 2];
      tmp[0] -= tmp[i] * val;
      mtx[0] -= mtx[i] * val;
      tmp[4] -= tmp[i4] * val;
      mtx[4] -= mtx[i4] * val;
      tmp[8] -= tmp[i8] * val;
      mtx[8] -= mtx[i8] * val;
      tmp[12] -= tmp[i12] * val;
      mtx[12] -= mtx[i12] * val;
    }
    if (i != 1) {
      val = tmp[(i << 2) + 1];
      tmp[1] -= tmp[i] * val;
      mtx[1] -= mtx[i] * val;
      tmp[5] -= tmp[i4] * val;
      mtx[5] -= mtx[i4] * val;
      tmp[9] -= tmp[i8] * val;
      mtx[9] -= mtx[i8] * val;
      tmp[13] -= tmp[i12] * val;
      mtx[13] -= mtx[i12] * val;
    }
    if (i != 2) {
      val = tmp[(i << 2) + 2];
      tmp[2] -= tmp[i] * val;
      mtx[2] -= mtx[i] * val;
      tmp[6] -= tmp[i4] * val;
      mtx[6] -= mtx[i4] * val;
      tmp[10] -= tmp[i8] * val;
      mtx[10] -= mtx[i8] * val;
      tmp[14] -= tmp[i12] * val;
      mtx[14] -= mtx[i12] * val;
    }
    if (i != 3) {
      val = tmp[(i << 2) + 3];
      tmp[3] -= tmp[i] * val;
      mtx[3] -= mtx[i] * val;
      tmp[7] -= tmp[i4] * val;
      mtx[7] -= mtx[i4] * val;
      tmp[11] -= tmp[i8] * val;
      mtx[11] -= mtx[i8] * val;
      tmp[15] -= tmp[i12] * val;
      mtx[15] -= mtx[i12] * val;
    }
  }
}
```