user: 请从给定的汇编指令推导出C源代码：

```asm
<Mat4_RotateAxis>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  add    $0xffffffffffffff80,%rsp
  mov    %rdi,-0x68(%rbp)
  mov    %rsi,-0x70(%rbp)
  movss  %xmm0,-0x74(%rbp)
  mov    %fs:0x28,%rax
  mov    %rax,-0x8(%rbp)
  xor    %eax,%eax
  pxor   %xmm0,%xmm0
  ucomiss -0x74(%rbp),%xmm0
  jp     L12
  pxor   %xmm0,%xmm0
  ucomiss -0x74(%rbp),%xmm0
  je     L4
L12:
  pxor   %xmm1,%xmm1
  cvtss2sd -0x74(%rbp),%xmm1
  movsd  D26(%rip),%xmm0
  mulsd  %xmm1,%xmm0
  movsd  D16(%rip),%xmm1
  divsd  %xmm1,%xmm0
  cvtsd2ss %xmm0,%xmm0
  movss  %xmm0,-0x54(%rbp)
  mov    -0x54(%rbp),%eax
  movd   %eax,%xmm0
  call   <sinf@plt>
  movd   %xmm0,%eax
  mov    %eax,-0x50(%rbp)
  mov    -0x54(%rbp),%eax
  movd   %eax,%xmm0
  call   <cosf@plt>
  movd   %xmm0,%eax
  mov    %eax,-0x4c(%rbp)
  mov    -0x70(%rbp),%rax
  movss  (%rax),%xmm0
  mulss  -0x50(%rbp),%xmm0
  movss  %xmm0,-0x40(%rbp)
  mov    -0x70(%rbp),%rax
  add    $0x4,%rax
  movss  (%rax),%xmm0
  mulss  -0x50(%rbp),%xmm0
  movss  %xmm0,-0x3c(%rbp)
  mov    -0x70(%rbp),%rax
  add    $0x8,%rax
  movss  (%rax),%xmm0
  mulss  -0x50(%rbp),%xmm0
  movss  %xmm0,-0x38(%rbp)
  movss  -0x4c(%rbp),%xmm0
  movss  %xmm0,-0x34(%rbp)
  movss  -0x40(%rbp),%xmm0
  movss  D32(%rip),%xmm1
  xorps  %xmm1,%xmm0
  movss  %xmm0,-0x30(%rbp)
  movss  -0x3c(%rbp),%xmm0
  movss  D32(%rip),%xmm1
  xorps  %xmm1,%xmm0
  movss  %xmm0,-0x2c(%rbp)
  movss  -0x38(%rbp),%xmm0
  movss  D32(%rip),%xmm1
  xorps  %xmm1,%xmm0
  movss  %xmm0,-0x28(%rbp)
  movss  -0x34(%rbp),%xmm0
  movss  %xmm0,-0x24(%rbp)
  mov    -0x68(%rbp),%rax
  mov    %rax,-0x48(%rbp)
  movss  -0x34(%rbp),%xmm1
  mov    -0x48(%rbp),%rax
  movss  (%rax),%xmm0
  mulss  %xmm0,%xmm1
  movss  -0x40(%rbp),%xmm2
  mov    -0x48(%rbp),%rax
  add    $0xc,%rax
  movss  (%rax),%xmm0
  mulss  %xmm2,%xmm0
  addss  %xmm0,%xmm1
  movss  -0x3c(%rbp),%xmm2
  mov    -0x48(%rbp),%rax
  add    $0x8,%rax
  movss  (%rax),%xmm0
  mulss  %xmm2,%xmm0
  addss  %xmm1,%xmm0
  movss  -0x38(%rbp),%xmm2
  mov    -0x48(%rbp),%rax
  add    $0x4,%rax
  movss  (%rax),%xmm1
  mulss  %xmm2,%xmm1
  subss  %xmm1,%xmm0
  movss  %xmm0,-0x20(%rbp)
  movss  -0x34(%rbp),%xmm1
  mov    -0x48(%rbp),%rax
  add    $0x4,%rax
  movss  (%rax),%xmm0
  mulss  %xmm0,%xmm1
  movss  -0x3c(%rbp),%xmm2
  mov    -0x48(%rbp),%rax
  add    $0xc,%rax
  movss  (%rax),%xmm0
  mulss  %xmm2,%xmm0
  addss  %xmm0,%xmm1
  movss  -0x38(%rbp),%xmm2
  mov    -0x48(%rbp),%rax
  movss  (%rax),%xmm0
  mulss  %xmm2,%xmm0
  addss  %xmm1,%xmm0
  movss  -0x40(%rbp),%xmm2
  mov    -0x48(%rbp),%rax
  add    $0x8,%rax
  movss  (%rax),%xmm1
  mulss  %xmm2,%xmm1
  subss  %xmm1,%xmm0
  movss  %xmm0,-0x1c(%rbp)
  movss  -0x34(%rbp),%xmm1
  mov    -0x48(%rbp),%rax
  add    $0x8,%rax
  movss  (%rax),%xmm0
  mulss  %xmm0,%xmm1
  movss  -0x38(%rbp),%xmm2
  mov    -0x48(%rbp),%rax
  add    $0xc,%rax
  movss  (%rax),%xmm0
  mulss  %xmm2,%xmm0
  addss  %xmm0,%xmm1
  movss  -0x40(%rbp),%xmm2
  mov    -0x48(%rbp),%rax
  add    $0x4,%rax
  movss  (%rax),%xmm0
  mulss  %xmm2,%xmm0
  addss  %xmm1,%xmm0
  movss  -0x3c(%rbp),%xmm2
  mov    -0x48(%rbp),%rax
  movss  (%rax),%xmm1
  mulss  %xmm2,%xmm1
  subss  %xmm1,%xmm0
  movss  %xmm0,-0x18(%rbp)
  movss  -0x34(%rbp),%xmm1
  mov    -0x48(%rbp),%rax
  add    $0xc,%rax
  movss  (%rax),%xmm0
  mulss  %xmm1,%xmm0
  movss  -0x40(%rbp),%xmm2
  mov    -0x48(%rbp),%rax
  movss  (%rax),%xmm1
  mulss  %xmm2,%xmm1
  subss  %xmm1,%xmm0
  movss  -0x3c(%rbp),%xmm2
  mov    -0x48(%rbp),%rax
  add    $0x4,%rax
  movss  (%rax),%xmm1
  mulss  %xmm2,%xmm1
  subss  %xmm1,%xmm0
  movss  -0x38(%rbp),%xmm2
  mov    -0x48(%rbp),%rax
  add    $0x8,%rax
  movss  (%rax),%xmm1
  mulss  %xmm2,%xmm1
  subss  %xmm1,%xmm0
  movss  %xmm0,-0x14(%rbp)
  movss  -0x14(%rbp),%xmm1
  movss  -0x30(%rbp),%xmm0
  mulss  %xmm0,%xmm1
  movss  -0x20(%rbp),%xmm2
  movss  -0x24(%rbp),%xmm0
  mulss  %xmm2,%xmm0
  addss  %xmm0,%xmm1
  movss  -0x1c(%rbp),%xmm2
  movss  -0x28(%rbp),%xmm0
  mulss  %xmm2,%xmm0
  addss  %xmm1,%xmm0
  movss  -0x18(%rbp),%xmm2
  movss  -0x2c(%rbp),%xmm1
  mulss  %xmm2,%xmm1
  subss  %xmm1,%xmm0
  mov    -0x48(%rbp),%rax
  movss  %xmm0,(%rax)
  movss  -0x14(%rbp),%xmm1
  movss  -0x2c(%rbp),%xmm0
  mulss  %xmm0,%xmm1
  movss  -0x1c(%rbp),%xmm2
  movss  -0x24(%rbp),%xmm0
  mulss  %xmm2,%xmm0
  addss  %xmm0,%xmm1
  movss  -0x18(%rbp),%xmm2
  movss  -0x30(%rbp),%xmm0
  mulss  %xmm2,%xmm0
  addss  %xmm1,%xmm0
  movss  -0x20(%rbp),%xmm2
  movss  -0x28(%rbp),%xmm1
  mulss  %xmm2,%xmm1
  mov    -0x48(%rbp),%rax
  add    $0x4,%rax
  subss  %xmm1,%xmm0
  movss  %xmm0,(%rax)
  movss  -0x14(%rbp),%xmm1
  movss  -0x28(%rbp),%xmm0
  mulss  %xmm0,%xmm1
  movss  -0x18(%rbp),%xmm2
  movss  -0x24(%rbp),%xmm0
  mulss  %xmm2,%xmm0
  addss  %xmm0,%xmm1
  movss  -0x20(%rbp),%xmm2
  movss  -0x2c(%rbp),%xmm0
  mulss  %xmm2,%xmm0
  addss  %xmm1,%xmm0
  movss  -0x1c(%rbp),%xmm2
  movss  -0x30(%rbp),%xmm1
  mulss  %xmm2,%xmm1
  mov    -0x48(%rbp),%rax
  add    $0x8,%rax
  subss  %xmm1,%xmm0
  movss  %xmm0,(%rax)
  movss  -0x14(%rbp),%xmm1
  movss  -0x24(%rbp),%xmm0
  mulss  %xmm1,%xmm0
  movss  -0x20(%rbp),%xmm2
  movss  -0x30(%rbp),%xmm1
  mulss  %xmm2,%xmm1
  subss  %xmm1,%xmm0
  movss  -0x1c(%rbp),%xmm2
  movss  -0x2c(%rbp),%xmm1
  mulss  %xmm2,%xmm1
  subss  %xmm1,%xmm0
  movss  -0x18(%rbp),%xmm2
  movss  -0x28(%rbp),%xmm1
  mulss  %xmm2,%xmm1
  mov    -0x48(%rbp),%rax
  add    $0xc,%rax
  subss  %xmm1,%xmm0
  movss  %xmm0,(%rax)
  mov    -0x68(%rbp),%rax
  add    $0xc,%rax
  pxor   %xmm0,%xmm0
  movss  %xmm0,(%rax)
  mov    -0x68(%rbp),%rax
  add    $0x10,%rax
  mov    %rax,-0x48(%rbp)
  movss  -0x34(%rbp),%xmm1
  mov    -0x48(%rbp),%rax
  movss  (%rax),%xmm0
  mulss  %xmm0,%xmm1
  movss  -0x40(%rbp),%xmm2
  mov    -0x48(%rbp),%rax
  add    $0xc,%rax
  movss  (%rax),%xmm0
  mulss  %xmm2,%xmm0
  addss  %xmm0,%xmm1
  movss  -0x3c(%rbp),%xmm2
  mov    -0x48(%rbp),%rax
  add    $0x8,%rax
  movss  (%rax),%xmm0
  mulss  %xmm2,%xmm0
  addss  %xmm1,%xmm0
  movss  -0x38(%rbp),%xmm2
  mov    -0x48(%rbp),%rax
  add    $0x4,%rax
  movss  (%rax),%xmm1
  mulss  %xmm2,%xmm1
  subss  %xmm1,%xmm0
  movss  %xmm0,-0x20(%rbp)
  movss  -0x34(%rbp),%xmm1
  mov    -0x48(%rbp),%rax
  add    $0x4,%rax
  movss  (%rax),%xmm0
  mulss  %xmm0,%xmm1
  movss  -0x3c(%rbp),%xmm2
  mov    -0x48(%rbp),%rax
  add    $0xc,%rax
  movss  (%rax),%xmm0
  mulss  %xmm2,%xmm0
  addss  %xmm0,%xmm1
  movss  -0x38(%rbp),%xmm2
  mov    -0x48(%rbp),%rax
  movss  (%rax),%xmm0
  mulss  %xmm2,%xmm0
  addss  %xmm1,%xmm0
  movss  -0x40(%rbp),%xmm2
  mov    -0x48(%rbp),%rax
  add    $0x8,%rax
  movss  (%rax),%xmm1
  mulss  %xmm2,%xmm1
  subss  %xmm1,%xmm0
  movss  %xmm0,-0x1c(%rbp)
  movss  -0x34(%rbp),%xmm1
  mov    -0x48(%rbp),%rax
  add    $0x8,%rax
  movss  (%rax),%xmm0
  mulss  %xmm0,%xmm1
  movss  -0x38(%rbp),%xmm2
  mov    -0x48(%rbp),%rax
  add    $0xc,%rax
  movss  (%rax),%xmm0
  mulss  %xmm2,%xmm0
  addss  %xmm0,%xmm1
  movss  -0x40(%rbp),%xmm2
  mov    -0x48(%rbp),%rax
  add    $0x4,%rax
  movss  (%rax),%xmm0
  mulss  %xmm2,%xmm0
  addss  %xmm1,%xmm0
  movss  -0x3c(%rbp),%xmm2
  mov    -0x48(%rbp),%rax
  movss  (%rax),%xmm1
  mulss  %xmm2,%xmm1
  subss  %xmm1,%xmm0
  movss  %xmm0,-0x18(%rbp)
  movss  -0x34(%rbp),%xmm1
  mov    -0x48(%rbp),%rax
  add    $0xc,%rax
  movss  (%rax),%xmm0
  mulss  %xmm1,%xmm0
  movss  -0x40(%rbp),%xmm2
  mov    -0x48(%rbp),%rax
  movss  (%rax),%xmm1
  mulss  %xmm2,%xmm1
  subss  %xmm1,%xmm0
  movss  -0x3c(%rbp),%xmm2
  mov    -0x48(%rbp),%rax
  add    $0x4,%rax
  movss  (%rax),%xmm1
  mulss  %xmm2,%xmm1
  subss  %xmm1,%xmm0
  movss  -0x38(%rbp),%xmm2
  mov    -0x48(%rbp),%rax
  add    $0x8,%rax
  movss  (%rax),%xmm1
  mulss  %xmm2,%xmm1
  subss  %xmm1,%xmm0
  movss  %xmm0,-0x14(%rbp)
  movss  -0x14(%rbp),%xmm1
  movss  -0x30(%rbp),%xmm0
  mulss  %xmm0,%xmm1
  movss  -0x20(%rbp),%xmm2
  movss  -0x24(%rbp),%xmm0
  mulss  %xmm2,%xmm0
  addss  %xmm0,%xmm1
  movss  -0x1c(%rbp),%xmm2
  movss  -0x28(%rbp),%xmm0
  mulss  %xmm2,%xmm0
  addss  %xmm1,%xmm0
  movss  -0x18(%rbp),%xmm2
  movss  -0x2c(%rbp),%xmm1
  mulss  %xmm2,%xmm1
  subss  %xmm1,%xmm0
  mov    -0x48(%rbp),%rax
  movss  %xmm0,(%rax)
  movss  -0x14(%rbp),%xmm1
  movss  -0x2c(%rbp),%xmm0
  mulss  %xmm0,%xmm1
  movss  -0x1c(%rbp),%xmm2
  movss  -0x24(%rbp),%xmm0
  mulss  %xmm2,%xmm0
  addss  %xmm0,%xmm1
  movss  -0x18(%rbp),%xmm2
  movss  -0x30(%rbp),%xmm0
  mulss  %xmm2,%xmm0
  addss  %xmm1,%xmm0
  movss  -0x20(%rbp),%xmm2
  movss  -0x28(%rbp),%xmm1
  mulss  %xmm2,%xmm1
  mov    -0x48(%rbp),%rax
  add    $0x4,%rax
  subss  %xmm1,%xmm0
  movss  %xmm0,(%rax)
  movss  -0x14(%rbp),%xmm1
  movss  -0x28(%rbp),%xmm0
  mulss  %xmm0,%xmm1
  movss  -0x18(%rbp),%xmm2
  movss  -0x24(%rbp),%xmm0
  mulss  %xmm2,%xmm0
  addss  %xmm0,%xmm1
  movss  -0x20(%rbp),%xmm2
  movss  -0x2c(%rbp),%xmm0
  mulss  %xmm2,%xmm0
  addss  %xmm1,%xmm0
  movss  -0x1c(%rbp),%xmm2
  movss  -0x30(%rbp),%xmm1
  mulss  %xmm2,%xmm1
  mov    -0x48(%rbp),%rax
  add    $0x8,%rax
  subss  %xmm1,%xmm0
  movss  %xmm0,(%rax)
  movss  -0x14(%rbp),%xmm1
  movss  -0x24(%rbp),%xmm0
  mulss  %xmm1,%xmm0
  movss  -0x20(%rbp),%xmm2
  movss  -0x30(%rbp),%xmm1
  mulss  %xmm2,%xmm1
  subss  %xmm1,%xmm0
  movss  -0x1c(%rbp),%xmm2
  movss  -0x2c(%rbp),%xmm1
  mulss  %xmm2,%xmm1
  subss  %xmm1,%xmm0
  movss  -0x18(%rbp),%xmm2
  movss  -0x28(%rbp),%xmm1
  mulss  %xmm2,%xmm1
  mov    -0x48(%rbp),%rax
  add    $0xc,%rax
  subss  %xmm1,%xmm0
  movss  %xmm0,(%rax)
  mov    -0x68(%rbp),%rax
  add    $0x1c,%rax
  pxor   %xmm0,%xmm0
  movss  %xmm0,(%rax)
  mov    -0x68(%rbp),%rax
  add    $0x20,%rax
  mov    %rax,-0x48(%rbp)
  movss  -0x34(%rbp),%xmm1
  mov    -0x48(%rbp),%rax
  movss  (%rax),%xmm0
  mulss  %xmm0,%xmm1
  movss  -0x40(%rbp),%xmm2
  mov    -0x48(%rbp),%rax
  add    $0xc,%rax
  movss  (%rax),%xmm0
  mulss  %xmm2,%xmm0
  addss  %xmm0,%xmm1
  movss  -0x3c(%rbp),%xmm2
  mov    -0x48(%rbp),%rax
  add    $0x8,%rax
  movss  (%rax),%xmm0
  mulss  %xmm2,%xmm0
  addss  %xmm1,%xmm0
  movss  -0x38(%rbp),%xmm2
  mov    -0x48(%rbp),%rax
  add    $0x4,%rax
  movss  (%rax),%xmm1
  mulss  %xmm2,%xmm1
  subss  %xmm1,%xmm0
  movss  %xmm0,-0x20(%rbp)
  movss  -0x34(%rbp),%xmm1
  mov    -0x48(%rbp),%rax
  add    $0x4,%rax
  movss  (%rax),%xmm0
  mulss  %xmm0,%xmm1
  movss  -0x3c(%rbp),%xmm2
  mov    -0x48(%rbp),%rax
  add    $0xc,%rax
  movss  (%rax),%xmm0
  mulss  %xmm2,%xmm0
  addss  %xmm0,%xmm1
  movss  -0x38(%rbp),%xmm2
  mov    -0x48(%rbp),%rax
  movss  (%rax),%xmm0
  mulss  %xmm2,%xmm0
  addss  %xmm1,%xmm0
  movss  -0x40(%rbp),%xmm2
  mov    -0x48(%rbp),%rax
  add    $0x8,%rax
  movss  (%rax),%xmm1
  mulss  %xmm2,%xmm1
  subss  %xmm1,%xmm0
  movss  %xmm0,-0x1c(%rbp)
  movss  -0x34(%rbp),%xmm1
  mov    -0x48(%rbp),%rax
  add    $0x8,%rax
  movss  (%rax),%xmm0
  mulss  %xmm0,%xmm1
  movss  -0x38(%rbp),%xmm2
  mov    -0x48(%rbp),%rax
  add    $0xc,%rax
  movss  (%rax),%xmm0
  mulss  %xmm2,%xmm0
  addss  %xmm0,%xmm1
  movss  -0x40(%rbp),%xmm2
  mov    -0x48(%rbp),%rax
  add    $0x4,%rax
  movss  (%rax),%xmm0
  mulss  %xmm2,%xmm0
  addss  %xmm1,%xmm0
  movss  -0x3c(%rbp),%xmm2
  mov    -0x48(%rbp),%rax
  movss  (%rax),%xmm1
  mulss  %xmm2,%xmm1
  subss  %xmm1,%xmm0
  movss  %xmm0,-0x18(%rbp)
  movss  -0x34(%rbp),%xmm1
  mov    -0x48(%rbp),%rax
  add    $0xc,%rax
  movss  (%rax),%xmm0
  mulss  %xmm1,%xmm0
  movss  -0x40(%rbp),%xmm2
  mov    -0x48(%rbp),%rax
  movss  (%rax),%xmm1
  mulss  %xmm2,%xmm1
  subss  %xmm1,%xmm0
  movss  -0x3c(%rbp),%xmm2
  mov    -0x48(%rbp),%rax
  add    $0x4,%rax
  movss  (%rax),%xmm1
  mulss  %xmm2,%xmm1
  subss  %xmm1,%xmm0
  movss  -0x38(%rbp),%xmm2
  mov    -0x48(%rbp),%rax
  add    $0x8,%rax
  movss  (%rax),%xmm1
  mulss  %xmm2,%xmm1
  subss  %xmm1,%xmm0
  movss  %xmm0,-0x14(%rbp)
  movss  -0x14(%rbp),%xmm1
  movss  -0x30(%rbp),%xmm0
  mulss  %xmm0,%xmm1
  movss  -0x20(%rbp),%xmm2
  movss  -0x24(%rbp),%xmm0
  mulss  %xmm2,%xmm0
  addss  %xmm0,%xmm1
  movss  -0x1c(%rbp),%xmm2
  movss  -0x28(%rbp),%xmm0
  mulss  %xmm2,%xmm0
  addss  %xmm1,%xmm0
  movss  -0x18(%rbp),%xmm2
  movss  -0x2c(%rbp),%xmm1
  mulss  %xmm2,%xmm1
  subss  %xmm1,%xmm0
  mov    -0x48(%rbp),%rax
  movss  %xmm0,(%rax)
  movss  -0x14(%rbp),%xmm1
  movss  -0x2c(%rbp),%xmm0
  mulss  %xmm0,%xmm1
  movss  -0x1c(%rbp),%xmm2
  movss  -0x24(%rbp),%xmm0
  mulss  %xmm2,%xmm0
  addss  %xmm0,%xmm1
  movss  -0x18(%rbp),%xmm2
  movss  -0x30(%rbp),%xmm0
  mulss  %xmm2,%xmm0
  addss  %xmm1,%xmm0
  movss  -0x20(%rbp),%xmm2
  movss  -0x28(%rbp),%xmm1
  mulss  %xmm2,%xmm1
  mov    -0x48(%rbp),%rax
  add    $0x4,%rax
  subss  %xmm1,%xmm0
  movss  %xmm0,(%rax)
  movss  -0x14(%rbp),%xmm1
  movss  -0x28(%rbp),%xmm0
  mulss  %xmm0,%xmm1
  movss  -0x18(%rbp),%xmm2
  movss  -0x24(%rbp),%xmm0
  mulss  %xmm2,%xmm0
  addss  %xmm0,%xmm1
  movss  -0x20(%rbp),%xmm2
  movss  -0x2c(%rbp),%xmm0
  mulss  %xmm2,%xmm0
  addss  %xmm1,%xmm0
  movss  -0x1c(%rbp),%xmm2
  movss  -0x30(%rbp),%xmm1
  mulss  %xmm2,%xmm1
  mov    -0x48(%rbp),%rax
  add    $0x8,%rax
  subss  %xmm1,%xmm0
  movss  %xmm0,(%rax)
  movss  -0x14(%rbp),%xmm1
  movss  -0x24(%rbp),%xmm0
  mulss  %xmm1,%xmm0
  movss  -0x20(%rbp),%xmm2
  movss  -0x30(%rbp),%xmm1
  mulss  %xmm2,%xmm1
  subss  %xmm1,%xmm0
  movss  -0x1c(%rbp),%xmm2
  movss  -0x2c(%rbp),%xmm1
  mulss  %xmm2,%xmm1
  subss  %xmm1,%xmm0
  movss  -0x18(%rbp),%xmm2
  movss  -0x28(%rbp),%xmm1
  mulss  %xmm2,%xmm1
  mov    -0x48(%rbp),%rax
  add    $0xc,%rax
  subss  %xmm1,%xmm0
  movss  %xmm0,(%rax)
  mov    -0x68(%rbp),%rax
  add    $0x2c,%rax
  pxor   %xmm0,%xmm0
  movss  %xmm0,(%rax)
L4:
  nop
  mov    -0x8(%rbp),%rax
  sub    %fs:0x28,%rax
  je     L25
  call   <__stack_chk_fail@plt>
L25:
  leave
  ret
```

tool_calls: name: unpack_data
arguments: data_tag: D26
type_guessed: f64
name: unpack_data
arguments: data_tag: D16
type_guessed: f64
name: unpack_data
arguments: data_tag: D32
type_guessed: byte[4]

tool: D26: 3.141592653589793

tool: D16: 360

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