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

```asm
<mat4_lookAt>:
  endbr64
  push   %r15
  push   %r14
  push   %r13
  push   %r12
  push   %rbp
  push   %rbx
  sub    $0x38,%rsp
  mov    %rdi,%rbx
  movss  (%rsi),%xmm6
  movss  %xmm6,0x20(%rsp)
  movss  0x4(%rsi),%xmm2
  movss  %xmm2,0x10(%rsp)
  movss  0x8(%rsi),%xmm3
  movss  %xmm3,0x14(%rsp)
  mov    (%rcx),%r12d
  mov    0x4(%rcx),%ebp
  mov    0x8(%rcx),%r13d
  mov    0x4(%rdx),%r14d
  mov    0x8(%rdx),%r15d
  subss  (%rdx),%xmm6
  movss  %xmm6,0xc(%rsp)
  movaps %xmm6,%xmm0
  call   <fabs@plt>
  movsd  D69(%rip),%xmm1
  comisd %xmm0,%xmm1
  jbe    L85
  movss  0x10(%rsp),%xmm0
  movd   %r14d,%xmm5
  subss  %xmm5,%xmm0
  call   <fabs@plt>
  movsd  D69(%rip),%xmm1
  comisd %xmm0,%xmm1
  ja     L68
L85:
  movss  0x10(%rsp),%xmm5
  movd   %r14d,%xmm7
  subss  %xmm7,%xmm5
  movss  0x14(%rsp),%xmm7
  movd   %r15d,%xmm2
  subss  %xmm2,%xmm7
  movss  0xc(%rsp),%xmm6
  movaps %xmm6,%xmm0
  mulss  %xmm6,%xmm0
  movaps %xmm5,%xmm1
  movss  %xmm5,0x18(%rsp)
  mulss  %xmm5,%xmm1
  addss  %xmm1,%xmm0
  movaps %xmm7,%xmm1
  movss  %xmm7,0x1c(%rsp)
  mulss  %xmm7,%xmm1
  addss  %xmm1,%xmm0
  call   <sqrtf@plt>
  mov    %eax,%ecx
  mov    $0x1,%eax
  cltd
  idiv   %ecx
  pxor   %xmm0,%xmm0
  cvtsi2ss %eax,%xmm0
  movss  0xc(%rsp),%xmm6
  mulss  %xmm0,%xmm6
  movss  %xmm6,0xc(%rsp)
  movss  0x18(%rsp),%xmm5
  mulss  %xmm0,%xmm5
  movss  %xmm5,0x18(%rsp)
  mulss  0x1c(%rsp),%xmm0
  movaps %xmm0,%xmm4
  movss  %xmm0,0x1c(%rsp)
  movd   %ebp,%xmm1
  mulss  %xmm0,%xmm1
  movd   %r13d,%xmm0
  mulss  %xmm5,%xmm0
  movaps %xmm1,%xmm3
  subss  %xmm0,%xmm3
  movss  %xmm3,0x24(%rsp)
  movd   %r13d,%xmm1
  mulss  %xmm6,%xmm1
  movd   %r12d,%xmm0
  mulss  %xmm4,%xmm0
  movaps %xmm1,%xmm2
  subss  %xmm0,%xmm2
  movss  %xmm2,0x28(%rsp)
  movd   %r12d,%xmm1
  mulss  %xmm5,%xmm1
  movd   %ebp,%xmm0
  mulss  %xmm6,%xmm0
  movaps %xmm1,%xmm4
  subss  %xmm0,%xmm4
  movss  %xmm4,0x2c(%rsp)
  movaps %xmm3,%xmm0
  mulss  %xmm3,%xmm0
  movaps %xmm2,%xmm1
  mulss  %xmm2,%xmm1
  addss  %xmm1,%xmm0
  movaps %xmm4,%xmm1
  mulss  %xmm4,%xmm1
  addss  %xmm1,%xmm0
  call   <sqrtf@plt>
  pxor   %xmm0,%xmm0
  cvtsi2ss %eax,%xmm0
  ucomiss D81(%rip),%xmm0
  jp     L37
  jne    L37
  mov    D81(%rip),%r12d
  mov    %r12d,%r13d
  mov    %r12d,%ebp
  jmp    L16
L68:
  movss  0x14(%rsp),%xmm0
  movd   %r15d,%xmm5
  subss  %xmm5,%xmm0
  call   <fabs@plt>
  movsd  D69(%rip),%xmm1
  comisd %xmm0,%xmm1
  jbe    L85
  mov    %rbx,%rdi
  call   <mat4_identity@plt>
  jmp    L26
L37:
  movss  D28(%rip),%xmm1
  divss  %xmm0,%xmm1
  movss  0x24(%rsp),%xmm5
  mulss  %xmm1,%xmm5
  movd   %xmm5,%ebp
  movss  0x28(%rsp),%xmm3
  mulss  %xmm1,%xmm3
  movd   %xmm3,%r13d
  mulss  0x2c(%rsp),%xmm1
  movd   %xmm1,%r12d
L16:
  movd   %r13d,%xmm1
  movss  0x1c(%rsp),%xmm4
  mulss  %xmm4,%xmm1
  movd   %r12d,%xmm0
  movss  0x18(%rsp),%xmm2
  mulss  %xmm2,%xmm0
  movaps %xmm0,%xmm7
  subss  %xmm1,%xmm7
  movss  %xmm7,0x24(%rsp)
  movd   %r12d,%xmm1
  movss  0xc(%rsp),%xmm6
  mulss  %xmm6,%xmm1
  movd   %ebp,%xmm0
  mulss  %xmm4,%xmm0
  movaps %xmm0,%xmm3
  subss  %xmm1,%xmm3
  movss  %xmm3,0x28(%rsp)
  movd   %ebp,%xmm1
  mulss  %xmm2,%xmm1
  movd   %r13d,%xmm0
  mulss  %xmm6,%xmm0
  movaps %xmm0,%xmm2
  subss  %xmm1,%xmm2
  movss  %xmm2,0x2c(%rsp)
  movaps %xmm7,%xmm0
  mulss  %xmm7,%xmm0
  movaps %xmm3,%xmm1
  mulss  %xmm3,%xmm1
  addss  %xmm1,%xmm0
  movaps %xmm2,%xmm1
  mulss  %xmm2,%xmm1
  addss  %xmm1,%xmm0
  call   <sqrtf@plt>
  pxor   %xmm0,%xmm0
  cvtsi2ss %eax,%xmm0
  ucomiss D81(%rip),%xmm0
  jp     L98
  jne    L98
  pxor   %xmm2,%xmm2
  movaps %xmm2,%xmm3
  movaps %xmm2,%xmm0
  jmp    L90
L98:
  movss  D28(%rip),%xmm1
  divss  %xmm0,%xmm1
  movss  0x24(%rsp),%xmm0
  mulss  %xmm1,%xmm0
  movss  0x28(%rsp),%xmm3
  mulss  %xmm1,%xmm3
  movss  0x2c(%rsp),%xmm2
  mulss  %xmm1,%xmm2
L90:
  mov    %ebp,(%rbx)
  movss  %xmm0,0x4(%rbx)
  movss  0xc(%rsp),%xmm8
  movss  %xmm8,0x8(%rbx)
  movl   $0x0,0xc(%rbx)
  mov    %r13d,0x10(%rbx)
  movss  %xmm3,0x14(%rbx)
  movss  0x18(%rsp),%xmm9
  movss  %xmm9,0x18(%rbx)
  movl   $0x0,0x1c(%rbx)
  mov    %r12d,0x20(%rbx)
  movss  %xmm2,0x24(%rbx)
  movss  0x1c(%rsp),%xmm10
  movss  %xmm10,0x28(%rbx)
  movl   $0x0,0x2c(%rbx)
  movd   %ebp,%xmm1
  movss  0x20(%rsp),%xmm5
  mulss  %xmm5,%xmm1
  movd   %r13d,%xmm4
  movss  0x10(%rsp),%xmm7
  mulss  %xmm7,%xmm4
  addss  %xmm4,%xmm1
  movd   %r12d,%xmm4
  movss  0x14(%rsp),%xmm6
  mulss  %xmm6,%xmm4
  addss  %xmm4,%xmm1
  movss  D56(%rip),%xmm4
  xorps  %xmm4,%xmm1
  movss  %xmm1,0x30(%rbx)
  mulss  %xmm5,%xmm0
  mulss  %xmm7,%xmm3
  addss  %xmm3,%xmm0
  movaps %xmm6,%xmm3
  mulss  %xmm6,%xmm2
  addss  %xmm2,%xmm0
  xorps  %xmm4,%xmm0
  movss  %xmm0,0x34(%rbx)
  mulss  %xmm8,%xmm5
  movaps %xmm5,%xmm0
  mulss  %xmm9,%xmm7
  addss  %xmm7,%xmm0
  mulss  %xmm10,%xmm3
  addss  %xmm3,%xmm0
  xorps  %xmm4,%xmm0
  movss  %xmm0,0x38(%rbx)
  movl   $0x3f800000,0x3c(%rbx)
L26:
  add    $0x38,%rsp
  pop    %rbx
  pop    %rbp
  pop    %r12
  pop    %r13
  pop    %r14
  pop    %r15
  ret
```

tool_calls: name: parse_data
arguments: data_tag: D69
type_infered: f64
name: parse_data
arguments: data_tag: D81
type_infered: f64
name: parse_data
arguments: data_tag: D28
type_infered: f32
name: parse_data
arguments: data_tag: D56
type_infered: byte[4]

tool: D69: 1e-06

tool: D81: 0

tool: D28: 1

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

assistant: ```c
void mat4_lookAt(float *dst, float *eye, float *center, float *up) {
  float x0, x1, x2, y0, y1, y2, z0, z1, z2, len;
  float eyex = eye[0];
  float eyey = eye[1];
  float eyez = eye[2];
  float upx = up[0];
  float upy = up[1];
  float upz = up[2];
  float centerx = center[0];
  float centery = center[1];
  float centerz = center[2];
  if (fabs(eyex - centerx) < 0.000001 && fabs(eyey - centery) < 0.000001 && fabs(eyez - centerz) < 0.000001) {
    return mat4_identity(dst);
  }
  z0 = eyex - centerx;
  z1 = eyey - centery;
  z2 = eyez - centerz;
  len = 1 / sqrtf(z0 * z0 + z1 * z1 + z2 * z2);
  z0 *= len;
  z1 *= len;
  z2 *= len;
  x0 = upy * z2 - upz * z1;
  x1 = upz * z0 - upx * z2;
  x2 = upx * z1 - upy * z0;
  len = sqrtf(x0 * x0 + x1 * x1 + x2 * x2);
  if (!len) {
    x0 = 0;
    x1 = 0;
    x2 = 0;
  } else {
    len = 1 / len;
    x0 *= len;
    x1 *= len;
    x2 *= len;
  }
  y0 = z1 * x2 - z2 * x1;
  y1 = z2 * x0 - z0 * x2;
  y2 = z0 * x1 - z1 * x0;
  len = sqrtf(y0 * y0 + y1 * y1 + y2 * y2);
  if (!len) {
    y0 = 0;
    y1 = 0;
    y2 = 0;
  } else {
    len = 1 / len;
    y0 *= len;
    y1 *= len;
    y2 *= len;
  }
  dst[0] = x0;
  dst[1] = y0;
  dst[2] = z0;
  dst[3] = 0;
  dst[4] = x1;
  dst[5] = y1;
  dst[6] = z1;
  dst[7] = 0;
  dst[8] = x2;
  dst[9] = y2;
  dst[10] = z2;
  dst[11] = 0;
  dst[12] = -(x0 * eyex + x1 * eyey + x2 * eyez);
  dst[13] = -(y0 * eyex + y1 * eyey + y2 * eyez);
  dst[14] = -(z0 * eyex + z1 * eyey + z2 * eyez);
  dst[15] = 1;
}
```