// File: /workspace/github_c_makefile_star2_O3/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:
movss 0x8(%rsp), %xmm11
subss %xmm0, %xmm3
subss %xmm1, %xmm4
subss %xmm2, %xmm5
movaps %xmm4, %xmm8
mulss %xmm4, %xmm8
movaps %xmm3, %xmm9
mulss %xmm3, %xmm9
addss %xmm8, %xmm9
movaps %xmm5, %xmm8
mulss %xmm5, %xmm8
addss %xmm9, %xmm8
sqrtss %xmm8, %xmm10
movss 0xce312(%rip), %xmm9    # 0x4d7920
movaps %xmm9, %xmm8
divss %xmm10, %xmm8
mulss %xmm8, %xmm3
mulss %xmm8, %xmm4
mulss %xmm5, %xmm8
movaps %xmm8, %xmm10
mulss %xmm7, %xmm10
movaps %xmm4, %xmm5
mulss %xmm11, %xmm5
subss %xmm10, %xmm5
mulss %xmm3, %xmm11
movaps %xmm8, %xmm10
mulss %xmm6, %xmm10
subss %xmm11, %xmm10
mulss %xmm4, %xmm6
mulss %xmm3, %xmm7
subss %xmm6, %xmm7
movaps %xmm10, %xmm6
mulss %xmm10, %xmm6
movaps %xmm5, %xmm11
mulss %xmm5, %xmm11
addss %xmm6, %xmm11
movaps %xmm7, %xmm6
mulss %xmm7, %xmm6
addss %xmm11, %xmm6
xorps %xmm11, %xmm11
sqrtss %xmm6, %xmm11
movaps %xmm9, %xmm6
divss %xmm11, %xmm6
movss %xmm3, 0x8(%rdi)
xorl %eax, %eax
movl %eax, 0xc(%rdi)
movss %xmm4, 0x18(%rdi)
movl %eax, 0x1c(%rdi)
movss %xmm8, 0x28(%rdi)
movl %eax, 0x2c(%rdi)
mulss %xmm6, %xmm5
mulss %xmm6, %xmm10
mulss %xmm7, %xmm6
movaps %xmm4, %xmm11
mulss %xmm6, %xmm11
movaps %xmm10, %xmm7
mulss %xmm8, %xmm7
subss %xmm11, %xmm7
movaps %xmm8, %xmm12
mulss %xmm5, %xmm12
movaps %xmm6, %xmm11
mulss %xmm3, %xmm11
subss %xmm12, %xmm11
movaps %xmm3, %xmm12
mulss %xmm10, %xmm12
movaps %xmm5, %xmm13
mulss %xmm4, %xmm13
subss %xmm12, %xmm13
movaps %xmm11, %xmm12
mulss %xmm11, %xmm12
movaps %xmm7, %xmm14
mulss %xmm7, %xmm14
addss %xmm12, %xmm14
movaps %xmm13, %xmm12
mulss %xmm13, %xmm12
addss %xmm14, %xmm12
sqrtss %xmm12, %xmm12
divss %xmm12, %xmm9
mulss %xmm9, %xmm7
mulss %xmm9, %xmm11
mulss %xmm13, %xmm9
movss %xmm5, (%rdi)
movss %xmm7, 0x4(%rdi)
movss %xmm10, 0x10(%rdi)
movss %xmm11, 0x14(%rdi)
movss %xmm6, 0x20(%rdi)
movss %xmm9, 0x24(%rdi)
unpcklps %xmm11, %xmm10          # xmm10 = xmm10[0],xmm11[0],xmm10[1],xmm11[1]
mulss %xmm1, %xmm4
shufps $0x0, %xmm1, %xmm1      # xmm1 = xmm1[0,0,0,0]
mulps %xmm10, %xmm1
unpcklps %xmm7, %xmm5            # xmm5 = xmm5[0],xmm7[0],xmm5[1],xmm7[1]
mulss %xmm0, %xmm3
shufps $0x0, %xmm0, %xmm0      # xmm0 = xmm0[0,0,0,0]
mulps %xmm5, %xmm0
addps %xmm1, %xmm0
unpcklps %xmm9, %xmm6            # xmm6 = xmm6[0],xmm9[0],xmm6[1],xmm9[1]
mulss %xmm2, %xmm8
unpcklps %xmm2, %xmm2            # xmm2 = xmm2[0,0,1,1]
mulps %xmm6, %xmm2
addps %xmm0, %xmm2
movaps 0xce1bb(%rip), %xmm0    # 0x4d7950
xorps %xmm0, %xmm2
movlps %xmm2, 0x30(%rdi)
addss %xmm3, %xmm4
addss %xmm8, %xmm4
xorps %xmm0, %xmm4
movss %xmm4, 0x38(%rdi)
movl $0x3f800000, 0x3c(%rdi) # imm = 0x3F800000
retq