#define NULL ((void *)0)
typedef unsigned long size_t; // Customize by platform.
typedef long intptr_t;
typedef unsigned long uintptr_t;
typedef long scalar_t__; // Either arithmetic or pointer type.
/* By default, we understand bool (as a convenience). */
typedef int bool;
#define false 0
#define true 1

/* Forward declarations */

/* Type definitions */

/* Variables and functions */
int acos(double);
int cos(double);
double sqrt(double);
__attribute__((warn_unused_result)) int
eig_3x3(double *restrict a, double *restrict b, double *restrict eig) {
  double *a00 __attribute__((unused)) = a++;
  double *a10 __attribute__((unused)) = a++;
  double *a20 __attribute__((unused)) = a++;
  double *a01 __attribute__((unused)) = a++;
  double *a11 __attribute__((unused)) = a++;
  double *a21 __attribute__((unused)) = a++;
  double *a02 __attribute__((unused)) = a++;
  double *a12 __attribute__((unused)) = a++;
  double *a22 __attribute__((unused)) = a++;
  ;
  double *b00 __attribute__((unused)) = b++;
  double *b10 __attribute__((unused)) = b++;
  double *b20 __attribute__((unused)) = b++;
  double *b01 __attribute__((unused)) = b++;
  double *b11 __attribute__((unused)) = b++;
  double *b21 __attribute__((unused)) = b++;
  double *b02 __attribute__((unused)) = b++;
  double *b12 __attribute__((unused)) = b++;
  double *b22 __attribute__((unused)) = b++;
  ;
  double pi = 3.14159265358979323846264338327950288;
  double p1 = *a01 * *a01 + *a02 * *a02 + *a12 * *a12;
  if (p1 == 0) {
    eig[0] = *a00;
    eig[1] = *a11;
    eig[2] = *a22;
  } else {
    double q = (*a00 + *a11 + *a22) / 3.0;
    double p2 = (*a00 - q) * (*a00 - q) + (*a11 - q) * (*a11 - q) +
                (*a22 - q) * (*a22 - q) + 2 * p1;
    double p = sqrt(p2 / 6.0);
    *b00 = (1 / p) * (*a00 - q);
    *b11 = (1 / p) * (*a11 - q);
    *b22 = (1 / p) * (*a22 - q);
    *b01 = (1 / p) * (*a01);
    *b02 = (1 / p) * (*a02);
    *b10 = (1 / p) * (*a10);
    *b12 = (1 / p) * (*a12);
    *b20 = (1 / p) * (*a20);
    *b21 = (1 / p) * (*a21);
    double det = *b00 * *b11 * *b22 + *b01 * *b12 * *b20 + *b02 * *b10 * *b21 -
                 *b00 * *b12 * *b21 - *b01 * *b10 * *b22 - *b02 * *b11 * *b20;
    double r = det / 2.0;
    double phi;
    if (r <= -1)
      phi = pi / 3.0;
    else if (r >= 1)
      phi = 0.0;
    else
      phi = acos(r) / 3;
    eig[0] = q + 2 * p * cos(phi);
    eig[2] = q + 2 * p * cos(phi + (2 * pi / 3));
    eig[1] = 3 * q - eig[0] - eig[2];
  }
  return 0;
}


x86 assembly (clang, -O0):
<eig_3x3>:
push   %rbp
mov    %rsp,%rbp
sub    $0x110,%rsp
mov    %rdi,-0x8(%rbp)
mov    %rsi,-0x10(%rbp)
mov    %rdx,-0x18(%rbp)
mov    -0x8(%rbp),%rax
mov    %rax,%rcx
add    $0x8,%rcx
mov    %rcx,-0x8(%rbp)
mov    %rax,-0x20(%rbp)
mov    -0x8(%rbp),%rax
mov    %rax,%rcx
add    $0x8,%rcx
mov    %rcx,-0x8(%rbp)
mov    %rax,-0x28(%rbp)
mov    -0x8(%rbp),%rax
mov    %rax,%rcx
add    $0x8,%rcx
mov    %rcx,-0x8(%rbp)
mov    %rax,-0x30(%rbp)
mov    -0x8(%rbp),%rax
mov    %rax,%rcx
add    $0x8,%rcx
mov    %rcx,-0x8(%rbp)
mov    %rax,-0x38(%rbp)
mov    -0x8(%rbp),%rax
mov    %rax,%rcx
add    $0x8,%rcx
mov    %rcx,-0x8(%rbp)
mov    %rax,-0x40(%rbp)
mov    -0x8(%rbp),%rax
mov    %rax,%rcx
add    $0x8,%rcx
mov    %rcx,-0x8(%rbp)
mov    %rax,-0x48(%rbp)
mov    -0x8(%rbp),%rax
mov    %rax,%rcx
add    $0x8,%rcx
mov    %rcx,-0x8(%rbp)
mov    %rax,-0x50(%rbp)
mov    -0x8(%rbp),%rax
mov    %rax,%rcx
add    $0x8,%rcx
mov    %rcx,-0x8(%rbp)
mov    %rax,-0x58(%rbp)
mov    -0x8(%rbp),%rax
mov    %rax,%rcx
add    $0x8,%rcx
mov    %rcx,-0x8(%rbp)
mov    %rax,-0x60(%rbp)
mov    -0x10(%rbp),%rax
mov    %rax,%rcx
add    $0x8,%rcx
mov    %rcx,-0x10(%rbp)
mov    %rax,-0x68(%rbp)
mov    -0x10(%rbp),%rax
mov    %rax,%rcx
add    $0x8,%rcx
mov    %rcx,-0x10(%rbp)
mov    %rax,-0x70(%rbp)
mov    -0x10(%rbp),%rax
mov    %rax,%rcx
add    $0x8,%rcx
mov    %rcx,-0x10(%rbp)
mov    %rax,-0x78(%rbp)
mov    -0x10(%rbp),%rax
mov    %rax,%rcx
add    $0x8,%rcx
mov    %rcx,-0x10(%rbp)
mov    %rax,-0x80(%rbp)
mov    -0x10(%rbp),%rax
mov    %rax,%rcx
add    $0x8,%rcx
mov    %rcx,-0x10(%rbp)
mov    %rax,-0x88(%rbp)
mov    -0x10(%rbp),%rax
mov    %rax,%rcx
add    $0x8,%rcx
mov    %rcx,-0x10(%rbp)
mov    %rax,-0x90(%rbp)
mov    -0x10(%rbp),%rax
mov    %rax,%rcx
add    $0x8,%rcx
mov    %rcx,-0x10(%rbp)
mov    %rax,-0x98(%rbp)
mov    -0x10(%rbp),%rax
mov    %rax,%rcx
add    $0x8,%rcx
mov    %rcx,-0x10(%rbp)
mov    %rax,-0xa0(%rbp)
mov    -0x10(%rbp),%rax
mov    %rax,%rcx
add    $0x8,%rcx
mov    %rcx,-0x10(%rbp)
mov    %rax,-0xa8(%rbp)
movsd  0xd4c(%rip),%xmm0
movsd  %xmm0,-0xb0(%rbp)
ff
mov    -0x38(%rbp),%rax
movsd  (%rax),%xmm1
mov    -0x38(%rbp),%rax
movsd  (%rax),%xmm2
mov    -0x50(%rbp),%rax
movsd  (%rax),%xmm0
mov    -0x50(%rbp),%rax
mulsd  (%rax),%xmm0
mulsd  %xmm2,%xmm1
addsd  %xmm0,%xmm1
mov    -0x58(%rbp),%rax
movsd  (%rax),%xmm0
mov    -0x58(%rbp),%rax
movsd  (%rax),%xmm2
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0xb8(%rbp)
ff
movsd  -0xb8(%rbp),%xmm0
ff
xorps  %xmm1,%xmm1
ucomisd %xmm1,%xmm0
jne    1356 <eig_3x3+0x226>
jp     1356 <eig_3x3+0x226>
mov    -0x20(%rbp),%rax
movsd  (%rax),%xmm0
mov    -0x18(%rbp),%rax
movsd  %xmm0,(%rax)
mov    -0x40(%rbp),%rax
movsd  (%rax),%xmm0
mov    -0x18(%rbp),%rax
movsd  %xmm0,0x8(%rax)
mov    -0x60(%rbp),%rax
movsd  (%rax),%xmm0
mov    -0x18(%rbp),%rax
movsd  %xmm0,0x10(%rax)
jmp    1864 <eig_3x3+0x734>
mov    -0x20(%rbp),%rax
movsd  (%rax),%xmm0
mov    -0x40(%rbp),%rax
addsd  (%rax),%xmm0
mov    -0x60(%rbp),%rax
addsd  (%rax),%xmm0
movsd  0xcb2(%rip),%xmm1
divsd  %xmm1,%xmm0
movsd  %xmm0,-0xc0(%rbp)
ff
mov    -0x20(%rbp),%rax
movsd  (%rax),%xmm0
subsd  -0xc0(%rbp),%xmm0
ff
mov    -0x20(%rbp),%rax
movsd  (%rax),%xmm2
subsd  -0xc0(%rbp),%xmm2
ff
mov    -0x40(%rbp),%rax
movsd  (%rax),%xmm1
subsd  -0xc0(%rbp),%xmm1
ff
mov    -0x40(%rbp),%rax
movsd  (%rax),%xmm3
subsd  -0xc0(%rbp),%xmm3
ff
mulsd  %xmm3,%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
mov    -0x60(%rbp),%rax
movsd  (%rax),%xmm1
subsd  -0xc0(%rbp),%xmm1
ff
mov    -0x60(%rbp),%rax
movsd  (%rax),%xmm2
subsd  -0xc0(%rbp),%xmm2
ff
mulsd  %xmm2,%xmm1
addsd  %xmm0,%xmm1
movsd  -0xb8(%rbp),%xmm0
ff
addsd  %xmm0,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0xc8(%rbp)
ff
movsd  -0xc8(%rbp),%xmm0
ff
movsd  0xc02(%rip),%xmm1
divsd  %xmm1,%xmm0
call   1050 <sqrt@plt>
movsd  %xmm0,-0xd0(%rbp)
ff
movsd  0xbe1(%rip),%xmm0
divsd  -0xd0(%rbp),%xmm0
ff
mov    -0x20(%rbp),%rax
movsd  (%rax),%xmm1
subsd  -0xc0(%rbp),%xmm1
ff
mulsd  %xmm1,%xmm0
mov    -0x68(%rbp),%rax
movsd  %xmm0,(%rax)
movsd  0xbb5(%rip),%xmm0
divsd  -0xd0(%rbp),%xmm0
ff
mov    -0x40(%rbp),%rax
movsd  (%rax),%xmm1
subsd  -0xc0(%rbp),%xmm1
ff
mulsd  %xmm1,%xmm0
mov    -0x88(%rbp),%rax
movsd  %xmm0,(%rax)
movsd  0xb86(%rip),%xmm0
divsd  -0xd0(%rbp),%xmm0
ff
mov    -0x60(%rbp),%rax
movsd  (%rax),%xmm1
subsd  -0xc0(%rbp),%xmm1
ff
mulsd  %xmm1,%xmm0
mov    -0xa8(%rbp),%rax
movsd  %xmm0,(%rax)
movsd  0xb57(%rip),%xmm0
divsd  -0xd0(%rbp),%xmm0
ff
mov    -0x38(%rbp),%rax
mulsd  (%rax),%xmm0
mov    -0x80(%rbp),%rax
movsd  %xmm0,(%rax)
movsd  0xb37(%rip),%xmm0
divsd  -0xd0(%rbp),%xmm0
ff
mov    -0x50(%rbp),%rax
mulsd  (%rax),%xmm0
mov    -0x98(%rbp),%rax
movsd  %xmm0,(%rax)
movsd  0xb14(%rip),%xmm0
divsd  -0xd0(%rbp),%xmm0
ff
mov    -0x28(%rbp),%rax
mulsd  (%rax),%xmm0
mov    -0x70(%rbp),%rax
movsd  %xmm0,(%rax)
movsd  0xaf4(%rip),%xmm0
divsd  -0xd0(%rbp),%xmm0
ff
mov    -0x58(%rbp),%rax
mulsd  (%rax),%xmm0
mov    -0xa0(%rbp),%rax
movsd  %xmm0,(%rax)
movsd  0xad1(%rip),%xmm0
divsd  -0xd0(%rbp),%xmm0
ff
mov    -0x30(%rbp),%rax
mulsd  (%rax),%xmm0
mov    -0x78(%rbp),%rax
movsd  %xmm0,(%rax)
movsd  0xab1(%rip),%xmm0
divsd  -0xd0(%rbp),%xmm0
ff
mov    -0x48(%rbp),%rax
mulsd  (%rax),%xmm0
mov    -0x90(%rbp),%rax
movsd  %xmm0,(%rax)
mov    -0x68(%rbp),%rax
movsd  (%rax),%xmm0
mov    -0x88(%rbp),%rax
mulsd  (%rax),%xmm0
mov    -0xa8(%rbp),%rax
movsd  (%rax),%xmm2
mov    -0x80(%rbp),%rax
movsd  (%rax),%xmm1
mov    -0xa0(%rbp),%rax
mulsd  (%rax),%xmm1
mov    -0x78(%rbp),%rax
mulsd  (%rax),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
mov    -0x98(%rbp),%rax
movsd  (%rax),%xmm1
mov    -0x70(%rbp),%rax
mulsd  (%rax),%xmm1
mov    -0x90(%rbp),%rax
movsd  (%rax),%xmm2
mulsd  %xmm2,%xmm1
addsd  %xmm0,%xmm1
mov    -0x68(%rbp),%rax
movsd  (%rax),%xmm0
mov    -0xa0(%rbp),%rax
mulsd  (%rax),%xmm0
mov    -0x90(%rbp),%rax
movsd  (%rax),%xmm2
movq   %xmm0,%rax
movabs $0x8000000000000000,%rcx
xor    %rcx,%rax
movq   %rax,%xmm0
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
mov    -0x80(%rbp),%rax
movsd  (%rax),%xmm1
mov    -0x70(%rbp),%rax
mulsd  (%rax),%xmm1
mov    -0xa8(%rbp),%rax
movsd  (%rax),%xmm2
movq   %xmm1,%rax
movabs $0x8000000000000000,%rcx
xor    %rcx,%rax
movq   %rax,%xmm1
mulsd  %xmm2,%xmm1
addsd  %xmm0,%xmm1
mov    -0x98(%rbp),%rax
movsd  (%rax),%xmm0
mov    -0x88(%rbp),%rax
mulsd  (%rax),%xmm0
mov    -0x78(%rbp),%rax
movsd  (%rax),%xmm2
movq   %xmm0,%rax
movabs $0x8000000000000000,%rcx
xor    %rcx,%rax
movq   %rax,%xmm0
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0xd8(%rbp)
ff
movsd  -0xd8(%rbp),%xmm0
ff
movsd  0x95b(%rip),%xmm1
divsd  %xmm1,%xmm0
movsd  %xmm0,-0xe0(%rbp)
ff
movsd  0x93f(%rip),%xmm0
ucomisd -0xe0(%rbp),%xmm0
ff
jb     16f8 <eig_3x3+0x5c8>
movsd  -0xb0(%rbp),%xmm0
ff
movsd  0x941(%rip),%xmm1
divsd  %xmm1,%xmm0
movsd  %xmm0,-0xe8(%rbp)
ff
jmp    1748 <eig_3x3+0x618>
movsd  -0xe0(%rbp),%xmm0
ff
movsd  0x910(%rip),%xmm1
ucomisd %xmm1,%xmm0
jb     1722 <eig_3x3+0x5f2>
xorps  %xmm0,%xmm0
movsd  %xmm0,-0xe8(%rbp)
ff
jmp    1743 <eig_3x3+0x613>
movsd  -0xe0(%rbp),%xmm0
ff
call   1030 <acos@plt>
mov    $0x3,%ecx
cltd
idiv   %ecx
cvtsi2sd %eax,%xmm0
movsd  %xmm0,-0xe8(%rbp)
ff
jmp    1748 <eig_3x3+0x618>
movsd  -0xc0(%rbp),%xmm0
ff
movsd  %xmm0,-0x100(%rbp)
ff
movsd  0x8b0(%rip),%xmm0
mulsd  -0xd0(%rbp),%xmm0
ff
movsd  %xmm0,-0x108(%rbp)
ff
movsd  -0xe8(%rbp),%xmm0
ff
call   1040 <cos@plt>
movsd  -0x108(%rbp),%xmm0
ff
movsd  -0x100(%rbp),%xmm1
ff
cvtsi2sd %eax,%xmm2
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
mov    -0x18(%rbp),%rax
movsd  %xmm0,(%rax)
movsd  -0xc0(%rbp),%xmm0
ff
movsd  %xmm0,-0xf0(%rbp)
ff
movsd  0x857(%rip),%xmm0
mulsd  -0xd0(%rbp),%xmm0
ff
movsd  %xmm0,-0xf8(%rbp)
ff
movsd  -0xe8(%rbp),%xmm0
ff
movsd  0x837(%rip),%xmm1
mulsd  -0xb0(%rbp),%xmm1
ff
movsd  0x83f(%rip),%xmm2
divsd  %xmm2,%xmm1
addsd  %xmm1,%xmm0
call   1040 <cos@plt>
movsd  -0xf8(%rbp),%xmm0
ff
movsd  -0xf0(%rbp),%xmm1
ff
cvtsi2sd %eax,%xmm2
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
mov    -0x18(%rbp),%rax
movsd  %xmm0,0x10(%rax)
movsd  -0xc0(%rbp),%xmm0
ff
mov    -0x18(%rbp),%rax
movsd  (%rax),%xmm1
movq   %xmm1,%rax
movabs $0x8000000000000000,%rcx
xor    %rcx,%rax
movq   %rax,%xmm1
movsd  0x7de(%rip),%xmm2
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
mov    -0x18(%rbp),%rax
subsd  0x10(%rax),%xmm0
mov    -0x18(%rbp),%rax
movsd  %xmm0,0x8(%rax)
xor    %eax,%eax
add    $0x110,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<eig_3x3>:
push   %r15
push   %r14
push   %rbx
sub    $0x40,%rsp
mov    %rdx,%r14
mov    %rdi,%rbx
movsd  0x18(%rdi),%xmm9
movupd 0x30(%rdi),%xmm6
movapd %xmm6,%xmm0
mulsd  %xmm6,%xmm0
movapd %xmm9,%xmm1
mulsd  %xmm9,%xmm1
addsd  %xmm0,%xmm1
movapd %xmm6,%xmm0
unpckhpd %xmm6,%xmm0
mulsd  %xmm0,%xmm0
addsd  %xmm1,%xmm0
xorpd  %xmm1,%xmm1
ucomisd %xmm1,%xmm0
jne    119f <eig_3x3+0x6f>
jp     119f <eig_3x3+0x6f>
movsd  (%rbx),%xmm0
movsd  %xmm0,(%r14)
movsd  0x20(%rbx),%xmm0
movsd  %xmm0,0x8(%r14)
movsd  0x40(%rbx),%xmm1
mov    $0x2,%eax
jmp    1408 <eig_3x3+0x2d8>
mov    %rsi,%r15
movsd  (%rbx),%xmm11
movsd  0x20(%rbx),%xmm7
movapd %xmm11,%xmm4
addsd  %xmm7,%xmm4
movsd  0x40(%rbx),%xmm10
addsd  %xmm10,%xmm4
divsd  0xe38(%rip),%xmm4
subsd  %xmm4,%xmm11
subsd  %xmm4,%xmm7
movapd %xmm7,%xmm2
mulsd  %xmm7,%xmm2
movapd %xmm11,%xmm3
mulsd  %xmm11,%xmm3
addsd  %xmm2,%xmm3
subsd  %xmm4,%xmm10
movapd %xmm10,%xmm2
mulsd  %xmm10,%xmm2
addsd  %xmm3,%xmm2
addsd  %xmm0,%xmm0
addsd  %xmm2,%xmm0
divsd  0xdfe(%rip),%xmm0
ucomisd %xmm1,%xmm0
movsd  %xmm4,0x28(%rsp)
jb     121d <eig_3x3+0xed>
sqrtsd %xmm0,%xmm8
jmp    1267 <eig_3x3+0x137>
movapd %xmm6,0x10(%rsp)
movsd  %xmm9,0x8(%rsp)
movsd  %xmm7,(%rsp)
movsd  %xmm10,0x38(%rsp)
movsd  %xmm11,0x30(%rsp)
call   1050 <sqrt@plt>
movsd  0x30(%rsp),%xmm11
movsd  0x38(%rsp),%xmm10
movsd  (%rsp),%xmm7
movsd  0x8(%rsp),%xmm9
movapd 0x10(%rsp),%xmm6
movapd %xmm0,%xmm8
movsd  0xda1(%rip),%xmm0
divsd  %xmm8,%xmm0
mulsd  %xmm0,%xmm11
movsd  %xmm11,(%r15)
mulsd  %xmm0,%xmm7
movsd  %xmm7,0x20(%r15)
mulsd  %xmm0,%xmm10
movsd  %xmm10,0x40(%r15)
mulsd  %xmm0,%xmm9
movsd  %xmm9,0x18(%r15)
movapd %xmm0,%xmm2
unpcklpd %xmm0,%xmm2
mulpd  %xmm2,%xmm6
movupd %xmm6,0x30(%r15)
movupd 0x8(%rbx),%xmm1
mulpd  %xmm2,%xmm1
movupd %xmm1,0x8(%r15)
mulsd  0x28(%rbx),%xmm0
movapd %xmm11,%xmm2
mulsd  %xmm7,%xmm2
movapd %xmm6,%xmm3
unpckhpd %xmm6,%xmm3
movapd %xmm9,%xmm4
mulsd  %xmm3,%xmm4
movapd %xmm1,%xmm5
unpckhpd %xmm1,%xmm5
mulsd  %xmm5,%xmm4
mulsd  %xmm10,%xmm2
addsd  %xmm4,%xmm2
mulsd  %xmm6,%xmm7
mulsd  %xmm1,%xmm6
mulsd  %xmm0,%xmm6
addsd  %xmm2,%xmm6
mulsd  %xmm11,%xmm3
mulsd  %xmm0,%xmm3
subsd  %xmm3,%xmm6
mulsd  %xmm9,%xmm1
mulsd  %xmm10,%xmm1
subsd  %xmm1,%xmm6
mulsd  %xmm5,%xmm7
subsd  %xmm7,%xmm6
mulsd  0xcea(%rip),%xmm6
movsd  %xmm0,0x28(%r15)
movsd  0xcec(%rip),%xmm0
ucomisd %xmm6,%xmm0
jae    1386 <eig_3x3+0x256>
xorpd  %xmm0,%xmm0
ucomisd 0xcc2(%rip),%xmm6
jae    138e <eig_3x3+0x25e>
movapd %xmm6,%xmm0
movsd  %xmm8,0x10(%rsp)
call   1030 <acos@plt>
movsd  0x10(%rsp),%xmm8
cltq
imul   $0x55555556,%rax,%rax
mov    %rax,%rcx
shr    $0x3f,%rcx
shr    $0x20,%rax
add    %ecx,%eax
xorps  %xmm0,%xmm0
cvtsi2sd %eax,%xmm0
jmp    138e <eig_3x3+0x25e>
movsd  0xc92(%rip),%xmm0
addsd  %xmm8,%xmm8
movsd  %xmm8,0x10(%rsp)
movsd  %xmm0,(%rsp)
call   1040 <cos@plt>
xorps  %xmm0,%xmm0
cvtsi2sd %eax,%xmm0
mulsd  0x10(%rsp),%xmm0
addsd  0x28(%rsp),%xmm0
movsd  %xmm0,0x8(%rsp)
movsd  %xmm0,(%r14)
movsd  (%rsp),%xmm0
addsd  0xc61(%rip),%xmm0
call   1040 <cos@plt>
movsd  0x28(%rsp),%xmm1
xorps  %xmm0,%xmm0
cvtsi2sd %eax,%xmm0
mulsd  0x10(%rsp),%xmm0
addsd  %xmm1,%xmm0
mulsd  0xc0d(%rip),%xmm1
movsd  %xmm0,0x10(%r14)
subsd  0x8(%rsp),%xmm1
subsd  %xmm0,%xmm1
mov    $0x1,%eax
movsd  %xmm1,(%r14,%rax,8)
xor    %eax,%eax
add    $0x40,%rsp
pop    %rbx
pop    %r14
pop    %r15
ret

LLVM IR (-O0):
define i32 @eig_3x3(double* noalias %0, double* noalias %1, double* noalias %2) {
%4 = alloca double*
%5 = alloca double*
%6 = alloca double*
%7 = alloca double*
%8 = alloca double*
%9 = alloca double*
%10 = alloca double*
%11 = alloca double*
%12 = alloca double*
%13 = alloca double*
%14 = alloca double*
%15 = alloca double*
%16 = alloca double*
%17 = alloca double*
%18 = alloca double*
%19 = alloca double*
%20 = alloca double*
%21 = alloca double*
%22 = alloca double*
%23 = alloca double*
%24 = alloca double*
%25 = alloca double
%26 = alloca double
%27 = alloca double
%28 = alloca double
%29 = alloca double
%30 = alloca double
%31 = alloca double
%32 = alloca double
store double* %0, double** %4
store double* %1, double** %5
store double* %2, double** %6
%33 = load double*, double** %4
%34 = getelementptr inbounds double, double* %33, i32 1
store double* %34, double** %4
store double* %33, double** %7
%35 = load double*, double** %4
%36 = getelementptr inbounds double, double* %35, i32 1
store double* %36, double** %4
store double* %35, double** %8
%37 = load double*, double** %4
%38 = getelementptr inbounds double, double* %37, i32 1
store double* %38, double** %4
store double* %37, double** %9
%39 = load double*, double** %4
%40 = getelementptr inbounds double, double* %39, i32 1
store double* %40, double** %4
store double* %39, double** %10
%41 = load double*, double** %4
%42 = getelementptr inbounds double, double* %41, i32 1
store double* %42, double** %4
store double* %41, double** %11
%43 = load double*, double** %4
%44 = getelementptr inbounds double, double* %43, i32 1
store double* %44, double** %4
store double* %43, double** %12
%45 = load double*, double** %4
%46 = getelementptr inbounds double, double* %45, i32 1
store double* %46, double** %4
store double* %45, double** %13
%47 = load double*, double** %4
%48 = getelementptr inbounds double, double* %47, i32 1
store double* %48, double** %4
store double* %47, double** %14
%49 = load double*, double** %4
%50 = getelementptr inbounds double, double* %49, i32 1
store double* %50, double** %4
store double* %49, double** %15
%51 = load double*, double** %5
%52 = getelementptr inbounds double, double* %51, i32 1
store double* %52, double** %5
store double* %51, double** %16
%53 = load double*, double** %5
%54 = getelementptr inbounds double, double* %53, i32 1
store double* %54, double** %5
store double* %53, double** %17
%55 = load double*, double** %5
%56 = getelementptr inbounds double, double* %55, i32 1
store double* %56, double** %5
store double* %55, double** %18
%57 = load double*, double** %5
%58 = getelementptr inbounds double, double* %57, i32 1
store double* %58, double** %5
store double* %57, double** %19
%59 = load double*, double** %5
%60 = getelementptr inbounds double, double* %59, i32 1
store double* %60, double** %5
store double* %59, double** %20
%61 = load double*, double** %5
%62 = getelementptr inbounds double, double* %61, i32 1
store double* %62, double** %5
store double* %61, double** %21
%63 = load double*, double** %5
%64 = getelementptr inbounds double, double* %63, i32 1
store double* %64, double** %5
store double* %63, double** %22
%65 = load double*, double** %5
%66 = getelementptr inbounds double, double* %65, i32 1
store double* %66, double** %5
store double* %65, double** %23
%67 = load double*, double** %5
%68 = getelementptr inbounds double, double* %67, i32 1
store double* %68, double** %5
store double* %67, double** %24
store double 0x400921FB54442D18, double* %25
%69 = load double*, double** %10
%70 = load double, double* %69
%71 = load double*, double** %10
%72 = load double, double* %71
%73 = load double*, double** %13
%74 = load double, double* %73
%75 = load double*, double** %13
%76 = load double, double* %75
%77 = fmul double %74, %76
%78 = call double @llvm.fmuladd.f64(double %70, double %72, double %77)
%79 = load double*, double** %14
%80 = load double, double* %79
%81 = load double*, double** %14
%82 = load double, double* %81
%83 = call double @llvm.fmuladd.f64(double %80, double %82, double %78)
store double %83, double* %26
%84 = load double, double* %26
%85 = fcmp oeq double %84, 0.000000e+00
br i1 %85, label %86, label %99
86: ; preds = %3
%87 = load double*, double** %7
%88 = load double, double* %87
%89 = load double*, double** %6
%90 = getelementptr inbounds double, double* %89, i64 0
store double %88, double* %90
%91 = load double*, double** %11
%92 = load double, double* %91
%93 = load double*, double** %6
%94 = getelementptr inbounds double, double* %93, i64 1
store double %92, double* %94
%95 = load double*, double** %15
%96 = load double, double* %95
%97 = load double*, double** %6
%98 = getelementptr inbounds double, double* %97, i64 2
store double %96, double* %98
br label %304
99: ; preds = %3
%100 = load double*, double** %7
%101 = load double, double* %100
%102 = load double*, double** %11
%103 = load double, double* %102
%104 = fadd double %101, %103
%105 = load double*, double** %15
%106 = load double, double* %105
%107 = fadd double %104, %106
%108 = fdiv double %107, 3.000000e+00
store double %108, double* %27
%109 = load double*, double** %7
%110 = load double, double* %109
%111 = load double, double* %27
%112 = fsub double %110, %111
%113 = load double*, double** %7
%114 = load double, double* %113
%115 = load double, double* %27
%116 = fsub double %114, %115
%117 = load double*, double** %11
%118 = load double, double* %117
%119 = load double, double* %27
%120 = fsub double %118, %119
%121 = load double*, double** %11
%122 = load double, double* %121
%123 = load double, double* %27
%124 = fsub double %122, %123
%125 = fmul double %120, %124
%126 = call double @llvm.fmuladd.f64(double %112, double %116, double %125)
%127 = load double*, double** %15
%128 = load double, double* %127
%129 = load double, double* %27
%130 = fsub double %128, %129
%131 = load double*, double** %15
%132 = load double, double* %131
%133 = load double, double* %27
%134 = fsub double %132, %133
%135 = call double @llvm.fmuladd.f64(double %130, double %134, double %126)
%136 = load double, double* %26
%137 = call double @llvm.fmuladd.f64(double 2.000000e+00, double %136, double %135)
store double %137, double* %28
%138 = load double, double* %28
%139 = fdiv double %138, 6.000000e+00
%140 = call double @sqrt(double %139)
store double %140, double* %29
%141 = load double, double* %29
%142 = fdiv double 1.000000e+00, %141
%143 = load double*, double** %7
%144 = load double, double* %143
%145 = load double, double* %27
%146 = fsub double %144, %145
%147 = fmul double %142, %146
%148 = load double*, double** %16
store double %147, double* %148
%149 = load double, double* %29
%150 = fdiv double 1.000000e+00, %149
%151 = load double*, double** %11
%152 = load double, double* %151
%153 = load double, double* %27
%154 = fsub double %152, %153
%155 = fmul double %150, %154
%156 = load double*, double** %20
store double %155, double* %156
%157 = load double, double* %29
%158 = fdiv double 1.000000e+00, %157
%159 = load double*, double** %15
%160 = load double, double* %159
%161 = load double, double* %27
%162 = fsub double %160, %161
%163 = fmul double %158, %162
%164 = load double*, double** %24
store double %163, double* %164
%165 = load double, double* %29
%166 = fdiv double 1.000000e+00, %165
%167 = load double*, double** %10
%168 = load double, double* %167
%169 = fmul double %166, %168
%170 = load double*, double** %19
store double %169, double* %170
%171 = load double, double* %29
%172 = fdiv double 1.000000e+00, %171
%173 = load double*, double** %13
%174 = load double, double* %173
%175 = fmul double %172, %174
%176 = load double*, double** %22
store double %175, double* %176
%177 = load double, double* %29
%178 = fdiv double 1.000000e+00, %177
%179 = load double*, double** %8
%180 = load double, double* %179
%181 = fmul double %178, %180
%182 = load double*, double** %17
store double %181, double* %182
%183 = load double, double* %29
%184 = fdiv double 1.000000e+00, %183
%185 = load double*, double** %14
%186 = load double, double* %185
%187 = fmul double %184, %186
%188 = load double*, double** %23
store double %187, double* %188
%189 = load double, double* %29
%190 = fdiv double 1.000000e+00, %189
%191 = load double*, double** %9
%192 = load double, double* %191
%193 = fmul double %190, %192
%194 = load double*, double** %18
store double %193, double* %194
%195 = load double, double* %29
%196 = fdiv double 1.000000e+00, %195
%197 = load double*, double** %12
%198 = load double, double* %197
%199 = fmul double %196, %198
%200 = load double*, double** %21
store double %199, double* %200
%201 = load double*, double** %16
%202 = load double, double* %201
%203 = load double*, double** %20
%204 = load double, double* %203
%205 = fmul double %202, %204
%206 = load double*, double** %24
%207 = load double, double* %206
%208 = load double*, double** %19
%209 = load double, double* %208
%210 = load double*, double** %23
%211 = load double, double* %210
%212 = fmul double %209, %211
%213 = load double*, double** %18
%214 = load double, double* %213
%215 = fmul double %212, %214
%216 = call double @llvm.fmuladd.f64(double %205, double %207, double %215)
%217 = load double*, double** %22
%218 = load double, double* %217
%219 = load double*, double** %17
%220 = load double, double* %219
%221 = fmul double %218, %220
%222 = load double*, double** %21
%223 = load double, double* %222
%224 = call double @llvm.fmuladd.f64(double %221, double %223, double %216)
%225 = load double*, double** %16
%226 = load double, double* %225
%227 = load double*, double** %23
%228 = load double, double* %227
%229 = fmul double %226, %228
%230 = load double*, double** %21
%231 = load double, double* %230
%232 = fneg double %229
%233 = call double @llvm.fmuladd.f64(double %232, double %231, double %224)
%234 = load double*, double** %19
%235 = load double, double* %234
%236 = load double*, double** %17
%237 = load double, double* %236
%238 = fmul double %235, %237
%239 = load double*, double** %24
%240 = load double, double* %239
%241 = fneg double %238
%242 = call double @llvm.fmuladd.f64(double %241, double %240, double %233)
%243 = load double*, double** %22
%244 = load double, double* %243
%245 = load double*, double** %20
%246 = load double, double* %245
%247 = fmul double %244, %246
%248 = load double*, double** %18
%249 = load double, double* %248
%250 = fneg double %247
%251 = call double @llvm.fmuladd.f64(double %250, double %249, double %242)
store double %251, double* %30
%252 = load double, double* %30
%253 = fdiv double %252, 2.000000e+00
store double %253, double* %31
%254 = load double, double* %31
%255 = fcmp ole double %254, -1.000000e+00
br i1 %255, label %256, label %259
256: ; preds = %99
%257 = load double, double* %25
%258 = fdiv double %257, 3.000000e+00
store double %258, double* %32
br label %269
259: ; preds = %99
%260 = load double, double* %31
%261 = fcmp oge double %260, 1.000000e+00
br i1 %261, label %262, label %263
262: ; preds = %259
store double 0.000000e+00, double* %32
br label %268
263: ; preds = %259
%264 = load double, double* %31
%265 = call i32 @acos(double %264)
%266 = sdiv i32 %265, 3
%267 = sitofp i32 %266 to double
store double %267, double* %32
br label %268
268: ; preds = %263, %262
br label %269
269: ; preds = %268, %256
%270 = load double, double* %27
%271 = load double, double* %29
%272 = fmul double 2.000000e+00, %271
%273 = load double, double* %32
%274 = call i32 @cos(double %273)
%275 = sitofp i32 %274 to double
%276 = call double @llvm.fmuladd.f64(double %272, double %275, double %270)
%277 = load double*, double** %6
%278 = getelementptr inbounds double, double* %277, i64 0
store double %276, double* %278
%279 = load double, double* %27
%280 = load double, double* %29
%281 = fmul double 2.000000e+00, %280
%282 = load double, double* %32
%283 = load double, double* %25
%284 = fmul double 2.000000e+00, %283
%285 = fdiv double %284, 3.000000e+00
%286 = fadd double %282, %285
%287 = call i32 @cos(double %286)
%288 = sitofp i32 %287 to double
%289 = call double @llvm.fmuladd.f64(double %281, double %288, double %279)
%290 = load double*, double** %6
%291 = getelementptr inbounds double, double* %290, i64 2
store double %289, double* %291
%292 = load double, double* %27
%293 = load double*, double** %6
%294 = getelementptr inbounds double, double* %293, i64 0
%295 = load double, double* %294
%296 = fneg double %295
%297 = call double @llvm.fmuladd.f64(double 3.000000e+00, double %292, double %296)
%298 = load double*, double** %6
%299 = getelementptr inbounds double, double* %298, i64 2
%300 = load double, double* %299
%301 = fsub double %297, %300
%302 = load double*, double** %6
%303 = getelementptr inbounds double, double* %302, i64 1
store double %301, double* %303
br label %304
304: ; preds = %269, %86
ret i32 0
}

LLVM IR (-O2):
define i32 @eig_3x3(double* noalias nocapture %0, double* noalias nocapture %1, double* noalias nocapture %2) {
%4 = getelementptr inbounds double, double* %0, i64 3
%5 = getelementptr inbounds double, double* %0, i64 4
%6 = getelementptr inbounds double, double* %0, i64 6
%7 = getelementptr inbounds double, double* %0, i64 8
%8 = load double, double* %4
%9 = bitcast double* %6 to <2 x double>*
%10 = load <2 x double>, <2 x double>* %9
%11 = fmul <2 x double> %10, %10
%12 = extractelement <2 x double> %11, i64 0
%13 = tail call double @llvm.fmuladd.f64(double %8, double %8, double %12)
%14 = extractelement <2 x double> %10, i64 1
%15 = tail call double @llvm.fmuladd.f64(double %14, double %14, double %13)
%16 = fcmp oeq double %15, 0.000000e+00
br i1 %16, label %17, label %22
17: ; preds = %3
%18 = load double, double* %0
store double %18, double* %2
%19 = load double, double* %5
%20 = getelementptr inbounds double, double* %2, i64 1
store double %19, double* %20
%21 = load double, double* %7
br label %103
22: ; preds = %3
%23 = getelementptr inbounds double, double* %1, i64 8
%24 = getelementptr inbounds double, double* %1, i64 6
%25 = getelementptr inbounds double, double* %1, i64 4
%26 = getelementptr inbounds double, double* %1, i64 3
%27 = getelementptr inbounds double, double* %1, i64 1
%28 = getelementptr inbounds double, double* %1, i64 5
%29 = getelementptr inbounds double, double* %0, i64 5
%30 = getelementptr inbounds double, double* %0, i64 1
%31 = load double, double* %0
%32 = load double, double* %5
%33 = fadd double %31, %32
%34 = load double, double* %7
%35 = fadd double %33, %34
%36 = fdiv double %35, 3.000000e+00
%37 = fsub double %31, %36
%38 = fsub double %32, %36
%39 = fmul double %38, %38
%40 = tail call double @llvm.fmuladd.f64(double %37, double %37, double %39)
%41 = fsub double %34, %36
%42 = tail call double @llvm.fmuladd.f64(double %41, double %41, double %40)
%43 = tail call double @llvm.fmuladd.f64(double %15, double 2.000000e+00, double %42)
%44 = fdiv double %43, 6.000000e+00
%45 = tail call double @sqrt(double %44)
%46 = fdiv double 1.000000e+00, %45
%47 = fmul double %46, %37
store double %47, double* %1
%48 = fmul double %46, %38
store double %48, double* %25
%49 = fmul double %46, %41
store double %49, double* %23
%50 = fmul double %8, %46
store double %50, double* %26
%51 = insertelement <2 x double> poison, double %46, i64 0
%52 = shufflevector <2 x double> %51, <2 x double> poison, <2 x i32> zeroinitializer
%53 = fmul <2 x double> %10, %52
%54 = bitcast double* %24 to <2 x double>*
store <2 x double> %53, <2 x double>* %54
%55 = bitcast double* %30 to <2 x double>*
%56 = load <2 x double>, <2 x double>* %55
%57 = fmul <2 x double> %52, %56
%58 = bitcast double* %27 to <2 x double>*
store <2 x double> %57, <2 x double>* %58
%59 = load double, double* %29
%60 = fmul double %46, %59
store double %60, double* %28
%61 = fmul double %47, %48
%62 = extractelement <2 x double> %53, i64 1
%63 = fmul double %50, %62
%64 = extractelement <2 x double> %57, i64 1
%65 = fmul double %63, %64
%66 = tail call double @llvm.fmuladd.f64(double %61, double %49, double %65)
%67 = extractelement <2 x double> %57, i64 0
%68 = extractelement <2 x double> %53, i64 0
%69 = fmul <2 x double> %53, %57
%70 = extractelement <2 x double> %69, i64 0
%71 = tail call double @llvm.fmuladd.f64(double %70, double %60, double %66)
%72 = fneg double %47
%73 = fmul double %62, %72
%74 = tail call double @llvm.fmuladd.f64(double %73, double %60, double %71)
%75 = fneg double %50
%76 = fmul double %67, %75
%77 = tail call double @llvm.fmuladd.f64(double %76, double %49, double %74)
%78 = fneg double %68
%79 = fmul double %48, %78
%80 = tail call double @llvm.fmuladd.f64(double %79, double %64, double %77)
%81 = fmul double %80, 5.000000e-01
%82 = fcmp ugt double %81, -1.000000e+00
br i1 %82, label %83, label %89
83: ; preds = %22
%84 = fcmp ult double %81, 1.000000e+00
br i1 %84, label %85, label %89
85: ; preds = %83
%86 = tail call i32 @acos(double %81)
%87 = sdiv i32 %86, 3
%88 = sitofp i32 %87 to double
br label %89
89: ; preds = %83, %22, %85
%90 = phi double [ %88, %85 ], [ 0x3FF0C152382D7365, %22 ], [ 0.000000e+00, %83 ]
%91 = fmul double %45, 2.000000e+00
%92 = tail call i32 @cos(double %90)
%93 = sitofp i32 %92 to double
%94 = tail call double @llvm.fmuladd.f64(double %91, double %93, double %36)
store double %94, double* %2
%95 = fadd double %90, 0x4000C152382D7365
%96 = tail call i32 @cos(double %95)
%97 = sitofp i32 %96 to double
%98 = tail call double @llvm.fmuladd.f64(double %91, double %97, double %36)
%99 = getelementptr inbounds double, double* %2, i64 2
store double %98, double* %99
%100 = fneg double %94
%101 = tail call double @llvm.fmuladd.f64(double %36, double 3.000000e+00, double %100)
%102 = fsub double %101, %98
br label %103
103: ; preds = %89, %17
%104 = phi i64 [ 1, %89 ], [ 2, %17 ]
%105 = phi double [ %102, %89 ], [ %21, %17 ]
%106 = getelementptr inbounds double, double* %2, i64 %104
store double %105, double* %106
ret i32 0
}