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

```asm
<finn_mat4_rotate>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  sub    $0x30,%rsp
  mov    %rdi,-0x18(%rbp)
  mov    %rsi,-0x20(%rbp)
  movss  %xmm0,-0x24(%rbp)
  mov    -0x24(%rbp),%eax
  movd   %eax,%xmm0
  call   <sin@plt>
  movd   %xmm0,%eax
  mov    %eax,-0xc(%rbp)
  mov    -0x24(%rbp),%eax
  movd   %eax,%xmm0
  call   <cos@plt>
  movd   %xmm0,%eax
  mov    %eax,-0x8(%rbp)
  movss  D0(%rip),%xmm0
  subss  -0x8(%rbp),%xmm0
  movss  %xmm0,-0x4(%rbp)
  mov    -0x20(%rbp),%rdx
  mov    -0x20(%rbp),%rax
  mov    %rdx,%rsi
  mov    %rax,%rdi
  call   <finn_vec3_normalize@plt>
  mov    -0x18(%rbp),%rax
  mov    $0x40,%edx
  mov    $0x0,%esi
  mov    %rax,%rdi
  call   <memset@plt>
  mov    -0x20(%rbp),%rax
  movss  (%rax),%xmm1
  mov    -0x20(%rbp),%rax
  movss  (%rax),%xmm0
  mulss  %xmm1,%xmm0
  mulss  -0x4(%rbp),%xmm0
  addss  -0x8(%rbp),%xmm0
  mov    -0x18(%rbp),%rax
  movss  %xmm0,(%rax)
  mov    -0x20(%rbp),%rax
  add    $0x4,%rax
  movss  (%rax),%xmm1
  mov    -0x20(%rbp),%rax
  movss  (%rax),%xmm0
  mulss  %xmm1,%xmm0
  movaps %xmm0,%xmm1
  mulss  -0x4(%rbp),%xmm1
  mov    -0x20(%rbp),%rax
  add    $0x8,%rax
  movss  (%rax),%xmm0
  mulss  -0xc(%rbp),%xmm0
  mov    -0x18(%rbp),%rax
  add    $0x4,%rax
  addss  %xmm1,%xmm0
  movss  %xmm0,(%rax)
  mov    -0x20(%rbp),%rax
  add    $0x8,%rax
  movss  (%rax),%xmm1
  mov    -0x20(%rbp),%rax
  movss  (%rax),%xmm0
  mulss  %xmm1,%xmm0
  mulss  -0x4(%rbp),%xmm0
  mov    -0x20(%rbp),%rax
  add    $0x4,%rax
  movss  (%rax),%xmm1
  mulss  -0xc(%rbp),%xmm1
  mov    -0x18(%rbp),%rax
  add    $0x8,%rax
  subss  %xmm1,%xmm0
  movss  %xmm0,(%rax)
  mov    -0x20(%rbp),%rax
  movss  (%rax),%xmm1
  mov    -0x20(%rbp),%rax
  add    $0x4,%rax
  movss  (%rax),%xmm0
  mulss  %xmm1,%xmm0
  mulss  -0x4(%rbp),%xmm0
  mov    -0x20(%rbp),%rax
  add    $0x8,%rax
  movss  (%rax),%xmm1
  mulss  -0xc(%rbp),%xmm1
  mov    -0x18(%rbp),%rax
  add    $0x10,%rax
  subss  %xmm1,%xmm0
  movss  %xmm0,(%rax)
  mov    -0x20(%rbp),%rax
  add    $0x4,%rax
  movss  (%rax),%xmm1
  mov    -0x20(%rbp),%rax
  add    $0x4,%rax
  movss  (%rax),%xmm0
  mulss  %xmm1,%xmm0
  mulss  -0x4(%rbp),%xmm0
  mov    -0x18(%rbp),%rax
  add    $0x14,%rax
  addss  -0x8(%rbp),%xmm0
  movss  %xmm0,(%rax)
  mov    -0x20(%rbp),%rax
  add    $0x8,%rax
  movss  (%rax),%xmm1
  mov    -0x20(%rbp),%rax
  add    $0x4,%rax
  movss  (%rax),%xmm0
  mulss  %xmm1,%xmm0
  movaps %xmm0,%xmm1
  mulss  -0x4(%rbp),%xmm1
  mov    -0x20(%rbp),%rax
  movss  (%rax),%xmm0
  mulss  -0xc(%rbp),%xmm0
  mov    -0x18(%rbp),%rax
  add    $0x18,%rax
  addss  %xmm1,%xmm0
  movss  %xmm0,(%rax)
  mov    -0x20(%rbp),%rax
  movss  (%rax),%xmm1
  mov    -0x20(%rbp),%rax
  add    $0x8,%rax
  movss  (%rax),%xmm0
  mulss  %xmm1,%xmm0
  movaps %xmm0,%xmm1
  mulss  -0x4(%rbp),%xmm1
  mov    -0x20(%rbp),%rax
  add    $0x4,%rax
  movss  (%rax),%xmm0
  mulss  -0xc(%rbp),%xmm0
  mov    -0x18(%rbp),%rax
  add    $0x20,%rax
  addss  %xmm1,%xmm0
  movss  %xmm0,(%rax)
  mov    -0x20(%rbp),%rax
  add    $0x4,%rax
  movss  (%rax),%xmm1
  mov    -0x20(%rbp),%rax
  add    $0x8,%rax
  movss  (%rax),%xmm0
  mulss  %xmm1,%xmm0
  mulss  -0x4(%rbp),%xmm0
  mov    -0x20(%rbp),%rax
  movss  (%rax),%xmm1
  mulss  -0xc(%rbp),%xmm1
  mov    -0x18(%rbp),%rax
  add    $0x24,%rax
  subss  %xmm1,%xmm0
  movss  %xmm0,(%rax)
  mov    -0x20(%rbp),%rax
  add    $0x8,%rax
  movss  (%rax),%xmm1
  mov    -0x20(%rbp),%rax
  add    $0x8,%rax
  movss  (%rax),%xmm0
  mulss  %xmm1,%xmm0
  mulss  -0x4(%rbp),%xmm0
  mov    -0x18(%rbp),%rax
  add    $0x28,%rax
  addss  -0x8(%rbp),%xmm0
  movss  %xmm0,(%rax)
  mov    -0x18(%rbp),%rax
  add    $0x3c,%rax
  movss  D0(%rip),%xmm0
  movss  %xmm0,(%rax)
  nop
  leave
  ret
```

tool_calls: name: read_data
arguments: data_label: D0
datatype: f32

tool: D0: 1

assistant: ```c
void finn_mat4_rotate(float *mat, float *axis, float rad) {
  float s = sin(rad);
  float c = cos(rad);
  float t = 1 - c;
  finn_vec3_normalize(axis, axis);
  memset(mat, 0, sizeof(float) * 16);
  mat[0] = axis[0] * axis[0] * t + c;
  mat[1] = axis[1] * axis[0] * t + axis[2] * s;
  mat[2] = axis[2] * axis[0] * t - axis[1] * s;
  mat[4] = axis[0] * axis[1] * t - axis[2] * s;
  mat[5] = axis[1] * axis[1] * t + c;
  mat[6] = axis[2] * axis[1] * t + axis[0] * s;
  mat[8] = axis[0] * axis[2] * t + axis[1] * s;
  mat[9] = axis[1] * axis[2] * t - axis[0] * s;
  mat[10] = axis[2] * axis[2] * t + c;
  mat[15] = 1.0f;
}
```