// File: millanek[P]Dsuite/KolmogorovSmirnovDist.cpp
// Function: cdfSpecial(int, double)
static double cdfSpecial (int n, double x)
{
   /* The KS distribution is known exactly for these cases */

   /* For nx^2 > 18, KSfbar(n, x) is smaller than 5e-16 */
   if ((n * x * x >= 18.0) || (x >= 1.0))
      return 1.0;

   if (x <= 0.5 / n)
      return 0.0;

   if (n == 1)
      return 2.0 * x - 1.0;

   if (x <= 1.0 / n) {
      double t = 2.0 * x - 1.0 / n;
      double w;
      if (n <= NFACT) {
         w = Factorial[n];
         return w * pow (t, (double) n);
      }
      w = getLogFactorial (n) + n * log (t);
      return exp (w);
   }

   if (x >= 1.0 - 1.0 / n) {
      return 1.0 - 2.0 * pow (1.0 - x, (double) n);
   }

   return -1.0;
}

// Assembly:
pushq %rbp
movq %rsp, %rbp
subq $0x40, %rsp
movl %edi, -0xc(%rbp)
movsd %xmm0, -0x18(%rbp)
cvtsi2sdl -0xc(%rbp), %xmm0
mulsd -0x18(%rbp), %xmm0
mulsd -0x18(%rbp), %xmm0
movsd 0x8211(%rip), %xmm1     # 0x8d708
ucomisd %xmm1, %xmm0
jae 0x85510
movsd -0x18(%rbp), %xmm0
movsd 0x2f9e(%rip), %xmm1     # 0x884a8
ucomisd %xmm1, %xmm0
jb 0x85522
movsd 0x2f90(%rip), %xmm0     # 0x884a8
movsd %xmm0, -0x8(%rbp)
jmp 0x856c6
movsd -0x18(%rbp), %xmm1
cvtsi2sdl -0xc(%rbp), %xmm2
movsd 0x2f7c(%rip), %xmm0     # 0x884b0
divsd %xmm2, %xmm0
ucomisd %xmm1, %xmm0
jb 0x8554b
xorps %xmm0, %xmm0
movsd %xmm0, -0x8(%rbp)
jmp 0x856c6
cmpl $0x1, -0xc(%rbp)
jne 0x85570
movsd -0x18(%rbp), %xmm0
addsd %xmm0, %xmm0
movsd 0x2f66(%rip), %xmm1     # 0x884c8
addsd %xmm1, %xmm0
movsd %xmm0, -0x8(%rbp)
jmp 0x856c6
movsd -0x18(%rbp), %xmm1
cvtsi2sdl -0xc(%rbp), %xmm2
movsd 0x2f26(%rip), %xmm0     # 0x884a8
divsd %xmm2, %xmm0
ucomisd %xmm1, %xmm0
jb 0x85660
movsd -0x18(%rbp), %xmm0
cvtsi2sdl -0xc(%rbp), %xmm2
movsd 0x2f06(%rip), %xmm1     # 0x884a8
divsd %xmm2, %xmm1
movq %xmm1, %rax
movabsq $-0x8000000000000000, %rcx # imm = 0x8000000000000000
xorq %rcx, %rax
movq %rax, %xmm1
addsd %xmm0, %xmm0
addsd %xmm1, %xmm0
movsd %xmm0, -0x20(%rbp)
cmpl $0x14, -0xc(%rbp)
jg 0x85614
movslq -0xc(%rbp), %rcx
leaq 0x3a535(%rip), %rax     # 0xbfb10
movsd (%rax,%rcx,8), %xmm0
movsd %xmm0, -0x28(%rbp)
movsd -0x28(%rbp), %xmm0
movsd %xmm0, -0x30(%rbp)
movsd -0x20(%rbp), %xmm0
cvtsi2sdl -0xc(%rbp), %xmm1
callq 0x8a20
movaps %xmm0, %xmm1
movsd -0x30(%rbp), %xmm0
mulsd %xmm1, %xmm0
movsd %xmm0, -0x8(%rbp)
jmp 0x856c6
movl -0xc(%rbp), %edi
callq 0x87370
movsd %xmm0, -0x40(%rbp)
cvtsi2sdl -0xc(%rbp), %xmm0
movsd %xmm0, -0x38(%rbp)
movsd -0x20(%rbp), %xmm0
callq 0x8490
movsd -0x40(%rbp), %xmm1
movaps %xmm0, %xmm2
movsd -0x38(%rbp), %xmm0
mulsd %xmm2, %xmm0
addsd %xmm1, %xmm0
movsd %xmm0, -0x28(%rbp)
movsd -0x28(%rbp), %xmm0
callq 0x8a70
movsd %xmm0, -0x8(%rbp)
jmp 0x856c6
movsd -0x18(%rbp), %xmm0
cvtsi2sdl -0xc(%rbp), %xmm1
movsd 0x2e36(%rip), %xmm2     # 0x884a8
divsd %xmm1, %xmm2
movsd 0x2e2a(%rip), %xmm1     # 0x884a8
subsd %xmm2, %xmm1
ucomisd %xmm1, %xmm0
jb 0x856b9
movsd 0x2e18(%rip), %xmm0     # 0x884a8
subsd -0x18(%rbp), %xmm0
cvtsi2sdl -0xc(%rbp), %xmm1
callq 0x8a20
movaps %xmm0, %xmm1
addsd %xmm1, %xmm1
movsd 0x2dfa(%rip), %xmm0     # 0x884a8
subsd %xmm1, %xmm0
movsd %xmm0, -0x8(%rbp)
jmp 0x856c6
movsd 0x2e07(%rip), %xmm0     # 0x884c8
movsd %xmm0, -0x8(%rbp)
movsd -0x8(%rbp), %xmm0
addq $0x40, %rsp
popq %rbp
retq
nopw %cs:(%rax,%rax)