// File: /workspace/github_cpp_makefile_star2_O3/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 0x3a512
ucomisd 0x2cf9(%rip), %xmm1     # 0x3d030
ja 0x3a512
movsd 0x2cf3(%rip), %xmm5     # 0x3d038
addsd %xmm1, %xmm5
movapd 0x2e0f(%rip), %xmm0     # 0x3d160
andpd %xmm5, %xmm0
movsd 0xaf0b(%rip), %xmm2     # 0x45268
ucomisd %xmm0, %xmm2
jae 0x3a3cb
movsd 0x2cc5(%rip), %xmm3     # 0x3d030
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 0x3a431
movapd %xmm5, (%rsp)
movapd %xmm2, %xmm0
callq 0x63c0
movapd %xmm0, %xmm1
movapd 0x33b0(%rip), %xmm0     # 0x3d760
xorpd %xmm1, %xmm0
movsd 0x334c(%rip), %xmm2     # 0x3d708
ucomisd %xmm1, %xmm2
jb 0x3a439
xorps %xmm1, %xmm1
sqrtsd %xmm0, %xmm1
jmp 0x3a442
movapd %xmm5, %xmm1
mulsd %xmm5, %xmm1
movsd 0xae95(%rip), %xmm0     # 0x45270
subsd %xmm1, %xmm0
xorpd %xmm1, %xmm1
movl $0x9, %eax
leaq 0xaf91(%rip), %rcx      # 0x45380
mulsd %xmm0, %xmm1
addsd -0x10(%rcx,%rax,8), %xmm1
decq %rax
cmpq $0x1, %rax
ja 0x3a3ef
xorpd %xmm2, %xmm2
movl $0x9, %eax
leaq 0xafae(%rip), %rcx      # 0x453c0
mulsd %xmm0, %xmm2
addsd -0x10(%rcx,%rax,8), %xmm2
decq %rax
cmpq $0x1, %rax
ja 0x3a412
mulsd %xmm1, %xmm5
divsd %xmm2, %xmm5
movapd %xmm5, %xmm0
addq $0x18, %rsp
popq %rbx
popq %r14
retq
callq 0x63b0
movapd %xmm0, %xmm1
movsd 0xae2e(%rip), %xmm0     # 0x45278
ucomisd %xmm1, %xmm0
movapd (%rsp), %xmm3
jae 0x3a4a5
addsd 0xae2b(%rip), %xmm1     # 0x45288
xorpd %xmm0, %xmm0
movl $0x9, %eax
leaq 0xb013(%rip), %rcx      # 0x45480
mulsd %xmm1, %xmm0
addsd -0x10(%rcx,%rax,8), %xmm0
decq %rax
cmpq $0x1, %rax
ja 0x3a46d
xorpd %xmm2, %xmm2
movl $0x9, %eax
leaq 0xb030(%rip), %rcx      # 0x454c0
mulsd %xmm1, %xmm2
addsd -0x10(%rcx,%rax,8), %xmm2
decq %rax
cmpq $0x1, %rax
ja 0x3a490
jmp 0x3a4f3
addsd 0xadd3(%rip), %xmm1     # 0x45280
xorpd %xmm0, %xmm0
movl $0x9, %eax
leaq 0xaf43(%rip), %rcx      # 0x45400
mulsd %xmm1, %xmm0
addsd -0x10(%rcx,%rax,8), %xmm0
decq %rax
cmpq $0x1, %rax
ja 0x3a4bd
xorpd %xmm2, %xmm2
movl $0x9, %eax
leaq 0xaf60(%rip), %rcx      # 0x45440
mulsd %xmm1, %xmm2
addsd -0x10(%rcx,%rax,8), %xmm2
decq %rax
cmpq $0x1, %rax
ja 0x3a4e0
divsd %xmm2, %xmm0
xorpd %xmm1, %xmm1
ucomisd %xmm3, %xmm1
jbe 0x3a431
xorpd 0x3253(%rip), %xmm0     # 0x3d760
jmp 0x3a431
movl $0x10, %edi
callq 0x61d0
movq %rax, %rbx
leaq 0xae1c(%rip), %rsi      # 0x45342
movq %rax, %rdi
callq 0x6280
movq 0x15a0b(%rip), %rsi     # 0x4ff40
movq 0x15a24(%rip), %rdx     # 0x4ff60
movq %rbx, %rdi
callq 0x66c0
movq %rax, %r14
movq %rbx, %rdi
callq 0x6340
movq %r14, %rdi
callq 0x6710