// File: /workspace/github_cpp_makefile_star2_O2/j-faria[P]kima/DNest4/code/Utils.cpp
// Function: DNest4::normal_inverse_cdf(double)
double normal_inverse_cdf(double p)
{
    static double a[8] = { 
        3.3871328727963666080,     1.3314166789178437745e+2,
        1.9715909503065514427e+3,  1.3731693765509461125e+4,
        4.5921953931549871457e+4,  6.7265770927008700853e+4,
        3.3430575583588128105e+4,  2.5090809287301226727e+3 };
    static double b[8] = {
        1.0,                       4.2313330701600911252e+1,
        6.8718700749205790830e+2,  5.3941960214247511077e+3,
        2.1213794301586595867e+4,  3.9307895800092710610e+4,
        2.8729085735721942674e+4,  5.2264952788528545610e+3 };
    static double c[8] = {
        1.42343711074968357734,     4.63033784615654529590,
        5.76949722146069140550,     3.64784832476320460504,
        1.27045825245236838258,     2.41780725177450611770e-1,
        2.27238449892691845833e-2,  7.74545014278341407640e-4 };
    static double const1 = 0.180625;
    static double const2 = 1.6;
    static double d[8] = {
        1.0,                        2.05319162663775882187,
        1.67638483018380384940,     6.89767334985100004550e-1,
        1.48103976427480074590e-1,  1.51986665636164571966e-2,
        5.47593808499534494600e-4,  1.05075007164441684324e-9 };
    static double e[8] = {
        6.65790464350110377720,     5.46378491116411436990,
        1.78482653991729133580,     2.96560571828504891230e-1,
        2.65321895265761230930e-2,  1.24266094738807843860e-3,
        2.71155556874348757815e-5,  2.01033439929228813265e-7 };
    static double f[8] = {
        1.0,                        5.99832206555887937690e-1,
        1.36929880922735805310e-1,  1.48753612908506148525e-2,
        7.86869131145613259100e-4,  1.84631831751005468180e-5,
        1.42151175831644588870e-7,  2.04426310338993978564e-15 };
    double q;
    double r;
    static double split1 = 0.425;
    static double split2 = 5.0;
    double value;

    if(p < 0.0 || p > 1.0)
        throw std::domain_error("Input to normal_inverse_cdf must be in (0, 1).");

    q = p - 0.5;

    if(fabs(q) <= split1)
    {
        r = const1 - q * q;
        value = q * r8poly_value(8, a, r) / r8poly_value(8, b, r);
    }
    else
    {
        if(q < 0.0)
            r = p;
        else
            r = 1.0 - p;

        if(r <= 0.0)
            return 0.; // IFAULT=1

        r = sqrt(-log(r));

        if(r <= split2)
        {
            r = r - const2;
            value = r8poly_value(8, c, r) / r8poly_value(8, d, r); 
        }
        else
        {
            r = r - split2;
            value = r8poly_value(8, e, r) / r8poly_value(8, f, r);
        }

        if(q < 0.0)
            value = -value;
    }

    return value;
}

// Assembly:
pushq %rbp
pushq %r14
pushq %rbx
subq $0x30, %rsp
xorpd %xmm1, %xmm1
ucomisd %xmm0, %xmm1
ja 0x3953b
ucomisd 0x2c82(%rip), %xmm0     # 0x3c030
ja 0x3953b
movsd 0x2c7c(%rip), %xmm4     # 0x3c038
addsd %xmm0, %xmm4
movapd 0x2d98(%rip), %xmm1     # 0x3c160
andpd %xmm4, %xmm1
movsd 0x12d24(%rip), %xmm2    # 0x4c0f8
ucomisd %xmm1, %xmm2
jae 0x39440
movsd 0x2c4e(%rip), %xmm2     # 0x3c030
subsd %xmm0, %xmm2
xorpd %xmm5, %xmm5
movapd %xmm4, %xmm1
cmpltsd %xmm5, %xmm1
movapd %xmm1, %xmm3
andnpd %xmm2, %xmm3
andpd %xmm0, %xmm1
orpd %xmm3, %xmm1
ucomisd %xmm1, %xmm5
jae 0x3949b
movapd %xmm4, 0x20(%rsp)
movapd %xmm1, %xmm0
callq 0x63b0
movapd %xmm0, %xmm1
movapd 0x32e8(%rip), %xmm0     # 0x3c710
xorpd %xmm1, %xmm0
movsd 0x329c(%rip), %xmm2     # 0x3c6d0
ucomisd %xmm1, %xmm2
jb 0x394a8
sqrtsd %xmm0, %xmm0
jmp 0x394ad
movapd %xmm4, %xmm1
mulsd %xmm4, %xmm1
movsd 0x12cb0(%rip), %xmm0    # 0x4c100
subsd %xmm1, %xmm0
movsd %xmm0, 0x8(%rsp)
leaq 0x2af8f(%rip), %rsi     # 0x643f0
pushq $0x8
popq %rbx
movl %ebx, %edi
movapd %xmm4, 0x20(%rsp)
callq 0x3957e
mulsd 0x20(%rsp), %xmm0
movapd %xmm0, 0x10(%rsp)
leaq 0x2afac(%rip), %rsi     # 0x64430
movl %ebx, %edi
movsd 0x8(%rsp), %xmm0
callq 0x3957e
movapd 0x10(%rsp), %xmm5
divsd %xmm0, %xmm5
movapd %xmm5, %xmm0
addq $0x30, %rsp
popq %rbx
popq %r14
popq %rbp
retq
callq 0x63a0
movsd 0x12c53(%rip), %xmm1    # 0x4c108
xorl %eax, %eax
ucomisd %xmm0, %xmm1
leaq 0x2b02e(%rip), %rcx     # 0x644f0
leaq 0x2afa7(%rip), %rsi     # 0x64470
cmovbq %rcx, %rsi
leaq 0x2b05c(%rip), %rcx     # 0x64530
leaq 0x2afd5(%rip), %rbx     # 0x644b0
cmovbq %rcx, %rbx
setb %al
leaq 0x12c27(%rip), %rcx     # 0x4c110
addsd (%rcx,%rax,8), %xmm0
movsd %xmm0, 0x8(%rsp)
pushq $0x8
popq %rbp
movl %ebp, %edi
callq 0x3957e
movapd %xmm0, 0x10(%rsp)
movl %ebp, %edi
movq %rbx, %rsi
movsd 0x8(%rsp), %xmm0
callq 0x3957e
movapd 0x10(%rsp), %xmm5
xorpd %xmm1, %xmm1
ucomisd 0x20(%rsp), %xmm1
divsd %xmm0, %xmm5
jbe 0x3949b
xorpd 0x31da(%rip), %xmm5     # 0x3c710
jmp 0x3949b
pushq $0x10
popq %rdi
callq 0x61d0
movq %rax, %rbx
leaq 0x12c85(%rip), %rsi     # 0x4c1d2
movq %rax, %rdi
callq 0x6280
movq 0x2a9dc(%rip), %rsi     # 0x63f38
movq 0x2a9fd(%rip), %rdx     # 0x63f60
movq %rbx, %rdi
callq 0x6690
movq %rax, %r14
movq %rbx, %rdi
callq 0x6340
movq %r14, %rdi
callq 0x66e0