// File: /workspace/github_cpp_makefile_star2_O1/Luthaf[P]zeopp/geometry.cc
// Function: RotatePointAboutLine(XYZ, double, XYZ, XYZ)
XYZ RotatePointAboutLine(XYZ p, double theta, XYZ p1, XYZ p2) {
  XYZ u, q1, q2;
  double d;
  // Step 1
  q1 = p - p1;
  u = (p2 - p1).unit();
  d = sqrt(u.y*u.y + u.z*u.z);
  // Step 2
  if (d!=0) {
    q2.x = q1.x;
    q2.y = q1.y * u.z / d - q1.z * u.y / d;
    q2.z = q1.y * u.y / d + q1.z * u.z / d;
  } else {
    q2 = q1;
  }
  // Step 3
  q1.x = q2.x * d - q2.z * u.x;
  q1.y = q2.y;
  q1.z = q2.x * u.x + q2.z * d;
  // Step 4
  q2.x = q1.x * cos(theta) - q1.y * sin(theta);
  q2.y = q1.x * sin(theta) + q1.y * cos(theta);
  q2.z = q1.z;
  // Inverse of step 3
  q1.x = q2.x * d + q2.z * u.x;
  q1.y = q2.y;
  q1.z = - q2.x * u.x + q2.z * d;
  // Inverse of step 2
  if (d!=0) {
    q2.x =   q1.x;
    q2.y =   q1.y * u.z / d + q1.z * u.y / d;
    q2.z = - q1.y * u.y / d + q1.z * u.z / d;
  } else {
    q2 = q1;
  }
  // Inverse of step 1
  q1 = q2 + p1;
  return(q1);
}

// Assembly:
pushq %rbx
subq $0x70, %rsp
movsd %xmm0, 0x40(%rsp)
movq %rdi, %rbx
xorps %xmm0, %xmm0
movups %xmm0, (%rdi)
movq $0x0, 0x10(%rdi)
movsd 0x98(%rsp), %xmm0
movsd 0xa0(%rsp), %xmm1
movsd 0x80(%rsp), %xmm3
movsd 0x88(%rsp), %xmm4
subsd %xmm0, %xmm3
subsd %xmm1, %xmm4
movsd 0x90(%rsp), %xmm5
movsd 0xa8(%rsp), %xmm2
subsd %xmm2, %xmm5
movsd %xmm3, (%rdi)
movsd %xmm4, 0x28(%rsp)
movsd %xmm4, 0x8(%rdi)
movsd %xmm5, 0x20(%rsp)
movsd %xmm5, 0x10(%rdi)
movsd 0xb0(%rsp), %xmm6
movsd 0xb8(%rsp), %xmm4
movsd %xmm0, 0x68(%rsp)
subsd %xmm0, %xmm6
movsd %xmm1, 0x60(%rsp)
subsd %xmm1, %xmm4
movsd 0xc0(%rsp), %xmm5
movsd %xmm2, 0x58(%rsp)
subsd %xmm2, %xmm5
movsd %xmm4, 0x8(%rsp)
movapd %xmm4, %xmm0
mulsd %xmm4, %xmm0
movsd %xmm6, 0x30(%rsp)
movapd %xmm6, %xmm1
mulsd %xmm6, %xmm1
addsd %xmm0, %xmm1
movsd %xmm5, 0x38(%rsp)
mulsd %xmm5, %xmm5
addsd %xmm1, %xmm5
xorps %xmm2, %xmm2
sqrtsd %xmm5, %xmm2
xorpd %xmm1, %xmm1
ucomisd %xmm1, %xmm5
movapd %xmm2, %xmm0
movsd %xmm3, (%rsp)
movsd %xmm5, 0x18(%rsp)
movsd %xmm2, 0x10(%rsp)
jae 0x86615
movapd %xmm5, %xmm0
callq 0x4350
xorpd %xmm1, %xmm1
movsd 0x10(%rsp), %xmm2
movsd 0x18(%rsp), %xmm5
movsd (%rsp), %xmm3
movsd %xmm0, 0x48(%rsp)
ucomisd %xmm1, %xmm5
movapd %xmm2, %xmm0
jae 0x8663f
movapd %xmm5, %xmm0
callq 0x4350
movsd 0x10(%rsp), %xmm2
movsd 0x18(%rsp), %xmm5
movsd (%rsp), %xmm3
movsd 0x8(%rsp), %xmm1
divsd %xmm0, %xmm1
movsd %xmm1, 0x8(%rsp)
xorpd %xmm4, %xmm4
ucomisd %xmm4, %xmm5
jae 0x8666f
movapd %xmm5, %xmm0
callq 0x4350
xorpd %xmm4, %xmm4
movsd (%rsp), %xmm3
movapd %xmm0, %xmm2
movsd 0x38(%rsp), %xmm1
divsd %xmm2, %xmm1
movsd %xmm1, 0x38(%rsp)
mulsd %xmm1, %xmm1
movsd 0x8(%rsp), %xmm0
mulsd %xmm0, %xmm0
addsd %xmm1, %xmm0
ucomisd %xmm4, %xmm0
jb 0x8669e
sqrtsd %xmm0, %xmm8
jmp 0x866ad
callq 0x4350
movsd (%rsp), %xmm3
movapd %xmm0, %xmm8
movsd 0x30(%rsp), %xmm5
movsd 0x28(%rsp), %xmm6
divsd 0x48(%rsp), %xmm5
xorpd %xmm0, %xmm0
ucomisd %xmm0, %xmm8
jne 0x866cc
jnp 0x86718
movapd %xmm6, %xmm0
movsd 0x38(%rsp), %xmm4
mulsd %xmm4, %xmm0
divsd %xmm8, %xmm0
movsd 0x20(%rsp), %xmm7
movapd %xmm7, %xmm1
movsd 0x8(%rsp), %xmm2
mulsd %xmm2, %xmm1
divsd %xmm8, %xmm1
subsd %xmm1, %xmm0
mulsd %xmm2, %xmm6
divsd %xmm8, %xmm6
mulsd %xmm4, %xmm7
divsd %xmm8, %xmm7
addsd %xmm6, %xmm7
movapd %xmm0, %xmm6
jmp 0x8671e
movsd 0x20(%rsp), %xmm7
movsd %xmm6, 0x28(%rsp)
movapd %xmm5, %xmm0
mulsd %xmm7, %xmm0
movapd %xmm3, %xmm1
mulsd %xmm8, %xmm1
subsd %xmm0, %xmm1
movsd %xmm1, 0x48(%rsp)
movsd %xmm1, (%rbx)
movsd %xmm6, 0x8(%rbx)
mulsd %xmm8, %xmm7
mulsd %xmm5, %xmm3
addsd %xmm7, %xmm3
movsd %xmm3, (%rsp)
movsd %xmm3, 0x10(%rbx)
movsd 0x40(%rsp), %xmm0
movsd %xmm5, 0x30(%rsp)
movsd %xmm8, 0x20(%rsp)
callq 0x4800
movsd %xmm0, 0x18(%rsp)
movsd 0x40(%rsp), %xmm0
callq 0x4100
movsd %xmm0, 0x10(%rsp)
movsd 0x40(%rsp), %xmm0
callq 0x4100
movsd %xmm0, 0x50(%rsp)
movsd 0x40(%rsp), %xmm0
callq 0x4800
movsd 0x50(%rsp), %xmm7
movsd 0x20(%rsp), %xmm6
movsd (%rsp), %xmm3
ucomisd 0xccafd(%rip), %xmm6    # 0x1532c0
movsd 0x28(%rsp), %xmm2
movsd 0x10(%rsp), %xmm5
mulsd %xmm2, %xmm5
movsd 0x18(%rsp), %xmm4
movsd 0x48(%rsp), %xmm1
mulsd %xmm1, %xmm4
subsd %xmm5, %xmm4
mulsd %xmm2, %xmm0
mulsd %xmm1, %xmm7
addsd %xmm0, %xmm7
movsd 0x30(%rsp), %xmm2
movapd %xmm2, %xmm1
mulsd %xmm3, %xmm1
movapd %xmm4, %xmm0
mulsd %xmm6, %xmm0
addsd %xmm1, %xmm0
movsd %xmm0, (%rbx)
movsd %xmm7, 0x8(%rbx)
mulsd %xmm6, %xmm3
mulsd %xmm2, %xmm4
subsd %xmm4, %xmm3
movsd %xmm3, 0x10(%rbx)
jne 0x8682b
jnp 0x8686f
movsd 0x38(%rsp), %xmm5
movapd %xmm5, %xmm1
mulsd %xmm7, %xmm1
divsd %xmm6, %xmm1
movsd 0x8(%rsp), %xmm4
movapd %xmm4, %xmm2
mulsd %xmm3, %xmm2
divsd %xmm6, %xmm2
addsd %xmm1, %xmm2
mulsd %xmm7, %xmm4
divsd %xmm6, %xmm4
mulsd %xmm3, %xmm5
divsd %xmm6, %xmm5
subsd %xmm4, %xmm5
movapd %xmm2, %xmm7
movapd %xmm5, %xmm3
movsd 0x68(%rsp), %xmm1
addsd %xmm0, %xmm1
movsd 0x60(%rsp), %xmm0
addsd %xmm7, %xmm0
movsd 0x58(%rsp), %xmm2
addsd %xmm3, %xmm2
movsd %xmm1, (%rbx)
movsd %xmm0, 0x8(%rbx)
movsd %xmm2, 0x10(%rbx)
movq %rbx, %rax
addq $0x70, %rsp
popq %rbx
retq