// File: tomfunkhouser[P]gaps/pkgs/R3Shapes/R3Align.cpp
// Function: gaps::SetQuaternion(double*)
static R4Matrix
SetQuaternion(RNScalar p[4])
{
  R4Matrix m(R4identity_matrix);
  RNScalar l;

  if(p[0]<0){
    p[0]=-p[0];
    p[1]=-p[1];
    p[2]=-p[2];
    p[3]=-p[3];
  }
  l=p[0]*p[0]+p[1]*p[1]+p[2]*p[2]+p[3]*p[3];
  if(l<.000001){return R4identity_matrix;}

  l=sqrt(l);
  p[0]/=l;
  p[1]/=l;
  p[2]/=l;
  p[3]/=l;

  m[0][0]=p[0]*p[0]+p[1]*p[1]-p[2]*p[2]-p[3]*p[3];
  m[0][1]=2*(p[1]*p[2]+p[0]*p[3]);
  m[0][2]=2*(p[1]*p[3]-p[0]*p[2]);

  m[1][0]=2*(p[1]*p[2]-p[0]*p[3]);
  m[1][1]=p[0]*p[0]+p[2]*p[2]-p[1]*p[1]-p[3]*p[3];
  m[1][2]=2*(p[2]*p[3]+p[0]*p[1]);

  m[2][0]=2*(p[1]*p[3]+p[0]*p[2]);
  m[2][1]=2*(p[2]*p[3]-p[0]*p[1]);
  m[2][2]=p[0]*p[0]+p[3]*p[3]-p[1]*p[1]-p[2]*p[2];

  return m;
}

// Assembly:
subq $0xf8, %rsp
movq %rdi, 0x50(%rsp)
movq %rdi, %rax
movq %rax, 0x58(%rsp)
movq %rdi, 0xf0(%rsp)
movq %rsi, 0xe8(%rsp)
leaq 0x68(%rsp), %rdi
leaq 0xe9fa0(%rip), %rsi     # 0x178c30
callq 0x51b60
movq 0xe8(%rsp), %rax
xorps %xmm0, %xmm0
ucomisd (%rax), %xmm0
jbe 0x8ed6c
movq 0xe8(%rsp), %rax
movsd (%rax), %xmm0
movq %xmm0, %rax
movabsq $-0x8000000000000000, %rcx # imm = 0x8000000000000000
xorq %rcx, %rax
movq %rax, %xmm0
movq 0xe8(%rsp), %rax
movsd %xmm0, (%rax)
movq 0xe8(%rsp), %rax
movsd 0x8(%rax), %xmm0
movq %xmm0, %rax
movabsq $-0x8000000000000000, %rcx # imm = 0x8000000000000000
xorq %rcx, %rax
movq %rax, %xmm0
movq 0xe8(%rsp), %rax
movsd %xmm0, 0x8(%rax)
movq 0xe8(%rsp), %rax
movsd 0x10(%rax), %xmm0
movq %xmm0, %rax
movabsq $-0x8000000000000000, %rcx # imm = 0x8000000000000000
xorq %rcx, %rax
movq %rax, %xmm0
movq 0xe8(%rsp), %rax
movsd %xmm0, 0x10(%rax)
movq 0xe8(%rsp), %rax
movsd 0x18(%rax), %xmm0
movq %xmm0, %rax
movabsq $-0x8000000000000000, %rcx # imm = 0x8000000000000000
xorq %rcx, %rax
movq %rax, %xmm0
movq 0xe8(%rsp), %rax
movsd %xmm0, 0x18(%rax)
movq 0xe8(%rsp), %rax
movsd (%rax), %xmm0
movq 0xe8(%rsp), %rax
movsd (%rax), %xmm2
movq 0xe8(%rsp), %rax
movsd 0x8(%rax), %xmm1
movq 0xe8(%rsp), %rax
mulsd 0x8(%rax), %xmm1
mulsd %xmm2, %xmm0
addsd %xmm1, %xmm0
movq 0xe8(%rsp), %rax
movsd 0x10(%rax), %xmm1
movq 0xe8(%rsp), %rax
movsd 0x10(%rax), %xmm2
mulsd %xmm2, %xmm1
addsd %xmm0, %xmm1
movq 0xe8(%rsp), %rax
movsd 0x18(%rax), %xmm0
movq 0xe8(%rsp), %rax
movsd 0x18(%rax), %xmm2
mulsd %xmm2, %xmm0
addsd %xmm1, %xmm0
movsd %xmm0, 0x60(%rsp)
movsd 0xa43f0(%rip), %xmm0    # 0x1331e8
ucomisd 0x60(%rsp), %xmm0
jbe 0x8ee16
movq 0x50(%rsp), %rdi
leaq 0xe9e24(%rip), %rsi     # 0x178c30
callq 0x51b60
jmp 0x8f3ab
movsd 0x60(%rsp), %xmm0
callq 0xf390
movsd %xmm0, 0x60(%rsp)
movsd 0x60(%rsp), %xmm1
movq 0xe8(%rsp), %rax
movsd (%rax), %xmm0
divsd %xmm1, %xmm0
movsd %xmm0, (%rax)
movsd 0x60(%rsp), %xmm1
movq 0xe8(%rsp), %rax
movsd 0x8(%rax), %xmm0
divsd %xmm1, %xmm0
movsd %xmm0, 0x8(%rax)
movsd 0x60(%rsp), %xmm1
movq 0xe8(%rsp), %rax
movsd 0x10(%rax), %xmm0
divsd %xmm1, %xmm0
movsd %xmm0, 0x10(%rax)
movsd 0x60(%rsp), %xmm1
movq 0xe8(%rsp), %rax
movsd 0x18(%rax), %xmm0
divsd %xmm1, %xmm0
movsd %xmm0, 0x18(%rax)
movq 0xe8(%rsp), %rax
movsd (%rax), %xmm0
movq 0xe8(%rsp), %rax
movsd (%rax), %xmm2
movq 0xe8(%rsp), %rax
movsd 0x8(%rax), %xmm1
movq 0xe8(%rsp), %rax
mulsd 0x8(%rax), %xmm1
mulsd %xmm2, %xmm0
addsd %xmm1, %xmm0
movq 0xe8(%rsp), %rax
movsd 0x10(%rax), %xmm1
movq 0xe8(%rsp), %rax
movsd 0x10(%rax), %xmm2
movq %xmm1, %rax
movabsq $-0x8000000000000000, %rcx # imm = 0x8000000000000000
xorq %rcx, %rax
movq %rax, %xmm1
mulsd %xmm2, %xmm1
addsd %xmm0, %xmm1
movq 0xe8(%rsp), %rax
movsd 0x18(%rax), %xmm0
movq 0xe8(%rsp), %rax
movsd 0x18(%rax), %xmm2
movq %xmm0, %rax
movabsq $-0x8000000000000000, %rcx # imm = 0x8000000000000000
xorq %rcx, %rax
movq %rax, %xmm0
mulsd %xmm2, %xmm0
addsd %xmm1, %xmm0
movsd %xmm0, 0x8(%rsp)
leaq 0x68(%rsp), %rdi
xorl %esi, %esi
callq 0x51ad0
movsd 0x8(%rsp), %xmm0
movsd %xmm0, (%rax)
movq 0xe8(%rsp), %rax
movsd 0x8(%rax), %xmm1
movq 0xe8(%rsp), %rax
movsd 0x10(%rax), %xmm2
movq 0xe8(%rsp), %rax
movsd (%rax), %xmm0
movq 0xe8(%rsp), %rax
mulsd 0x18(%rax), %xmm0
mulsd %xmm2, %xmm1
addsd %xmm0, %xmm1
movsd 0xa4260(%rip), %xmm0    # 0x133200
mulsd %xmm1, %xmm0
movsd %xmm0, 0x10(%rsp)
leaq 0x68(%rsp), %rdi
xorl %esi, %esi
callq 0x51ad0
movsd 0x10(%rsp), %xmm0
movsd %xmm0, 0x8(%rax)
movq 0xe8(%rsp), %rax
movsd 0x8(%rax), %xmm1
movq 0xe8(%rsp), %rax
movsd 0x18(%rax), %xmm2
movq 0xe8(%rsp), %rax
movsd (%rax), %xmm0
movq 0xe8(%rsp), %rax
mulsd 0x10(%rax), %xmm0
movq %xmm0, %rax
movabsq $-0x8000000000000000, %rcx # imm = 0x8000000000000000
xorq %rcx, %rax
movq %rax, %xmm0
mulsd %xmm2, %xmm1
addsd %xmm0, %xmm1
movsd 0xa41e5(%rip), %xmm0    # 0x133200
mulsd %xmm1, %xmm0
movsd %xmm0, 0x18(%rsp)
leaq 0x68(%rsp), %rdi
xorl %esi, %esi
callq 0x51ad0
movsd 0x18(%rsp), %xmm0
movsd %xmm0, 0x10(%rax)
movq 0xe8(%rsp), %rax
movsd 0x8(%rax), %xmm1
movq 0xe8(%rsp), %rax
movsd 0x10(%rax), %xmm2
movq 0xe8(%rsp), %rax
movsd (%rax), %xmm0
movq 0xe8(%rsp), %rax
mulsd 0x18(%rax), %xmm0
movq %xmm0, %rax
movabsq $-0x8000000000000000, %rcx # imm = 0x8000000000000000
xorq %rcx, %rax
movq %rax, %xmm0
mulsd %xmm2, %xmm1
addsd %xmm0, %xmm1
movsd 0xa416a(%rip), %xmm0    # 0x133200
mulsd %xmm1, %xmm0
movsd %xmm0, 0x20(%rsp)
leaq 0x68(%rsp), %rdi
movl $0x1, %esi
callq 0x51ad0
movsd 0x20(%rsp), %xmm0
movsd %xmm0, (%rax)
movq 0xe8(%rsp), %rax
movsd (%rax), %xmm0
movq 0xe8(%rsp), %rax
movsd (%rax), %xmm2
movq 0xe8(%rsp), %rax
movsd 0x10(%rax), %xmm1
movq 0xe8(%rsp), %rax
mulsd 0x10(%rax), %xmm1
mulsd %xmm2, %xmm0
addsd %xmm1, %xmm0
movq 0xe8(%rsp), %rax
movsd 0x8(%rax), %xmm1
movq 0xe8(%rsp), %rax
movsd 0x8(%rax), %xmm2
movq %xmm1, %rax
movabsq $-0x8000000000000000, %rcx # imm = 0x8000000000000000
xorq %rcx, %rax
movq %rax, %xmm1
mulsd %xmm2, %xmm1
addsd %xmm0, %xmm1
movq 0xe8(%rsp), %rax
movsd 0x18(%rax), %xmm0
movq 0xe8(%rsp), %rax
movsd 0x18(%rax), %xmm2
movq %xmm0, %rax
movabsq $-0x8000000000000000, %rcx # imm = 0x8000000000000000
xorq %rcx, %rax
movq %rax, %xmm0
mulsd %xmm2, %xmm0
addsd %xmm1, %xmm0
movsd %xmm0, 0x28(%rsp)
leaq 0x68(%rsp), %rdi
movl $0x1, %esi
callq 0x51ad0
movsd 0x28(%rsp), %xmm0
movsd %xmm0, 0x8(%rax)
movq 0xe8(%rsp), %rax
movsd 0x10(%rax), %xmm1
movq 0xe8(%rsp), %rax
movsd 0x18(%rax), %xmm2
movq 0xe8(%rsp), %rax
movsd (%rax), %xmm0
movq 0xe8(%rsp), %rax
mulsd 0x8(%rax), %xmm0
mulsd %xmm2, %xmm1
addsd %xmm0, %xmm1
movsd 0xa4038(%rip), %xmm0    # 0x133200
mulsd %xmm1, %xmm0
movsd %xmm0, 0x30(%rsp)
leaq 0x68(%rsp), %rdi
movl $0x1, %esi
callq 0x51ad0
movsd 0x30(%rsp), %xmm0
movsd %xmm0, 0x10(%rax)
movq 0xe8(%rsp), %rax
movsd 0x8(%rax), %xmm1
movq 0xe8(%rsp), %rax
movsd 0x18(%rax), %xmm2
movq 0xe8(%rsp), %rax
movsd (%rax), %xmm0
movq 0xe8(%rsp), %rax
mulsd 0x10(%rax), %xmm0
mulsd %xmm2, %xmm1
addsd %xmm0, %xmm1
movsd 0xa3fd1(%rip), %xmm0    # 0x133200
mulsd %xmm1, %xmm0
movsd %xmm0, 0x38(%rsp)
leaq 0x68(%rsp), %rdi
movl $0x2, %esi
callq 0x51ad0
movsd 0x38(%rsp), %xmm0
movsd %xmm0, (%rax)
movq 0xe8(%rsp), %rax
movsd 0x10(%rax), %xmm1
movq 0xe8(%rsp), %rax
movsd 0x18(%rax), %xmm2
movq 0xe8(%rsp), %rax
movsd (%rax), %xmm0
movq 0xe8(%rsp), %rax
mulsd 0x8(%rax), %xmm0
movq %xmm0, %rax
movabsq $-0x8000000000000000, %rcx # imm = 0x8000000000000000
xorq %rcx, %rax
movq %rax, %xmm0
mulsd %xmm2, %xmm1
addsd %xmm0, %xmm1
movsd 0xa3f54(%rip), %xmm0    # 0x133200
mulsd %xmm1, %xmm0
movsd %xmm0, 0x40(%rsp)
leaq 0x68(%rsp), %rdi
movl $0x2, %esi
callq 0x51ad0
movsd 0x40(%rsp), %xmm0
movsd %xmm0, 0x8(%rax)
movq 0xe8(%rsp), %rax
movsd (%rax), %xmm0
movq 0xe8(%rsp), %rax
movsd (%rax), %xmm2
movq 0xe8(%rsp), %rax
movsd 0x18(%rax), %xmm1
movq 0xe8(%rsp), %rax
mulsd 0x18(%rax), %xmm1
mulsd %xmm2, %xmm0
addsd %xmm1, %xmm0
movq 0xe8(%rsp), %rax
movsd 0x8(%rax), %xmm1
movq 0xe8(%rsp), %rax
movsd 0x8(%rax), %xmm2
movq %xmm1, %rax
movabsq $-0x8000000000000000, %rcx # imm = 0x8000000000000000
xorq %rcx, %rax
movq %rax, %xmm1
mulsd %xmm2, %xmm1
addsd %xmm0, %xmm1
movq 0xe8(%rsp), %rax
movsd 0x10(%rax), %xmm0
movq 0xe8(%rsp), %rax
movsd 0x10(%rax), %xmm2
movq %xmm0, %rax
movabsq $-0x8000000000000000, %rcx # imm = 0x8000000000000000
xorq %rcx, %rax
movq %rax, %xmm0
mulsd %xmm2, %xmm0
addsd %xmm1, %xmm0
movsd %xmm0, 0x48(%rsp)
leaq 0x68(%rsp), %rdi
movl $0x2, %esi
callq 0x51ad0
movsd 0x48(%rsp), %xmm0
movq 0x50(%rsp), %rdi
movsd %xmm0, 0x10(%rax)
leaq 0x68(%rsp), %rsi
callq 0x51b60
movq 0x58(%rsp), %rax
addq $0xf8, %rsp
retq
nopl (%rax,%rax)