// File: /workspace/github_c_makefile_star2_O1/archer1357[P]Offline-Raytracer/math.c
// Function: mat4_rotateAxis
void mat4_rotateAxis(float *out,const float *axis,
                     float angle,bool norm,bool mul) {
  float axis2[3];
  float mat[16];
  float u,v,w,L,u2,v2,w2;

  mat4_identity(mat);

  if(norm) {
    vec3_normal(axis2,axis);
  } else {
    axis2[0]=axis[0];
    axis2[1]=axis[1];
    axis2[2]=axis[2];
  }

  u=axis2[0];
  v=axis2[1];
  w=axis2[2];

  L=(u*u+v*v+w*w);

  u2=axis2[0]*axis2[0];
  v2=axis2[1]*axis2[1];
  w2=axis2[2]*axis2[2];

  mat[0]=(u2+(v2+w2)*cosf(angle))/L;
  mat[1]=(u*v*(1.0f-cosf(angle))-w*sqrtf(L)*sinf(angle))/L;
  mat[2]=(u*w*(1.0f-cosf(angle))+v*sqrtf(L)*sinf(angle))/L;

  mat[4]=(u*v*(1.0f-cosf(angle))+w*sqrtf(L)*sinf(angle))/L;
  mat[5]=(v2+(u2+w2)*cosf(angle))/L;
  mat[6]=(v*w*(1.0f-cosf(angle))-u*sqrtf(L)*sinf(angle))/L;

  mat[8]=(u*w*(1.0f-cosf(angle))-v*sqrtf(L)*sinf(angle))/L;
  mat[9]=(v*w*(1.0f-cosf(angle))+u*sqrtf(L)*sinf(angle))/L;
  mat[10]=(w2+(u2+v2)*cosf(angle))/L;

  //
  if(mul) {
    mat4_mul(out,out,mat);
  } else {
    memcpy(out,mat,sizeof(mat));
  }
}

// Assembly:
pushq %rbp
pushq %r14
pushq %rbx
subq $0x80, %rsp
movl %ecx, %ebp
movss %xmm0, 0x8(%rsp)
movq %rsi, %r14
movq %rdi, %rbx
movq $-0x40, %rax
xorl %ecx, %ecx
movl $0xcccccccd, %esi       # imm = 0xCCCCCCCD
movss 0xcd6bf(%rip), %xmm0    # 0x4d5490
xorl %edi, %edi
movl %ecx, %r8d
imulq %rsi, %r8
shrq $0x22, %r8
leal (%r8,%r8,4), %r8d
movaps %xmm0, %xmm1
addl %edi, %r8d
je 0x407ded
xorps %xmm1, %xmm1
movss %xmm1, 0x80(%rsp,%rax)
decl %edi
incl %ecx
addq $0x4, %rax
jne 0x407dd3
movss (%r14), %xmm1
movss 0x4(%r14), %xmm0
testb %dl, %dl
je 0x407e37
mulss %xmm0, %xmm0
mulss %xmm1, %xmm1
addss %xmm0, %xmm1
movss 0x8(%r14), %xmm0
mulss %xmm0, %xmm0
addss %xmm1, %xmm0
xorps %xmm1, %xmm1
ucomiss %xmm1, %xmm0
jb 0x407e3f
sqrtss %xmm0, %xmm0
jmp 0x407e44
movss 0x8(%r14), %xmm2
jmp 0x407e69
callq 0x4182c0
movss 0xcd644(%rip), %xmm2    # 0x4d5490
divss %xmm0, %xmm2
movss (%r14), %xmm1
mulss %xmm2, %xmm1
movss 0x4(%r14), %xmm0
mulss %xmm2, %xmm0
mulss 0x8(%r14), %xmm2
movss %xmm1, 0x1c(%rsp)
movss %xmm0, 0x28(%rsp)
movaps %xmm0, %xmm3
mulss %xmm0, %xmm3
movaps %xmm1, %xmm0
mulss %xmm1, %xmm0
movss %xmm0, 0xc(%rsp)
addss %xmm3, %xmm0
movss %xmm2, 0x18(%rsp)
mulss %xmm2, %xmm2
movaps %xmm2, %xmm4
movss %xmm0, 0x3c(%rsp)
addss %xmm0, %xmm4
movss %xmm4, 0x4(%rsp)
movss %xmm2, 0x34(%rsp)
movss %xmm3, 0x38(%rsp)
addss %xmm3, %xmm2
movss %xmm2, 0x10(%rsp)
movss 0x8(%rsp), %xmm0
callq 0x401078
mulss 0x10(%rsp), %xmm0
addss 0xc(%rsp), %xmm0
divss 0x4(%rsp), %xmm0
movss %xmm0, 0x40(%rsp)
movss 0x28(%rsp), %xmm0
mulss 0x1c(%rsp), %xmm0
movss %xmm0, 0x14(%rsp)
movss 0x8(%rsp), %xmm0
callq 0x401078
movss 0xcd588(%rip), %xmm1    # 0x4d5490
movss %xmm1, 0x30(%rsp)
subss %xmm0, %xmm1
movss %xmm1, 0x24(%rsp)
movss 0x4(%rsp), %xmm2
xorps %xmm0, %xmm0
sqrtss %xmm2, %xmm0
xorps %xmm1, %xmm1
ucomiss %xmm1, %xmm2
movss %xmm0, 0x10(%rsp)
jae 0x407f3e
movss 0x4(%rsp), %xmm0
callq 0x4182c0
movss %xmm0, 0x20(%rsp)
movss 0x8(%rsp), %xmm0
callq 0x401118
movss 0x18(%rsp), %xmm1
movss 0x20(%rsp), %xmm2
mulss %xmm1, %xmm2
mulss %xmm0, %xmm2
movss 0x24(%rsp), %xmm0
mulss 0x14(%rsp), %xmm0
subss %xmm2, %xmm0
divss 0x4(%rsp), %xmm0
movss %xmm0, 0x44(%rsp)
mulss 0x1c(%rsp), %xmm1
movss %xmm1, 0x24(%rsp)
movss 0x8(%rsp), %xmm0
callq 0x401078
movss 0xcd4f2(%rip), %xmm1    # 0x4d5490
subss %xmm0, %xmm1
movss %xmm1, 0x20(%rsp)
movss 0x4(%rsp), %xmm0
ucomiss 0xcd507(%rip), %xmm0    # 0x4d54bc
movss 0x10(%rsp), %xmm0
jae 0x407fc8
movss 0x4(%rsp), %xmm0
callq 0x4182c0
mulss 0x28(%rsp), %xmm0
movss %xmm0, 0x2c(%rsp)
movss 0x8(%rsp), %xmm0
callq 0x401118
mulss 0x2c(%rsp), %xmm0
movss 0x20(%rsp), %xmm1
mulss 0x24(%rsp), %xmm1
addss %xmm0, %xmm1
divss 0x4(%rsp), %xmm1
movss %xmm1, 0x48(%rsp)
movss 0x8(%rsp), %xmm0
callq 0x401078
movss 0xcd47c(%rip), %xmm1    # 0x4d5490
subss %xmm0, %xmm1
movss %xmm1, 0x20(%rsp)
xorps %xmm0, %xmm0
movss 0x4(%rsp), %xmm1
ucomiss %xmm0, %xmm1
movss 0x10(%rsp), %xmm0
jae 0x40803d
movss 0x4(%rsp), %xmm0
callq 0x4182c0
mulss 0x18(%rsp), %xmm0
movss %xmm0, 0x2c(%rsp)
movss 0x8(%rsp), %xmm0
callq 0x401118
mulss 0x2c(%rsp), %xmm0
movss 0x14(%rsp), %xmm1
mulss 0x20(%rsp), %xmm1
addss %xmm0, %xmm1
divss 0x4(%rsp), %xmm1
movss %xmm1, 0x50(%rsp)
movss 0xc(%rsp), %xmm0
addss 0x34(%rsp), %xmm0
movss %xmm0, 0xc(%rsp)
movss 0x8(%rsp), %xmm0
callq 0x401078
mulss 0xc(%rsp), %xmm0
addss 0x38(%rsp), %xmm0
divss 0x4(%rsp), %xmm0
movss %xmm0, 0x54(%rsp)
movss 0x18(%rsp), %xmm0
mulss 0x28(%rsp), %xmm0
movss %xmm0, 0x18(%rsp)
movss 0x8(%rsp), %xmm0
callq 0x401078
movss 0xcd3c0(%rip), %xmm1    # 0x4d5490
subss %xmm0, %xmm1
movss %xmm1, 0xc(%rsp)
movss 0x4(%rsp), %xmm0
ucomiss 0xcd3d5(%rip), %xmm0    # 0x4d54bc
movss 0x10(%rsp), %xmm0
jae 0x4080fa
movss 0x4(%rsp), %xmm0
callq 0x4182c0
movss %xmm0, 0x14(%rsp)
movss 0x8(%rsp), %xmm0
callq 0x401118
movss 0x14(%rsp), %xmm1
mulss 0x1c(%rsp), %xmm1
mulss %xmm0, %xmm1
movss 0xc(%rsp), %xmm0
mulss 0x18(%rsp), %xmm0
subss %xmm1, %xmm0
divss 0x4(%rsp), %xmm0
movss %xmm0, 0x58(%rsp)
movss 0x8(%rsp), %xmm0
callq 0x401078
movss 0xcd346(%rip), %xmm1    # 0x4d5490
subss %xmm0, %xmm1
movss %xmm1, 0xc(%rsp)
xorps %xmm0, %xmm0
movss 0x4(%rsp), %xmm1
ucomiss %xmm0, %xmm1
movss 0x10(%rsp), %xmm0
jae 0x408173
movss 0x4(%rsp), %xmm0
callq 0x4182c0
movss %xmm0, 0x14(%rsp)
movss 0x8(%rsp), %xmm0
callq 0x401118
movss 0x14(%rsp), %xmm1
mulss 0x28(%rsp), %xmm1
mulss %xmm0, %xmm1
movss 0x24(%rsp), %xmm0
mulss 0xc(%rsp), %xmm0
subss %xmm1, %xmm0
divss 0x4(%rsp), %xmm0
movss %xmm0, 0x60(%rsp)
movss 0x8(%rsp), %xmm0
callq 0x401078
movss 0x30(%rsp), %xmm1
subss %xmm0, %xmm1
movss %xmm1, 0x30(%rsp)
movss 0x4(%rsp), %xmm0
ucomiss 0xcd2e4(%rip), %xmm0    # 0x4d54bc
jae 0x4081eb
movss 0x4(%rsp), %xmm0
callq 0x4182c0
movss %xmm0, 0x10(%rsp)
movss 0x1c(%rsp), %xmm0
mulss 0x10(%rsp), %xmm0
movss %xmm0, 0x1c(%rsp)
movss 0x8(%rsp), %xmm0
callq 0x401118
mulss 0x1c(%rsp), %xmm0
movss 0x18(%rsp), %xmm1
mulss 0x30(%rsp), %xmm1
addss %xmm0, %xmm1
divss 0x4(%rsp), %xmm1
movss %xmm1, 0x64(%rsp)
movss 0x8(%rsp), %xmm0
callq 0x401078
movss 0x3c(%rsp), %xmm1
mulss %xmm0, %xmm1
addss 0x34(%rsp), %xmm1
divss 0x4(%rsp), %xmm1
movss %xmm1, 0x68(%rsp)
testb %bpl, %bpl
je 0x408268
leaq 0x40(%rsp), %rdx
movq %rbx, %rdi
movq %rbx, %rsi
callq 0x407742
jmp 0x40828b
movaps 0x40(%rsp), %xmm0
movaps 0x50(%rsp), %xmm1
movaps 0x60(%rsp), %xmm2
movaps 0x70(%rsp), %xmm3
movups %xmm3, 0x30(%rbx)
movups %xmm2, 0x20(%rbx)
movups %xmm1, 0x10(%rbx)
movups %xmm0, (%rbx)
addq $0x80, %rsp
popq %rbx
popq %r14
popq %rbp
retq