// File: /workspace/github_c_makefile_star2_O1/archer1357[P]Offline-Raytracer/math.c
// Function: mat4_lookAt
void mat4_lookAt(float *out,
                 float px,float py,float pz,
                 float ax,float ay,float az,
                 float ux,float uy,float uz) {
  //untested

  float eye[3]={px,py,pz};
  float at[3]={ax,ay,az};
  float up[3]={ux,uy,uz};

  float zaxis[3],xaxis[3],yaxis[3];

  vec3_sub(zaxis,at,eye);
  vec3_normal(zaxis,zaxis);

  vec3_cross(xaxis,zaxis,up);
  vec3_normal(xaxis,xaxis);

  vec3_cross(yaxis,xaxis,zaxis);
  vec3_normal(yaxis,yaxis);

  out[0]=xaxis[0];
  out[1]=yaxis[0];
  out[2]=zaxis[0];
  out[3]=0.0f;

  out[4]=xaxis[1];
  out[5]=yaxis[1];
  out[6]=zaxis[1];
  out[7]=0.0f;


  out[8]=xaxis[2];
  out[9]=yaxis[2];
  out[10]=zaxis[2];
  out[11]=0.0f;

  out[12]=-vec3_dot(xaxis,eye);
  out[13]=-vec3_dot(yaxis,eye);
  out[14]=-vec3_dot(zaxis,eye);
  out[15]=1.0f;

  //wrong handed? row major?
}

// Assembly:
pushq %rbx
subq $0x50, %rsp
movaps %xmm7, %xmm10
movq %rdi, %rbx
movss 0x60(%rsp), %xmm11
movss %xmm0, 0x28(%rsp)
subss %xmm0, %xmm3
movss %xmm1, 0x24(%rsp)
subss %xmm1, %xmm4
movss %xmm2, 0x2c(%rsp)
subss %xmm2, %xmm5
movaps %xmm4, %xmm0
mulss %xmm4, %xmm0
movaps %xmm3, %xmm1
mulss %xmm3, %xmm1
addss %xmm0, %xmm1
movaps %xmm5, %xmm0
mulss %xmm5, %xmm0
addss %xmm1, %xmm0
xorps %xmm2, %xmm2
ucomiss %xmm2, %xmm0
jb 0x4092bc
sqrtss %xmm0, %xmm0
jmp 0x409307
movaps %xmm5, 0x40(%rsp)
movss %xmm3, 0x10(%rsp)
movss %xmm4, 0xc(%rsp)
movss %xmm10, 0x30(%rsp)
movss %xmm6, 0x8(%rsp)
callq 0x4182c0
movss 0x60(%rsp), %xmm11
xorps %xmm2, %xmm2
movss 0x8(%rsp), %xmm6
movss 0x30(%rsp), %xmm10
movss 0xc(%rsp), %xmm4
movss 0x10(%rsp), %xmm3
movaps 0x40(%rsp), %xmm5
movss 0xcc181(%rip), %xmm7    # 0x4d5490
movaps %xmm7, %xmm1
divss %xmm0, %xmm1
mulss %xmm1, %xmm3
mulss %xmm1, %xmm4
mulss %xmm1, %xmm5
movaps %xmm5, %xmm0
mulss %xmm10, %xmm0
movaps %xmm4, %xmm8
mulss %xmm11, %xmm8
subss %xmm0, %xmm8
mulss %xmm3, %xmm11
movaps %xmm5, %xmm9
mulss %xmm6, %xmm9
subss %xmm11, %xmm9
mulss %xmm4, %xmm6
mulss %xmm3, %xmm10
subss %xmm6, %xmm10
movaps %xmm9, %xmm0
mulss %xmm9, %xmm0
movaps %xmm8, %xmm1
mulss %xmm8, %xmm1
addss %xmm0, %xmm1
movaps %xmm10, %xmm0
mulss %xmm10, %xmm0
addss %xmm1, %xmm0
ucomiss %xmm2, %xmm0
movaps %xmm5, 0x40(%rsp)
movss %xmm3, 0x10(%rsp)
movss %xmm4, 0xc(%rsp)
jb 0x409398
sqrtss %xmm0, %xmm0
jmp 0x4093e0
movss %xmm8, 0x8(%rsp)
movss %xmm9, 0x14(%rsp)
movss %xmm10, 0x30(%rsp)
callq 0x4182c0
movss 0x30(%rsp), %xmm10
movss 0x14(%rsp), %xmm9
movss 0x8(%rsp), %xmm8
movss 0xcc0c1(%rip), %xmm7    # 0x4d5490
movss 0xc(%rsp), %xmm4
movss 0x10(%rsp), %xmm3
movaps 0x40(%rsp), %xmm5
movaps %xmm7, %xmm11
divss %xmm0, %xmm11
mulss %xmm11, %xmm8
mulss %xmm11, %xmm9
mulss %xmm10, %xmm11
movaps %xmm4, %xmm0
mulss %xmm11, %xmm0
movaps %xmm9, %xmm10
mulss %xmm5, %xmm10
subss %xmm0, %xmm10
movaps %xmm5, %xmm0
mulss %xmm8, %xmm0
movaps %xmm11, %xmm12
mulss %xmm3, %xmm12
subss %xmm0, %xmm12
movaps %xmm3, %xmm0
mulss %xmm9, %xmm0
movaps %xmm8, %xmm2
mulss %xmm4, %xmm2
subss %xmm0, %xmm2
movaps %xmm12, %xmm0
mulss %xmm12, %xmm0
movaps %xmm10, %xmm1
mulss %xmm10, %xmm1
addss %xmm0, %xmm1
movaps %xmm2, %xmm0
mulss %xmm2, %xmm0
addss %xmm1, %xmm0
xorps %xmm1, %xmm1
ucomiss %xmm1, %xmm0
jb 0x409467
sqrtss %xmm0, %xmm0
jmp 0x4094d5
movss %xmm8, 0x8(%rsp)
movss %xmm9, 0x14(%rsp)
movaps %xmm11, 0x30(%rsp)
movss %xmm10, 0x20(%rsp)
movss %xmm12, 0x1c(%rsp)
movss %xmm2, 0x18(%rsp)
callq 0x4182c0
movss 0x18(%rsp), %xmm2
movss 0x1c(%rsp), %xmm12
movss 0x20(%rsp), %xmm10
movaps 0x30(%rsp), %xmm11
movss 0x14(%rsp), %xmm9
movss 0x8(%rsp), %xmm8
movss 0xcbfcc(%rip), %xmm7    # 0x4d5490
movss 0xc(%rsp), %xmm4
movss 0x10(%rsp), %xmm3
movaps 0x40(%rsp), %xmm5
divss %xmm0, %xmm7
mulss %xmm7, %xmm10
mulss %xmm7, %xmm12
mulss %xmm2, %xmm7
movss %xmm8, (%rbx)
movss %xmm10, 0x4(%rbx)
movss %xmm3, 0x8(%rbx)
xorl %eax, %eax
movl %eax, 0xc(%rbx)
movss %xmm9, 0x10(%rbx)
movss %xmm12, 0x14(%rbx)
movss %xmm4, 0x18(%rbx)
movl %eax, 0x1c(%rbx)
movss %xmm11, 0x20(%rbx)
movss %xmm7, 0x24(%rbx)
movss %xmm5, 0x28(%rbx)
movl %eax, 0x2c(%rbx)
movss 0x24(%rsp), %xmm6
mulss %xmm6, %xmm9
movss 0x28(%rsp), %xmm2
mulss %xmm2, %xmm8
addss %xmm9, %xmm8
movss 0x2c(%rsp), %xmm1
mulss %xmm1, %xmm11
addss %xmm8, %xmm11
movaps 0xcd6fb(%rip), %xmm0    # 0x4d6c50
xorps %xmm0, %xmm11
movss %xmm11, 0x30(%rbx)
mulss %xmm6, %xmm12
mulss %xmm2, %xmm10
addss %xmm12, %xmm10
mulss %xmm1, %xmm7
addss %xmm10, %xmm7
xorps %xmm0, %xmm7
movss %xmm7, 0x34(%rbx)
mulss %xmm6, %xmm4
mulss %xmm2, %xmm3
addss %xmm4, %xmm3
mulss %xmm1, %xmm5
addss %xmm3, %xmm5
xorps %xmm0, %xmm5
movss %xmm5, 0x38(%rbx)
movl $0x3f800000, 0x3c(%rbx) # imm = 0x3F800000
addq $0x50, %rsp
popq %rbx
retq