// File: /workspace/github_cpp_makefile_star2_O2/tomfunkhouser[P]gaps/pkgs/R3Shapes/R4Matrix.cpp
// Function: gaps::R4Matrix::Invert()
void R4Matrix::
Invert(void)
{
    // Copy matrix into local variables
    RNScalar Ma, Mb, Mc, Md, Me, Mf, Mg, Mh, Mi, Mj, Mk, Ml, Mm, Mn, Mo, Mp;
    Ma = m[0][0]; Mb = m[0][1]; Mc = m[0][2]; Md = m[0][3];
    Me = m[1][0]; Mf = m[1][1]; Mg = m[1][2]; Mh = m[1][3];
    Mi = m[2][0]; Mj = m[2][1]; Mk = m[2][2]; Ml = m[2][3];
    Mm = m[3][0]; Mn = m[3][1]; Mo = m[3][2]; Mp = m[3][3];

    // Compute sub-determinants and determinant
    RNScalar a1 = R4MatrixDet3(Mf, Mg, Mh, Mj, Mk, Ml, Mn, Mo, Mp);
    RNScalar a2 = R4MatrixDet3(Me, Mg, Mh, Mi, Mk, Ml, Mm, Mo, Mp);  
    RNScalar a3 = R4MatrixDet3(Me, Mf, Mh, Mi, Mj, Ml, Mm, Mn, Mp);
    RNScalar a4 = R4MatrixDet3(Me, Mf, Mg, Mi, Mj, Mk, Mm, Mn, Mo);
    RNScalar det = Ma*a1 - Mb*a2 + Mc*a3 - Md*a4;
    if (RNIsZero(det, 1E-8)) {
        RNWarning("Unable to invert matrix with zero determinant");
        return;
    }

    // Compute inverse matrix
    m[0][0] = (a1)/det;
    m[1][0] = -(a2)/det;
    m[2][0] = (a3)/det;
    m[3][0] = -(a4)/det;

    m[0][1] = -(R4MatrixDet3(Mb, Mc, Md, Mj, Mk, Ml, Mn, Mo, Mp))/det;
    m[1][1] = (R4MatrixDet3(Ma, Mc, Md, Mi, Mk, Ml, Mm, Mo, Mp))/det;
    m[2][1] = -(R4MatrixDet3(Ma, Mb, Md, Mi, Mj, Ml, Mm, Mn, Mp))/det;
    m[3][1] = (R4MatrixDet3(Ma, Mb, Mc, Mi, Mj, Mk, Mm, Mn, Mo))/det;

    m[0][2] = (R4MatrixDet3(Mb, Mc, Md, Mf, Mg, Mh, Mn, Mo, Mp))/det;
    m[1][2] = -(R4MatrixDet3(Ma, Mc, Md, Me, Mg, Mh, Mm, Mo, Mp))/det;
    m[2][2] = (R4MatrixDet3(Ma, Mb, Md, Me, Mf, Mh, Mm, Mn, Mp))/det;
    m[3][2] = -(R4MatrixDet3(Ma, Mb, Mc, Me, Mf, Mg, Mm, Mn, Mo))/det;

    m[0][3] = -(R4MatrixDet3(Mb, Mc, Md, Mf, Mg, Mh, Mj, Mk, Ml))/det;
    m[1][3] = (R4MatrixDet3(Ma, Mc, Md, Me, Mg, Mh, Mi, Mk, Ml))/det;
    m[2][3] = -(R4MatrixDet3(Ma, Mb, Md, Me, Mf, Mh, Mi, Mj, Ml))/det;
    m[3][3] = (R4MatrixDet3(Ma, Mb, Mc, Me, Mf, Mg, Mi, Mj, Mk))/det;
}

// Assembly:
subq $0x48, %rsp
movsd 0x28(%rdi), %xmm6
movsd %xmm6, -0x68(%rsp)
movsd 0x30(%rdi), %xmm5
movsd 0x38(%rdi), %xmm8
movsd %xmm8, -0x48(%rsp)
movsd 0x40(%rdi), %xmm14
movsd 0x48(%rdi), %xmm3
movsd 0x50(%rdi), %xmm9
movsd 0x58(%rdi), %xmm7
movsd 0x60(%rdi), %xmm1
movsd 0x68(%rdi), %xmm0
movsd 0x70(%rdi), %xmm15
movsd 0x78(%rdi), %xmm10
movapd %xmm7, %xmm2
mulsd %xmm15, %xmm2
movapd %xmm9, %xmm13
mulsd %xmm10, %xmm13
subsd %xmm2, %xmm13
movapd %xmm7, %xmm4
mulsd %xmm0, %xmm4
movapd %xmm3, %xmm12
mulsd %xmm10, %xmm12
subsd %xmm4, %xmm12
movapd %xmm5, %xmm4
movapd %xmm5, %xmm2
movsd %xmm5, -0x70(%rsp)
mulsd %xmm12, %xmm4
movapd %xmm6, %xmm5
mulsd %xmm13, %xmm5
subsd %xmm4, %xmm5
movapd %xmm9, %xmm6
mulsd %xmm0, %xmm6
movapd %xmm3, %xmm4
mulsd %xmm15, %xmm4
subsd %xmm6, %xmm4
mulsd %xmm4, %xmm8
addsd %xmm5, %xmm8
movsd %xmm7, -0x38(%rsp)
movapd %xmm7, %xmm5
mulsd %xmm1, %xmm5
movapd %xmm14, %xmm11
movsd %xmm10, -0x40(%rsp)
mulsd %xmm10, %xmm11
subsd %xmm5, %xmm11
mulsd %xmm11, %xmm2
movsd 0x20(%rdi), %xmm7
movapd %xmm7, %xmm6
mulsd %xmm13, %xmm6
subsd %xmm2, %xmm6
movsd %xmm9, -0x28(%rsp)
movapd %xmm9, %xmm5
mulsd %xmm1, %xmm5
movapd %xmm14, %xmm10
movapd %xmm15, 0x20(%rsp)
mulsd %xmm15, %xmm10
subsd %xmm5, %xmm10
movsd -0x48(%rsp), %xmm15
movapd %xmm15, %xmm2
mulsd %xmm10, %xmm2
addsd %xmm6, %xmm2
movsd -0x68(%rsp), %xmm9
movapd %xmm9, %xmm5
mulsd %xmm11, %xmm5
movapd %xmm7, %xmm6
movapd %xmm12, -0x10(%rsp)
mulsd %xmm12, %xmm6
subsd %xmm5, %xmm6
movsd %xmm3, -0x50(%rsp)
movapd %xmm1, 0x10(%rsp)
mulsd %xmm1, %xmm3
movsd %xmm14, -0x30(%rsp)
movapd %xmm14, %xmm12
movapd %xmm0, 0x30(%rsp)
mulsd %xmm0, %xmm12
subsd %xmm3, %xmm12
movapd %xmm15, %xmm5
mulsd %xmm12, %xmm5
addsd %xmm6, %xmm5
movapd %xmm9, %xmm6
mulsd %xmm10, %xmm6
movapd %xmm7, (%rsp)
movapd %xmm7, %xmm9
mulsd %xmm4, %xmm9
subsd %xmm6, %xmm9
movsd -0x70(%rsp), %xmm6
mulsd %xmm12, %xmm6
addsd %xmm9, %xmm6
movsd 0x8(%rdi), %xmm0
movapd %xmm2, %xmm9
movapd %xmm0, %xmm3
mulsd %xmm0, %xmm9
movsd (%rdi), %xmm14
movsd %xmm14, -0x60(%rsp)
mulsd %xmm8, %xmm14
subsd %xmm9, %xmm14
movsd 0x10(%rdi), %xmm9
movsd %xmm9, -0x78(%rsp)
mulsd %xmm5, %xmm9
addsd %xmm14, %xmm9
movsd 0x18(%rdi), %xmm14
movapd %xmm14, %xmm7
mulsd %xmm6, %xmm14
subsd %xmm14, %xmm9
movapd 0x692a9(%rip), %xmm14   # 0x93270
andpd %xmm9, %xmm14
movsd 0x69d94(%rip), %xmm0    # 0x93d68
ucomisd %xmm14, %xmm0
jae 0x2a3f3
movapd -0x10(%rsp), %xmm15
movapd %xmm15, %xmm0
xorpd 0x6903d(%rip), %xmm0    # 0x93030
movsd -0x78(%rsp), %xmm1
mulsd %xmm1, %xmm0
movapd %xmm3, %xmm14
mulsd %xmm13, %xmm14
addsd %xmm0, %xmm14
movapd %xmm7, %xmm0
mulsd %xmm4, %xmm0
addsd %xmm14, %xmm0
movapd 0x6900e(%rip), %xmm14   # 0x93030
xorpd %xmm14, %xmm0
unpcklpd %xmm0, %xmm8            # xmm8 = xmm8[0],xmm0[0]
unpcklpd %xmm9, %xmm9            # xmm9 = xmm9[0,0]
movapd %xmm9, -0x20(%rsp)
divpd %xmm9, %xmm8
movupd %xmm8, (%rdi)
xorpd %xmm14, %xmm11
mulsd %xmm11, %xmm1
movsd -0x60(%rsp), %xmm8
mulsd %xmm8, %xmm13
movapd %xmm8, %xmm14
addsd %xmm1, %xmm13
movapd %xmm10, %xmm8
mulsd %xmm7, %xmm10
addsd %xmm13, %xmm10
movapd 0x68fb7(%rip), %xmm1    # 0x93030
xorpd %xmm1, %xmm2
unpcklpd %xmm10, %xmm2           # xmm2 = xmm2[0],xmm10[0]
divpd %xmm9, %xmm2
movupd %xmm2, 0x20(%rdi)
mulsd %xmm3, %xmm11
mulsd %xmm14, %xmm15
addsd %xmm11, %xmm15
movapd %xmm7, %xmm0
mulsd %xmm12, %xmm0
addsd %xmm15, %xmm0
xorpd %xmm1, %xmm0
unpcklpd %xmm0, %xmm5            # xmm5 = xmm5[0],xmm0[0]
divpd %xmm9, %xmm5
movupd %xmm5, 0x40(%rdi)
xorpd %xmm1, %xmm8
mulsd %xmm3, %xmm8
mulsd %xmm14, %xmm4
addsd %xmm8, %xmm4
movsd -0x78(%rsp), %xmm8
mulsd %xmm8, %xmm12
addsd %xmm4, %xmm12
movapd %xmm1, %xmm2
xorpd %xmm1, %xmm6
unpcklpd %xmm12, %xmm6           # xmm6 = xmm6[0],xmm12[0]
divpd %xmm9, %xmm6
movupd %xmm6, 0x60(%rdi)
movapd 0x20(%rsp), %xmm11
movapd %xmm11, %xmm0
xorpd %xmm1, %xmm0
movsd -0x48(%rsp), %xmm14
mulsd %xmm14, %xmm0
movsd -0x70(%rsp), %xmm4
movapd %xmm4, %xmm1
movapd %xmm4, %xmm6
movsd -0x40(%rsp), %xmm15
mulsd %xmm15, %xmm1
addsd %xmm0, %xmm1
movapd 0x30(%rsp), %xmm10
movapd %xmm10, %xmm0
xorpd %xmm2, %xmm0
movapd %xmm2, %xmm13
movapd %xmm14, %xmm2
mulsd %xmm0, %xmm2
movsd -0x68(%rsp), %xmm4
movapd %xmm4, %xmm5
mulsd %xmm15, %xmm5
addsd %xmm2, %xmm5
movapd %xmm8, %xmm2
movapd %xmm8, %xmm12
mulsd %xmm5, %xmm2
movapd %xmm3, %xmm8
mulsd %xmm1, %xmm8
subsd %xmm2, %xmm8
movapd %xmm6, %xmm2
mulsd %xmm6, %xmm0
movapd %xmm4, %xmm6
mulsd %xmm11, %xmm6
addsd %xmm0, %xmm6
movapd %xmm7, %xmm4
mulsd %xmm6, %xmm4
addsd %xmm8, %xmm4
movapd 0x10(%rsp), %xmm8
xorpd %xmm13, %xmm8
movapd %xmm14, %xmm0
mulsd %xmm8, %xmm0
movapd (%rsp), %xmm13
mulsd %xmm13, %xmm15
addsd %xmm0, %xmm15
movapd %xmm12, %xmm0
mulsd %xmm15, %xmm0
movsd -0x60(%rsp), %xmm12
mulsd %xmm12, %xmm1
subsd %xmm0, %xmm1
movapd %xmm2, %xmm0
mulsd %xmm8, %xmm0
mulsd %xmm13, %xmm11
addsd %xmm0, %xmm11
movapd %xmm7, %xmm2
movapd %xmm7, %xmm9
mulsd %xmm11, %xmm2
addsd %xmm1, %xmm2
movsd %xmm3, -0x58(%rsp)
mulsd %xmm3, %xmm15
movapd %xmm12, %xmm0
mulsd %xmm12, %xmm5
subsd %xmm15, %xmm5
movsd -0x68(%rsp), %xmm7
mulsd %xmm7, %xmm8
mulsd %xmm13, %xmm10
addsd %xmm8, %xmm10
movapd %xmm9, %xmm1
movapd %xmm9, %xmm12
mulsd %xmm10, %xmm12
addsd %xmm5, %xmm12
mulsd %xmm3, %xmm11
mulsd %xmm0, %xmm6
subsd %xmm11, %xmm6
movsd -0x78(%rsp), %xmm8
mulsd %xmm8, %xmm10
addsd %xmm6, %xmm10
movapd %xmm14, %xmm0
movsd -0x28(%rsp), %xmm11
mulsd %xmm11, %xmm0
movsd -0x70(%rsp), %xmm3
movapd %xmm3, %xmm6
movsd -0x38(%rsp), %xmm15
mulsd %xmm15, %xmm6
subsd %xmm0, %xmm6
movapd %xmm14, %xmm0
movsd -0x50(%rsp), %xmm9
mulsd %xmm9, %xmm0
movapd %xmm7, %xmm5
mulsd %xmm15, %xmm5
subsd %xmm0, %xmm5
movapd %xmm8, %xmm0
mulsd %xmm5, %xmm0
movsd -0x58(%rsp), %xmm8
mulsd %xmm6, %xmm8
subsd %xmm0, %xmm8
movapd %xmm3, %xmm0
mulsd %xmm9, %xmm0
movapd %xmm7, %xmm3
mulsd %xmm11, %xmm3
subsd %xmm0, %xmm3
movapd %xmm1, %xmm0
mulsd %xmm3, %xmm0
addsd %xmm8, %xmm0
movapd 0x68d39(%rip), %xmm9    # 0x93030
xorpd %xmm9, %xmm0
unpcklpd %xmm0, %xmm4            # xmm4 = xmm4[0],xmm0[0]
movapd -0x20(%rsp), %xmm8
divpd %xmm8, %xmm4
movupd %xmm4, 0x10(%rdi)
movsd -0x30(%rsp), %xmm4
mulsd %xmm4, %xmm14
mulsd %xmm13, %xmm15
subsd %xmm14, %xmm15
movsd -0x78(%rsp), %xmm14
movapd %xmm14, %xmm0
mulsd %xmm15, %xmm0
movsd -0x60(%rsp), %xmm7
mulsd %xmm7, %xmm6
subsd %xmm0, %xmm6
movsd -0x70(%rsp), %xmm0
mulsd %xmm4, %xmm0
mulsd %xmm13, %xmm11
subsd %xmm0, %xmm11
movapd %xmm1, %xmm0
mulsd %xmm11, %xmm0
addsd %xmm6, %xmm0
xorpd %xmm9, %xmm2
unpcklpd %xmm0, %xmm2            # xmm2 = xmm2[0],xmm0[0]
divpd %xmm8, %xmm2
movupd %xmm2, 0x30(%rdi)
movsd -0x58(%rsp), %xmm2
mulsd %xmm2, %xmm15
mulsd %xmm7, %xmm5
subsd %xmm15, %xmm5
movsd -0x68(%rsp), %xmm0
mulsd %xmm4, %xmm0
mulsd -0x50(%rsp), %xmm13
subsd %xmm0, %xmm13
mulsd %xmm13, %xmm1
addsd %xmm5, %xmm1
xorpd %xmm9, %xmm10
xorpd %xmm9, %xmm1
unpcklpd %xmm1, %xmm12           # xmm12 = xmm12[0],xmm1[0]
divpd %xmm8, %xmm12
movupd %xmm12, 0x50(%rdi)
mulsd %xmm2, %xmm11
mulsd %xmm7, %xmm3
subsd %xmm11, %xmm3
mulsd %xmm14, %xmm13
addsd %xmm3, %xmm13
unpcklpd %xmm13, %xmm10          # xmm10 = xmm10[0],xmm13[0]
divpd %xmm8, %xmm10
movupd %xmm10, 0x70(%rdi)
addq $0x48, %rsp
retq
leaq 0x69a76(%rip), %rdi     # 0x93e70
xorl %eax, %eax
addq $0x48, %rsp
jmp 0x68283
nop