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

```asm
<mat4_lookAt>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  sub    $0x70,%rsp
  mov    %rdi,-0x58(%rbp)
  mov    %rsi,-0x60(%rbp)
  mov    %rdx,-0x68(%rbp)
  mov    %rcx,-0x70(%rbp)
  mov    -0x60(%rbp),%rax
  movss  (%rax),%xmm0
  movss  %xmm0,-0x34(%rbp)
  mov    -0x60(%rbp),%rax
  movss  0x4(%rax),%xmm0
  movss  %xmm0,-0x30(%rbp)
  mov    -0x60(%rbp),%rax
  movss  0x8(%rax),%xmm0
  movss  %xmm0,-0x2c(%rbp)
  mov    -0x70(%rbp),%rax
  movss  (%rax),%xmm0
  movss  %xmm0,-0x28(%rbp)
  mov    -0x70(%rbp),%rax
  movss  0x4(%rax),%xmm0
  movss  %xmm0,-0x24(%rbp)
  mov    -0x70(%rbp),%rax
  movss  0x8(%rax),%xmm0
  movss  %xmm0,-0x20(%rbp)
  mov    -0x68(%rbp),%rax
  movss  (%rax),%xmm0
  movss  %xmm0,-0x1c(%rbp)
  mov    -0x68(%rbp),%rax
  movss  0x4(%rax),%xmm0
  movss  %xmm0,-0x18(%rbp)
  mov    -0x68(%rbp),%rax
  movss  0x8(%rax),%xmm0
  movss  %xmm0,-0x14(%rbp)
  movss  -0x34(%rbp),%xmm0
  subss  -0x1c(%rbp),%xmm0
  movd   %xmm0,%eax
  movd   %eax,%xmm0
  call   <fabs@plt>
  movsd  D62(%rip),%xmm1
  comisd %xmm0,%xmm1
  jbe    L10
  movss  -0x30(%rbp),%xmm0
  subss  -0x18(%rbp),%xmm0
  movd   %xmm0,%eax
  movd   %eax,%xmm0
  call   <fabs@plt>
  movsd  D62(%rip),%xmm1
  comisd %xmm0,%xmm1
  jbe    L10
  movss  -0x2c(%rbp),%xmm0
  subss  -0x14(%rbp),%xmm0
  movd   %xmm0,%eax
  movd   %eax,%xmm0
  call   <fabs@plt>
  movsd  D62(%rip),%xmm1
  comisd %xmm0,%xmm1
  jbe    L10
  mov    -0x58(%rbp),%rax
  mov    %rax,%rdi
  call   <mat4_identity@plt>
  jmp    L94
L10:
  movss  -0x34(%rbp),%xmm0
  subss  -0x1c(%rbp),%xmm0
  movss  %xmm0,-0x10(%rbp)
  movss  -0x30(%rbp),%xmm0
  subss  -0x18(%rbp),%xmm0
  movss  %xmm0,-0xc(%rbp)
  movss  -0x2c(%rbp),%xmm0
  subss  -0x14(%rbp),%xmm0
  movss  %xmm0,-0x8(%rbp)
  movss  -0x10(%rbp),%xmm0
  movaps %xmm0,%xmm1
  mulss  %xmm0,%xmm1
  movss  -0xc(%rbp),%xmm0
  mulss  %xmm0,%xmm0
  addss  %xmm0,%xmm1
  movss  -0x8(%rbp),%xmm0
  mulss  %xmm0,%xmm0
  addss  %xmm0,%xmm1
  movd   %xmm1,%eax
  movd   %eax,%xmm0
  call   <sqrtf@plt>
  mov    %eax,%ecx
  mov    $0x1,%eax
  cltd
  idiv   %ecx
  pxor   %xmm0,%xmm0
  cvtsi2ss %eax,%xmm0
  movss  %xmm0,-0x4(%rbp)
  movss  -0x10(%rbp),%xmm0
  mulss  -0x4(%rbp),%xmm0
  movss  %xmm0,-0x10(%rbp)
  movss  -0xc(%rbp),%xmm0
  mulss  -0x4(%rbp),%xmm0
  movss  %xmm0,-0xc(%rbp)
  movss  -0x8(%rbp),%xmm0
  mulss  -0x4(%rbp),%xmm0
  movss  %xmm0,-0x8(%rbp)
  movss  -0x24(%rbp),%xmm0
  mulss  -0x8(%rbp),%xmm0
  movss  -0x20(%rbp),%xmm1
  mulss  -0xc(%rbp),%xmm1
  subss  %xmm1,%xmm0
  movss  %xmm0,-0x4c(%rbp)
  movss  -0x20(%rbp),%xmm0
  mulss  -0x10(%rbp),%xmm0
  movss  -0x28(%rbp),%xmm1
  mulss  -0x8(%rbp),%xmm1
  subss  %xmm1,%xmm0
  movss  %xmm0,-0x48(%rbp)
  movss  -0x28(%rbp),%xmm0
  mulss  -0xc(%rbp),%xmm0
  movss  -0x24(%rbp),%xmm1
  mulss  -0x10(%rbp),%xmm1
  subss  %xmm1,%xmm0
  movss  %xmm0,-0x44(%rbp)
  movss  -0x4c(%rbp),%xmm0
  movaps %xmm0,%xmm1
  mulss  %xmm0,%xmm1
  movss  -0x48(%rbp),%xmm0
  mulss  %xmm0,%xmm0
  addss  %xmm0,%xmm1
  movss  -0x44(%rbp),%xmm0
  mulss  %xmm0,%xmm0
  addss  %xmm0,%xmm1
  movd   %xmm1,%eax
  movd   %eax,%xmm0
  call   <sqrtf@plt>
  pxor   %xmm0,%xmm0
  cvtsi2ss %eax,%xmm0
  movss  %xmm0,-0x4(%rbp)
  pxor   %xmm0,%xmm0
  ucomiss -0x4(%rbp),%xmm0
  jp     L77
  pxor   %xmm0,%xmm0
  ucomiss -0x4(%rbp),%xmm0
  jne    L77
  pxor   %xmm0,%xmm0
  movss  %xmm0,-0x4c(%rbp)
  pxor   %xmm0,%xmm0
  movss  %xmm0,-0x48(%rbp)
  pxor   %xmm0,%xmm0
  movss  %xmm0,-0x44(%rbp)
  jmp    L82
L77:
  movss  D88(%rip),%xmm0
  divss  -0x4(%rbp),%xmm0
  movss  %xmm0,-0x4(%rbp)
  movss  -0x4c(%rbp),%xmm0
  mulss  -0x4(%rbp),%xmm0
  movss  %xmm0,-0x4c(%rbp)
  movss  -0x48(%rbp),%xmm0
  mulss  -0x4(%rbp),%xmm0
  movss  %xmm0,-0x48(%rbp)
  movss  -0x44(%rbp),%xmm0
  mulss  -0x4(%rbp),%xmm0
  movss  %xmm0,-0x44(%rbp)
L82:
  movss  -0xc(%rbp),%xmm0
  mulss  -0x44(%rbp),%xmm0
  movss  -0x8(%rbp),%xmm1
  mulss  -0x48(%rbp),%xmm1
  subss  %xmm1,%xmm0
  movss  %xmm0,-0x40(%rbp)
  movss  -0x8(%rbp),%xmm0
  mulss  -0x4c(%rbp),%xmm0
  movss  -0x10(%rbp),%xmm1
  mulss  -0x44(%rbp),%xmm1
  subss  %xmm1,%xmm0
  movss  %xmm0,-0x3c(%rbp)
  movss  -0x10(%rbp),%xmm0
  mulss  -0x48(%rbp),%xmm0
  movss  -0xc(%rbp),%xmm1
  mulss  -0x4c(%rbp),%xmm1
  subss  %xmm1,%xmm0
  movss  %xmm0,-0x38(%rbp)
  movss  -0x40(%rbp),%xmm0
  movaps %xmm0,%xmm1
  mulss  %xmm0,%xmm1
  movss  -0x3c(%rbp),%xmm0
  mulss  %xmm0,%xmm0
  addss  %xmm0,%xmm1
  movss  -0x38(%rbp),%xmm0
  mulss  %xmm0,%xmm0
  addss  %xmm0,%xmm1
  movd   %xmm1,%eax
  movd   %eax,%xmm0
  call   <sqrtf@plt>
  pxor   %xmm0,%xmm0
  cvtsi2ss %eax,%xmm0
  movss  %xmm0,-0x4(%rbp)
  pxor   %xmm0,%xmm0
  ucomiss -0x4(%rbp),%xmm0
  jp     L85
  pxor   %xmm0,%xmm0
  ucomiss -0x4(%rbp),%xmm0
  jne    L85
  pxor   %xmm0,%xmm0
  movss  %xmm0,-0x40(%rbp)
  pxor   %xmm0,%xmm0
  movss  %xmm0,-0x3c(%rbp)
  pxor   %xmm0,%xmm0
  movss  %xmm0,-0x38(%rbp)
  jmp    L3
L85:
  movss  D88(%rip),%xmm0
  divss  -0x4(%rbp),%xmm0
  movss  %xmm0,-0x4(%rbp)
  movss  -0x40(%rbp),%xmm0
  mulss  -0x4(%rbp),%xmm0
  movss  %xmm0,-0x40(%rbp)
  movss  -0x3c(%rbp),%xmm0
  mulss  -0x4(%rbp),%xmm0
  movss  %xmm0,-0x3c(%rbp)
  movss  -0x38(%rbp),%xmm0
  mulss  -0x4(%rbp),%xmm0
  movss  %xmm0,-0x38(%rbp)
L3:
  mov    -0x58(%rbp),%rax
  movss  -0x4c(%rbp),%xmm0
  movss  %xmm0,(%rax)
  mov    -0x58(%rbp),%rax
  add    $0x4,%rax
  movss  -0x40(%rbp),%xmm0
  movss  %xmm0,(%rax)
  mov    -0x58(%rbp),%rax
  add    $0x8,%rax
  movss  -0x10(%rbp),%xmm0
  movss  %xmm0,(%rax)
  mov    -0x58(%rbp),%rax
  add    $0xc,%rax
  pxor   %xmm0,%xmm0
  movss  %xmm0,(%rax)
  mov    -0x58(%rbp),%rax
  add    $0x10,%rax
  movss  -0x48(%rbp),%xmm0
  movss  %xmm0,(%rax)
  mov    -0x58(%rbp),%rax
  add    $0x14,%rax
  movss  -0x3c(%rbp),%xmm0
  movss  %xmm0,(%rax)
  mov    -0x58(%rbp),%rax
  add    $0x18,%rax
  movss  -0xc(%rbp),%xmm0
  movss  %xmm0,(%rax)
  mov    -0x58(%rbp),%rax
  add    $0x1c,%rax
  pxor   %xmm0,%xmm0
  movss  %xmm0,(%rax)
  mov    -0x58(%rbp),%rax
  add    $0x20,%rax
  movss  -0x44(%rbp),%xmm0
  movss  %xmm0,(%rax)
  mov    -0x58(%rbp),%rax
  add    $0x24,%rax
  movss  -0x38(%rbp),%xmm0
  movss  %xmm0,(%rax)
  mov    -0x58(%rbp),%rax
  add    $0x28,%rax
  movss  -0x8(%rbp),%xmm0
  movss  %xmm0,(%rax)
  mov    -0x58(%rbp),%rax
  add    $0x2c,%rax
  pxor   %xmm0,%xmm0
  movss  %xmm0,(%rax)
  movss  -0x4c(%rbp),%xmm0
  movaps %xmm0,%xmm1
  mulss  -0x34(%rbp),%xmm1
  movss  -0x48(%rbp),%xmm0
  mulss  -0x30(%rbp),%xmm0
  addss  %xmm0,%xmm1
  movss  -0x44(%rbp),%xmm0
  mulss  -0x2c(%rbp),%xmm0
  addss  %xmm1,%xmm0
  mov    -0x58(%rbp),%rax
  add    $0x30,%rax
  movss  D68(%rip),%xmm1
  xorps  %xmm1,%xmm0
  movss  %xmm0,(%rax)
  movss  -0x40(%rbp),%xmm0
  movaps %xmm0,%xmm1
  mulss  -0x34(%rbp),%xmm1
  movss  -0x3c(%rbp),%xmm0
  mulss  -0x30(%rbp),%xmm0
  addss  %xmm0,%xmm1
  movss  -0x38(%rbp),%xmm0
  mulss  -0x2c(%rbp),%xmm0
  addss  %xmm1,%xmm0
  mov    -0x58(%rbp),%rax
  add    $0x34,%rax
  movss  D68(%rip),%xmm1
  xorps  %xmm1,%xmm0
  movss  %xmm0,(%rax)
  movss  -0x10(%rbp),%xmm0
  movaps %xmm0,%xmm1
  mulss  -0x34(%rbp),%xmm1
  movss  -0xc(%rbp),%xmm0
  mulss  -0x30(%rbp),%xmm0
  addss  %xmm0,%xmm1
  movss  -0x8(%rbp),%xmm0
  mulss  -0x2c(%rbp),%xmm0
  addss  %xmm1,%xmm0
  mov    -0x58(%rbp),%rax
  add    $0x38,%rax
  movss  D68(%rip),%xmm1
  xorps  %xmm1,%xmm0
  movss  %xmm0,(%rax)
  mov    -0x58(%rbp),%rax
  add    $0x3c,%rax
  movss  D88(%rip),%xmm0
  movss  %xmm0,(%rax)
L94:
  leave
  ret
```

tool_calls: name: unpack_data
arguments: data_tag: D62
datatype: f64
name: unpack_data
arguments: data_tag: D88
datatype: f32
name: unpack_data
arguments: data_tag: D68
datatype: byte[4]

tool: D62: 1e-06

tool: D88: 1

tool: {"D68": [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;
}
```