// File: /workspace/github_cpp_makefile_star2_O1/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 %r14
pushq %rbx
subq $0x18, %rsp
movapd %xmm0, %xmm1
xorpd %xmm0, %xmm0
ucomisd %xmm1, %xmm0
ja 0x3cac6
ucomisd 0x2745(%rip), %xmm1     # 0x3f030
ja 0x3cac6
movsd 0x273f(%rip), %xmm5     # 0x3f038
addsd %xmm1, %xmm5
movapd 0x285b(%rip), %xmm0     # 0x3f160
andpd %xmm5, %xmm0
movsd 0xb457(%rip), %xmm2     # 0x47d68
ucomisd %xmm0, %xmm2
jae 0x3c97f
movsd 0x2711(%rip), %xmm3     # 0x3f030
subsd %xmm1, %xmm3
xorpd %xmm0, %xmm0
movapd %xmm5, %xmm2
cmpltsd %xmm0, %xmm2
movapd %xmm2, %xmm4
andnpd %xmm3, %xmm4
andpd %xmm1, %xmm2
orpd %xmm4, %xmm2
ucomisd %xmm2, %xmm0
jae 0x3c9e5
movapd %xmm5, (%rsp)
movapd %xmm2, %xmm0
callq 0x63c0
movapd %xmm0, %xmm1
movapd 0x2ddc(%rip), %xmm0     # 0x3f740
xorpd %xmm1, %xmm0
movsd 0x2d70(%rip), %xmm2     # 0x3f6e0
ucomisd %xmm1, %xmm2
jb 0x3c9ed
xorps %xmm1, %xmm1
sqrtsd %xmm0, %xmm1
jmp 0x3c9f6
movapd %xmm5, %xmm1
mulsd %xmm5, %xmm1
movsd 0xb3e1(%rip), %xmm0     # 0x47d70
subsd %xmm1, %xmm0
xorpd %xmm1, %xmm1
movl $0x9, %eax
leaq 0xb4dd(%rip), %rcx      # 0x47e80
mulsd %xmm0, %xmm1
addsd -0x10(%rcx,%rax,8), %xmm1
decq %rax
cmpq $0x1, %rax
ja 0x3c9a3
xorpd %xmm2, %xmm2
movl $0x9, %eax
leaq 0xb4fa(%rip), %rcx      # 0x47ec0
mulsd %xmm0, %xmm2
addsd -0x10(%rcx,%rax,8), %xmm2
decq %rax
cmpq $0x1, %rax
ja 0x3c9c6
mulsd %xmm1, %xmm5
divsd %xmm2, %xmm5
movapd %xmm5, %xmm0
addq $0x18, %rsp
popq %rbx
popq %r14
retq
callq 0x63b0
movapd %xmm0, %xmm1
movsd 0xb37a(%rip), %xmm0     # 0x47d78
ucomisd %xmm1, %xmm0
movapd (%rsp), %xmm3
jae 0x3ca59
addsd 0xb377(%rip), %xmm1     # 0x47d88
xorpd %xmm0, %xmm0
movl $0x9, %eax
leaq 0xb55f(%rip), %rcx      # 0x47f80
mulsd %xmm1, %xmm0
addsd -0x10(%rcx,%rax,8), %xmm0
decq %rax
cmpq $0x1, %rax
ja 0x3ca21
xorpd %xmm2, %xmm2
movl $0x9, %eax
leaq 0xb57c(%rip), %rcx      # 0x47fc0
mulsd %xmm1, %xmm2
addsd -0x10(%rcx,%rax,8), %xmm2
decq %rax
cmpq $0x1, %rax
ja 0x3ca44
jmp 0x3caa7
addsd 0xb31f(%rip), %xmm1     # 0x47d80
xorpd %xmm0, %xmm0
movl $0x9, %eax
leaq 0xb48f(%rip), %rcx      # 0x47f00
mulsd %xmm1, %xmm0
addsd -0x10(%rcx,%rax,8), %xmm0
decq %rax
cmpq $0x1, %rax
ja 0x3ca71
xorpd %xmm2, %xmm2
movl $0x9, %eax
leaq 0xb4ac(%rip), %rcx      # 0x47f40
mulsd %xmm1, %xmm2
addsd -0x10(%rcx,%rax,8), %xmm2
decq %rax
cmpq $0x1, %rax
ja 0x3ca94
divsd %xmm2, %xmm0
xorpd %xmm1, %xmm1
ucomisd %xmm3, %xmm1
jbe 0x3c9e5
xorpd 0x2c7f(%rip), %xmm0     # 0x3f740
jmp 0x3c9e5
movl $0x10, %edi
callq 0x61d0
movq %rax, %rbx
leaq 0xb368(%rip), %rsi      # 0x47e42
movq %rax, %rdi
callq 0x6280
movq 0x16457(%rip), %rsi     # 0x52f40
movq 0x16470(%rip), %rdx     # 0x52f60
movq %rbx, %rdi
callq 0x66c0
movq %rax, %r14
movq %rbx, %rdi
callq 0x6340
movq %r14, %rdi
callq 0x6710