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

```asm
<Mat4_RotateAxis>:
  endbr64
  push   %rbp
  push   %rbx
  sub    $0x18,%rsp
  mov    %rdi,%rbx
  mov    %rsi,%rbp
  ucomiss D38(%rip),%xmm0
  jp     L15
  jne    L15
L25:
  add    $0x18,%rsp
  pop    %rbx
  pop    %rbp
  ret
L15:
  lea    0xc(%rsp),%rdi
  lea    0x8(%rsp),%rsi
  cvtss2sd %xmm0,%xmm0
  mulsd  D1(%rip),%xmm0
  divsd  D36(%rip),%xmm0
  cvtsd2ss %xmm0,%xmm0
  call   <sincosf@plt>
  movss  0x8(%rsp),%xmm7
  movss  0xc(%rsp),%xmm1
  movaps %xmm1,%xmm3
  mulss  0x0(%rbp),%xmm3
  movaps %xmm1,%xmm2
  mulss  0x4(%rbp),%xmm2
  mulss  0x8(%rbp),%xmm1
  movss  D31(%rip),%xmm0
  movaps %xmm3,%xmm5
  xorps  %xmm0,%xmm5
  movaps %xmm2,%xmm6
  xorps  %xmm0,%xmm6
  xorps  %xmm1,%xmm0
  movss  (%rbx),%xmm13
  movss  0xc(%rbx),%xmm4
  movss  0x8(%rbx),%xmm11
  movss  0x4(%rbx),%xmm12
  movaps %xmm13,%xmm9
  mulss  %xmm7,%xmm9
  movaps %xmm3,%xmm8
  mulss  %xmm4,%xmm8
  addss  %xmm8,%xmm9
  movaps %xmm2,%xmm8
  mulss  %xmm11,%xmm8
  addss  %xmm8,%xmm9
  movaps %xmm1,%xmm8
  mulss  %xmm12,%xmm8
  subss  %xmm8,%xmm9
  movaps %xmm12,%xmm8
  mulss  %xmm7,%xmm8
  movaps %xmm2,%xmm10
  mulss  %xmm4,%xmm10
  addss  %xmm10,%xmm8
  movaps %xmm1,%xmm10
  mulss  %xmm13,%xmm10
  addss  %xmm10,%xmm8
  movaps %xmm3,%xmm10
  mulss  %xmm11,%xmm10
  subss  %xmm10,%xmm8
  movaps %xmm11,%xmm10
  mulss  %xmm7,%xmm10
  movaps %xmm1,%xmm14
  mulss  %xmm4,%xmm14
  addss  %xmm14,%xmm10
  movaps %xmm3,%xmm14
  mulss  %xmm12,%xmm14
  addss  %xmm14,%xmm10
  movaps %xmm2,%xmm14
  mulss  %xmm13,%xmm14
  subss  %xmm14,%xmm10
  mulss  %xmm7,%xmm4
  mulss  %xmm3,%xmm13
  subss  %xmm13,%xmm4
  mulss  %xmm2,%xmm12
  subss  %xmm12,%xmm4
  mulss  %xmm1,%xmm11
  subss  %xmm11,%xmm4
  movaps %xmm5,%xmm11
  mulss  %xmm4,%xmm11
  movaps %xmm9,%xmm12
  mulss  %xmm7,%xmm12
  addss  %xmm12,%xmm11
  movaps %xmm0,%xmm12
  mulss  %xmm8,%xmm12
  addss  %xmm12,%xmm11
  movaps %xmm6,%xmm12
  mulss  %xmm10,%xmm12
  subss  %xmm12,%xmm11
  movss  %xmm11,(%rbx)
  movaps %xmm6,%xmm11
  mulss  %xmm4,%xmm11
  movaps %xmm8,%xmm12
  mulss  %xmm7,%xmm12
  addss  %xmm12,%xmm11
  movaps %xmm5,%xmm12
  mulss  %xmm10,%xmm12
  addss  %xmm12,%xmm11
  movaps %xmm0,%xmm12
  mulss  %xmm9,%xmm12
  subss  %xmm12,%xmm11
  movss  %xmm11,0x4(%rbx)
  mulss  %xmm0,%xmm4
  mulss  %xmm7,%xmm10
  addss  %xmm10,%xmm4
  mulss  %xmm6,%xmm9
  addss  %xmm9,%xmm4
  mulss  %xmm5,%xmm8
  subss  %xmm8,%xmm4
  movss  %xmm4,0x8(%rbx)
  movl   $0x0,0xc(%rbx)
  movss  0x10(%rbx),%xmm13
  movss  0x1c(%rbx),%xmm4
  movss  0x18(%rbx),%xmm11
  movss  0x14(%rbx),%xmm12
  movaps %xmm13,%xmm9
  mulss  %xmm7,%xmm9
  movaps %xmm3,%xmm8
  mulss  %xmm4,%xmm8
  addss  %xmm8,%xmm9
  movaps %xmm2,%xmm8
  mulss  %xmm11,%xmm8
  addss  %xmm8,%xmm9
  movaps %xmm1,%xmm8
  mulss  %xmm12,%xmm8
  subss  %xmm8,%xmm9
  movaps %xmm12,%xmm8
  mulss  %xmm7,%xmm8
  movaps %xmm2,%xmm10
  mulss  %xmm4,%xmm10
  addss  %xmm10,%xmm8
  movaps %xmm1,%xmm10
  mulss  %xmm13,%xmm10
  addss  %xmm10,%xmm8
  movaps %xmm3,%xmm10
  mulss  %xmm11,%xmm10
  subss  %xmm10,%xmm8
  movaps %xmm11,%xmm10
  mulss  %xmm7,%xmm10
  movaps %xmm1,%xmm14
  mulss  %xmm4,%xmm14
  addss  %xmm14,%xmm10
  movaps %xmm3,%xmm14
  mulss  %xmm12,%xmm14
  addss  %xmm14,%xmm10
  movaps %xmm2,%xmm14
  mulss  %xmm13,%xmm14
  subss  %xmm14,%xmm10
  mulss  %xmm7,%xmm4
  mulss  %xmm3,%xmm13
  subss  %xmm13,%xmm4
  mulss  %xmm2,%xmm12
  subss  %xmm12,%xmm4
  mulss  %xmm1,%xmm11
  subss  %xmm11,%xmm4
  movaps %xmm5,%xmm11
  mulss  %xmm4,%xmm11
  movaps %xmm9,%xmm12
  mulss  %xmm7,%xmm12
  addss  %xmm12,%xmm11
  movaps %xmm0,%xmm12
  mulss  %xmm8,%xmm12
  addss  %xmm12,%xmm11
  movaps %xmm6,%xmm12
  mulss  %xmm10,%xmm12
  subss  %xmm12,%xmm11
  movss  %xmm11,0x10(%rbx)
  movaps %xmm6,%xmm11
  mulss  %xmm4,%xmm11
  movaps %xmm8,%xmm12
  mulss  %xmm7,%xmm12
  addss  %xmm12,%xmm11
  movaps %xmm5,%xmm12
  mulss  %xmm10,%xmm12
  addss  %xmm12,%xmm11
  movaps %xmm0,%xmm12
  mulss  %xmm9,%xmm12
  subss  %xmm12,%xmm11
  movss  %xmm11,0x14(%rbx)
  mulss  %xmm0,%xmm4
  mulss  %xmm7,%xmm10
  addss  %xmm10,%xmm4
  mulss  %xmm6,%xmm9
  addss  %xmm9,%xmm4
  mulss  %xmm5,%xmm8
  subss  %xmm8,%xmm4
  movss  %xmm4,0x18(%rbx)
  movl   $0x0,0x1c(%rbx)
  movss  0x20(%rbx),%xmm13
  movss  0x2c(%rbx),%xmm4
  movss  0x28(%rbx),%xmm11
  movss  0x24(%rbx),%xmm12
  movaps %xmm13,%xmm9
  mulss  %xmm7,%xmm9
  movaps %xmm3,%xmm8
  mulss  %xmm4,%xmm8
  addss  %xmm8,%xmm9
  movaps %xmm2,%xmm8
  mulss  %xmm11,%xmm8
  addss  %xmm8,%xmm9
  movaps %xmm1,%xmm8
  mulss  %xmm12,%xmm8
  subss  %xmm8,%xmm9
  movaps %xmm12,%xmm8
  mulss  %xmm7,%xmm8
  movaps %xmm2,%xmm10
  mulss  %xmm4,%xmm10
  addss  %xmm10,%xmm8
  movaps %xmm1,%xmm10
  mulss  %xmm13,%xmm10
  addss  %xmm10,%xmm8
  movaps %xmm3,%xmm10
  mulss  %xmm11,%xmm10
  subss  %xmm10,%xmm8
  movaps %xmm11,%xmm10
  mulss  %xmm7,%xmm10
  movaps %xmm1,%xmm14
  mulss  %xmm4,%xmm14
  addss  %xmm14,%xmm10
  movaps %xmm3,%xmm14
  mulss  %xmm12,%xmm14
  addss  %xmm14,%xmm10
  movaps %xmm2,%xmm14
  mulss  %xmm13,%xmm14
  subss  %xmm14,%xmm10
  mulss  %xmm7,%xmm4
  mulss  %xmm13,%xmm3
  subss  %xmm3,%xmm4
  mulss  %xmm12,%xmm2
  subss  %xmm2,%xmm4
  mulss  %xmm11,%xmm1
  subss  %xmm1,%xmm4
  movaps %xmm5,%xmm1
  mulss  %xmm4,%xmm1
  movaps %xmm9,%xmm2
  mulss  %xmm7,%xmm2
  addss  %xmm2,%xmm1
  movaps %xmm0,%xmm2
  mulss  %xmm8,%xmm2
  addss  %xmm2,%xmm1
  movaps %xmm6,%xmm2
  mulss  %xmm10,%xmm2
  subss  %xmm2,%xmm1
  movss  %xmm1,0x20(%rbx)
  movaps %xmm6,%xmm1
  mulss  %xmm4,%xmm1
  movaps %xmm8,%xmm2
  mulss  %xmm7,%xmm2
  addss  %xmm2,%xmm1
  movaps %xmm5,%xmm2
  mulss  %xmm10,%xmm2
  addss  %xmm2,%xmm1
  movaps %xmm0,%xmm2
  mulss  %xmm9,%xmm2
  subss  %xmm2,%xmm1
  movss  %xmm1,0x24(%rbx)
  mulss  %xmm4,%xmm0
  mulss  %xmm7,%xmm10
  addss  %xmm10,%xmm0
  mulss  %xmm9,%xmm6
  addss  %xmm6,%xmm0
  mulss  %xmm8,%xmm5
  subss  %xmm5,%xmm0
  movss  %xmm0,0x28(%rbx)
  movl   $0x0,0x2c(%rbx)
  jmp    L25
```

tool_calls: name: parse_data
arguments: data_label: D38
type_infered: f64
name: parse_data
arguments: data_label: D1
type_infered: f64
name: parse_data
arguments: data_label: D36
type_infered: f64
name: parse_data
arguments: data_label: D31
type_infered: byte[4]

tool: D38: 0

tool: D1: 3.141592653589793

tool: D36: 360

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

assistant: ```c
void Mat4_RotateAxis(float mat[16], const float axis[3], float ang) {
  if (ang != 0.0) {
    float t = ang * 3.14159265358979323846 / 360.0;
    float sin_t2 = sinf(t);
    float cos_t2 = cosf(t);
    float R[4], Rt[4], *v, buf[4];
    R[0] = axis[0] * sin_t2;
    R[1] = axis[1] * sin_t2;
    R[2] = axis[2] * sin_t2;
    R[3] = cos_t2;
    {
      (Rt)[0] = -(R)[0];
      (Rt)[1] = -(R)[1];
      (Rt)[2] = -(R)[2];
      (Rt)[3] = (R)[3];
    };
    v = mat + 0;
    {
      (buf)[0] = (R)[3] * (v)[0] + (R)[0] * (v)[3] + (R)[1] * (v)[2] - (R)[2] * (v)[1];
      (buf)[1] = (R)[3] * (v)[1] + (R)[1] * (v)[3] + (R)[2] * (v)[0] - (R)[0] * (v)[2];
      (buf)[2] = (R)[3] * (v)[2] + (R)[2] * (v)[3] + (R)[0] * (v)[1] - (R)[1] * (v)[0];
      (buf)[3] = (R)[3] * (v)[3] - (R)[0] * (v)[0] - (R)[1] * (v)[1] - (R)[2] * (v)[2];
    };
    {
      (v)[0] = (buf)[3] * (Rt)[0] + (buf)[0] * (Rt)[3] + (buf)[1] * (Rt)[2] - (buf)[2] * (Rt)[1];
      (v)[1] = (buf)[3] * (Rt)[1] + (buf)[1] * (Rt)[3] + (buf)[2] * (Rt)[0] - (buf)[0] * (Rt)[2];
      (v)[2] = (buf)[3] * (Rt)[2] + (buf)[2] * (Rt)[3] + (buf)[0] * (Rt)[1] - (buf)[1] * (Rt)[0];
      (v)[3] = (buf)[3] * (Rt)[3] - (buf)[0] * (Rt)[0] - (buf)[1] * (Rt)[1] - (buf)[2] * (Rt)[2];
    };
    mat[0 + 3] = 0.0f;
    v = mat + 4;
    {
      (buf)[0] = (R)[3] * (v)[0] + (R)[0] * (v)[3] + (R)[1] * (v)[2] - (R)[2] * (v)[1];
      (buf)[1] = (R)[3] * (v)[1] + (R)[1] * (v)[3] + (R)[2] * (v)[0] - (R)[0] * (v)[2];
      (buf)[2] = (R)[3] * (v)[2] + (R)[2] * (v)[3] + (R)[0] * (v)[1] - (R)[1] * (v)[0];
      (buf)[3] = (R)[3] * (v)[3] - (R)[0] * (v)[0] - (R)[1] * (v)[1] - (R)[2] * (v)[2];
    };
    {
      (v)[0] = (buf)[3] * (Rt)[0] + (buf)[0] * (Rt)[3] + (buf)[1] * (Rt)[2] - (buf)[2] * (Rt)[1];
      (v)[1] = (buf)[3] * (Rt)[1] + (buf)[1] * (Rt)[3] + (buf)[2] * (Rt)[0] - (buf)[0] * (Rt)[2];
      (v)[2] = (buf)[3] * (Rt)[2] + (buf)[2] * (Rt)[3] + (buf)[0] * (Rt)[1] - (buf)[1] * (Rt)[0];
      (v)[3] = (buf)[3] * (Rt)[3] - (buf)[0] * (Rt)[0] - (buf)[1] * (Rt)[1] - (buf)[2] * (Rt)[2];
    };
    mat[4 + 3] = 0.0f;
    v = mat + 8;
    {
      (buf)[0] = (R)[3] * (v)[0] + (R)[0] * (v)[3] + (R)[1] * (v)[2] - (R)[2] * (v)[1];
      (buf)[1] = (R)[3] * (v)[1] + (R)[1] * (v)[3] + (R)[2] * (v)[0] - (R)[0] * (v)[2];
      (buf)[2] = (R)[3] * (v)[2] + (R)[2] * (v)[3] + (R)[0] * (v)[1] - (R)[1] * (v)[0];
      (buf)[3] = (R)[3] * (v)[3] - (R)[0] * (v)[0] - (R)[1] * (v)[1] - (R)[2] * (v)[2];
    };
    {
      (v)[0] = (buf)[3] * (Rt)[0] + (buf)[0] * (Rt)[3] + (buf)[1] * (Rt)[2] - (buf)[2] * (Rt)[1];
      (v)[1] = (buf)[3] * (Rt)[1] + (buf)[1] * (Rt)[3] + (buf)[2] * (Rt)[0] - (buf)[0] * (Rt)[2];
      (v)[2] = (buf)[3] * (Rt)[2] + (buf)[2] * (Rt)[3] + (buf)[0] * (Rt)[1] - (buf)[1] * (Rt)[0];
      (v)[3] = (buf)[3] * (Rt)[3] - (buf)[0] * (Rt)[0] - (buf)[1] * (Rt)[1] - (buf)[2] * (Rt)[2];
    };
    mat[8 + 3] = 0.0f;
  }
}
```