#define NULL ((void *)0)
typedef unsigned long size_t; // Customize by platform.
typedef long intptr_t;
typedef unsigned long uintptr_t;
typedef long scalar_t__; // Either arithmetic or pointer type.
/* By default, we understand bool (as a convenience). */
typedef int bool;
#define false 0
#define true 1

/* Forward declarations */

/* Type definitions */

/* Variables and functions */
double fabs(double);
double pf(double, int, int);
int fbptst(int n, double ps, double pp, double al, int *sw, double *f0,
           double *f) {
  int nu1, nu2;
  double w;
  if (n < 1 || ps <= 0.0 || ps >= 1.0 || pp <= 0.0 || pp >= 1.0 || al <= 0.0 ||
      al >= 1.0 || ps == pp)
    return 999;
  w = ps * n;
  if (ps < pp) {
    nu1 = 2.0 * (w + 1.0);
    nu2 = 2.0 * ((double)n - w);
    *f0 = nu2 * pp / nu1 / (1.0 - pp);
  } else {
    nu1 = 2.0 * ((double)n - w + 1.0);
    nu2 = 2.0 * w;
    *f0 = nu2 * (1.0 - pp) / nu1 / pp;
  }
  *f = pf(al, nu1, nu2);
  if (fabs(*f0) >= *f)
    *sw = 1;
  else
    *sw = 0;
  return 0;
}


x86 assembly (clang, -O0):
<fbptst>:
push   %rbp
mov    %rsp,%rbp
sub    $0x50,%rsp
mov    %edi,-0x8(%rbp)
movsd  %xmm0,-0x10(%rbp)
movsd  %xmm1,-0x18(%rbp)
movsd  %xmm2,-0x20(%rbp)
mov    %rsi,-0x28(%rbp)
mov    %rdx,-0x30(%rbp)
mov    %rcx,-0x38(%rbp)
cmpl   $0x1,-0x8(%rbp)
jl     11c5 <fbptst+0xb5>
xorps  %xmm0,%xmm0
ucomisd -0x10(%rbp),%xmm0
jae    11c5 <fbptst+0xb5>
movsd  -0x10(%rbp),%xmm0
movsd  0xea5(%rip),%xmm1
ucomisd %xmm1,%xmm0
jae    11c5 <fbptst+0xb5>
xorps  %xmm0,%xmm0
ucomisd -0x18(%rbp),%xmm0
jae    11c5 <fbptst+0xb5>
movsd  -0x18(%rbp),%xmm0
movsd  0xe80(%rip),%xmm1
ucomisd %xmm1,%xmm0
jae    11c5 <fbptst+0xb5>
xorps  %xmm0,%xmm0
ucomisd -0x20(%rbp),%xmm0
jae    11c5 <fbptst+0xb5>
movsd  -0x20(%rbp),%xmm0
movsd  0xe5b(%rip),%xmm1
ucomisd %xmm1,%xmm0
jae    11c5 <fbptst+0xb5>
movsd  -0x10(%rbp),%xmm0
ucomisd -0x18(%rbp),%xmm0
jne    11d1 <fbptst+0xc1>
jp     11d1 <fbptst+0xc1>
movl   $0x3e7,-0x4(%rbp)
jmp    1328 <fbptst+0x218>
movsd  -0x10(%rbp),%xmm0
cvtsi2sdl -0x8(%rbp),%xmm1
mulsd  %xmm1,%xmm0
movsd  %xmm0,-0x48(%rbp)
movsd  -0x10(%rbp),%xmm1
movsd  -0x18(%rbp),%xmm0
ucomisd %xmm1,%xmm0
jbe    1266 <fbptst+0x156>
movsd  0xe00(%rip),%xmm1
addsd  -0x48(%rbp),%xmm1
movsd  0xdfb(%rip),%xmm0
mulsd  %xmm1,%xmm0
cvttsd2si %xmm0,%eax
mov    %eax,-0x3c(%rbp)
cvtsi2sdl -0x8(%rbp),%xmm1
subsd  -0x48(%rbp),%xmm1
movsd  0xdde(%rip),%xmm0
mulsd  %xmm1,%xmm0
cvttsd2si %xmm0,%eax
mov    %eax,-0x40(%rbp)
cvtsi2sdl -0x40(%rbp),%xmm0
mulsd  -0x18(%rbp),%xmm0
cvtsi2sdl -0x3c(%rbp),%xmm1
divsd  %xmm1,%xmm0
movsd  0xdb0(%rip),%xmm1
subsd  -0x18(%rbp),%xmm1
divsd  %xmm1,%xmm0
mov    -0x30(%rbp),%rax
movsd  %xmm0,(%rax)
jmp    12cf <fbptst+0x1bf>
cvtsi2sdl -0x8(%rbp),%xmm1
subsd  -0x48(%rbp),%xmm1
movsd  0xd88(%rip),%xmm0
addsd  %xmm0,%xmm1
movsd  0xd84(%rip),%xmm0
mulsd  %xmm1,%xmm0
cvttsd2si %xmm0,%eax
mov    %eax,-0x3c(%rbp)
movsd  0xd71(%rip),%xmm0
mulsd  -0x48(%rbp),%xmm0
cvttsd2si %xmm0,%eax
mov    %eax,-0x40(%rbp)
cvtsi2sdl -0x40(%rbp),%xmm0
movsd  0xd50(%rip),%xmm1
subsd  -0x18(%rbp),%xmm1
mulsd  %xmm1,%xmm0
cvtsi2sdl -0x3c(%rbp),%xmm1
divsd  %xmm1,%xmm0
divsd  -0x18(%rbp),%xmm0
mov    -0x30(%rbp),%rax
movsd  %xmm0,(%rax)
movsd  -0x20(%rbp),%xmm0
mov    -0x3c(%rbp),%edi
mov    -0x40(%rbp),%esi
call   1030 <pf@plt>
mov    -0x38(%rbp),%rax
movsd  %xmm0,(%rax)
mov    -0x30(%rbp),%rax
movsd  (%rax),%xmm0
movaps 0xd1a(%rip),%xmm1
pand   %xmm1,%xmm0
mov    -0x38(%rbp),%rax
ucomisd (%rax),%xmm0
jb     1317 <fbptst+0x207>
mov    -0x28(%rbp),%rax
movl   $0x1,(%rax)
jmp    1321 <fbptst+0x211>
mov    -0x28(%rbp),%rax
movl   $0x0,(%rax)
movl   $0x0,-0x4(%rbp)
mov    -0x4(%rbp),%eax
add    $0x50,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<fbptst>:
push   %r15
push   %r14
push   %rbx
ucomisd %xmm1,%xmm0
mov    $0x3e7,%eax
jne    1126 <fbptst+0x16>
jnp    124e <fbptst+0x13e>
ucomisd 0xed2(%rip),%xmm2
jae    124e <fbptst+0x13e>
xorpd  %xmm3,%xmm3
ucomisd %xmm2,%xmm3
jae    124e <fbptst+0x13e>
ucomisd 0xeb6(%rip),%xmm1
jae    124e <fbptst+0x13e>
xorpd  %xmm3,%xmm3
ucomisd %xmm1,%xmm3
jae    124e <fbptst+0x13e>
ucomisd 0xe9a(%rip),%xmm0
jae    124e <fbptst+0x13e>
test   %edi,%edi
jle    124e <fbptst+0x13e>
xorpd  %xmm3,%xmm3
ucomisd %xmm0,%xmm3
jae    124e <fbptst+0x13e>
mov    %rcx,%r15
mov    %rdx,%rbx
mov    %rsi,%r14
xorps  %xmm3,%xmm3
cvtsi2sd %edi,%xmm3
movapd %xmm3,%xmm4
mulsd  %xmm0,%xmm4
ucomisd %xmm0,%xmm1
jbe    11e2 <fbptst+0xd2>
movsd  0xe58(%rip),%xmm5
subsd  %xmm4,%xmm3
addsd  %xmm5,%xmm4
addsd  %xmm4,%xmm4
cvttsd2si %xmm4,%edi
addsd  %xmm3,%xmm3
cvttsd2si %xmm3,%esi
cvttpd2dq %xmm3,%xmm0
cvtdq2pd %xmm0,%xmm0
cvttpd2dq %xmm4,%xmm3
cvtdq2pd %xmm3,%xmm3
mulsd  %xmm1,%xmm0
divsd  %xmm3,%xmm0
subsd  %xmm1,%xmm5
divsd  %xmm5,%xmm0
jmp    1222 <fbptst+0x112>
subsd  %xmm4,%xmm3
movsd  0xe12(%rip),%xmm0
addsd  %xmm0,%xmm3
addsd  %xmm3,%xmm3
cvttsd2si %xmm3,%edi
addsd  %xmm4,%xmm4
cvttsd2si %xmm4,%esi
cvttpd2dq %xmm4,%xmm4
cvtdq2pd %xmm4,%xmm4
subsd  %xmm1,%xmm0
mulsd  %xmm4,%xmm0
cvttpd2dq %xmm3,%xmm3
cvtdq2pd %xmm3,%xmm3
divsd  %xmm3,%xmm0
divsd  %xmm1,%xmm0
movsd  %xmm0,(%rbx)
movapd %xmm2,%xmm0
call   1030 <pf@plt>
movsd  %xmm0,(%r15)
movsd  (%rbx),%xmm1
andpd  0xdd0(%rip),%xmm1
xor    %eax,%eax
ucomisd %xmm0,%xmm1
setae  %al
mov    %eax,(%r14)
xor    %eax,%eax
pop    %rbx
pop    %r14
pop    %r15
ret

LLVM IR (-O0):
define i32 @fbptst(i32 %0, double %1, double %2, double %3, i32* %4, double* %5, double* %6) {
%8 = alloca i32
%9 = alloca i32
%10 = alloca double
%11 = alloca double
%12 = alloca double
%13 = alloca i32*
%14 = alloca double*
%15 = alloca double*
%16 = alloca i32
%17 = alloca i32
%18 = alloca double
store i32 %0, i32* %9
store double %1, double* %10
store double %2, double* %11
store double %3, double* %12
store i32* %4, i32** %13
store double* %5, double** %14
store double* %6, double** %15
%19 = load i32, i32* %9
%20 = icmp slt i32 %19, 1
br i1 %20, label %43, label %21
21: ; preds = %7
%22 = load double, double* %10
%23 = fcmp ole double %22, 0.000000e+00
br i1 %23, label %43, label %24
24: ; preds = %21
%25 = load double, double* %10
%26 = fcmp oge double %25, 1.000000e+00
br i1 %26, label %43, label %27
27: ; preds = %24
%28 = load double, double* %11
%29 = fcmp ole double %28, 0.000000e+00
br i1 %29, label %43, label %30
30: ; preds = %27
%31 = load double, double* %11
%32 = fcmp oge double %31, 1.000000e+00
br i1 %32, label %43, label %33
33: ; preds = %30
%34 = load double, double* %12
%35 = fcmp ole double %34, 0.000000e+00
br i1 %35, label %43, label %36
36: ; preds = %33
%37 = load double, double* %12
%38 = fcmp oge double %37, 1.000000e+00
br i1 %38, label %43, label %39
39: ; preds = %36
%40 = load double, double* %10
%41 = load double, double* %11
%42 = fcmp oeq double %40, %41
br i1 %42, label %43, label %44
43: ; preds = %39, %36, %33, %30, %27, %24, %21, %7
store i32 999, i32* %8
br label %113
44: ; preds = %39
%45 = load double, double* %10
%46 = load i32, i32* %9
%47 = sitofp i32 %46 to double
%48 = fmul double %45, %47
store double %48, double* %18
%49 = load double, double* %10
%50 = load double, double* %11
%51 = fcmp olt double %49, %50
br i1 %51, label %52, label %74
52: ; preds = %44
%53 = load double, double* %18
%54 = fadd double %53, 1.000000e+00
%55 = fmul double 2.000000e+00, %54
%56 = fptosi double %55 to i32
store i32 %56, i32* %16
%57 = load i32, i32* %9
%58 = sitofp i32 %57 to double
%59 = load double, double* %18
%60 = fsub double %58, %59
%61 = fmul double 2.000000e+00, %60
%62 = fptosi double %61 to i32
store i32 %62, i32* %17
%63 = load i32, i32* %17
%64 = sitofp i32 %63 to double
%65 = load double, double* %11
%66 = fmul double %64, %65
%67 = load i32, i32* %16
%68 = sitofp i32 %67 to double
%69 = fdiv double %66, %68
%70 = load double, double* %11
%71 = fsub double 1.000000e+00, %70
%72 = fdiv double %69, %71
%73 = load double*, double** %14
store double %72, double* %73
br label %96
74: ; preds = %44
%75 = load i32, i32* %9
%76 = sitofp i32 %75 to double
%77 = load double, double* %18
%78 = fsub double %76, %77
%79 = fadd double %78, 1.000000e+00
%80 = fmul double 2.000000e+00, %79
%81 = fptosi double %80 to i32
store i32 %81, i32* %16
%82 = load double, double* %18
%83 = fmul double 2.000000e+00, %82
%84 = fptosi double %83 to i32
store i32 %84, i32* %17
%85 = load i32, i32* %17
%86 = sitofp i32 %85 to double
%87 = load double, double* %11
%88 = fsub double 1.000000e+00, %87
%89 = fmul double %86, %88
%90 = load i32, i32* %16
%91 = sitofp i32 %90 to double
%92 = fdiv double %89, %91
%93 = load double, double* %11
%94 = fdiv double %92, %93
%95 = load double*, double** %14
store double %94, double* %95
br label %96
96: ; preds = %74, %52
%97 = load double, double* %12
%98 = load i32, i32* %16
%99 = load i32, i32* %17
%100 = call double @pf(double %97, i32 %98, i32 %99)
%101 = load double*, double** %15
store double %100, double* %101
%102 = load double*, double** %14
%103 = load double, double* %102
%104 = call double @llvm.fabs.f64(double %103)
%105 = load double*, double** %15
%106 = load double, double* %105
%107 = fcmp oge double %104, %106
br i1 %107, label %108, label %110
108: ; preds = %96
%109 = load i32*, i32** %13
store i32 1, i32* %109
br label %112
110: ; preds = %96
%111 = load i32*, i32** %13
store i32 0, i32* %111
br label %112
112: ; preds = %110, %108
store i32 0, i32* %8
br label %113
113: ; preds = %112, %43
%114 = load i32, i32* %8
ret i32 %114
}

LLVM IR (-O2):
define i32 @fbptst(i32 %0, double %1, double %2, double %3, i32* nocapture writeonly %4, double* nocapture %5, double* nocapture writeonly %6) {
%8 = icmp slt i32 %0, 1
%9 = fcmp ole double %1, 0.000000e+00
%10 = or i1 %8, %9
%11 = fcmp oge double %1, 1.000000e+00
%12 = or i1 %11, %10
%13 = fcmp ole double %2, 0.000000e+00
%14 = or i1 %13, %12
%15 = fcmp oge double %2, 1.000000e+00
%16 = or i1 %15, %14
%17 = fcmp ole double %3, 0.000000e+00
%18 = or i1 %17, %16
%19 = fcmp oge double %3, 1.000000e+00
%20 = or i1 %19, %18
%21 = fcmp oeq double %1, %2
%22 = or i1 %21, %20
br i1 %22, label %62, label %23
23: ; preds = %7
%24 = sitofp i32 %0 to double
%25 = fmul double %24, %1
%26 = fcmp olt double %1, %2
br i1 %26, label %27, label %40
27: ; preds = %23
%28 = fadd double %25, 1.000000e+00
%29 = fmul double %28, 2.000000e+00
%30 = fptosi double %29 to i32
%31 = fsub double %24, %25
%32 = fmul double %31, 2.000000e+00
%33 = fptosi double %32 to i32
%34 = sitofp i32 %33 to double
%35 = fmul double %34, %2
%36 = sitofp i32 %30 to double
%37 = fdiv double %35, %36
%38 = fsub double 1.000000e+00, %2
%39 = fdiv double %37, %38
br label %53
40: ; preds = %23
%41 = fsub double %24, %25
%42 = fadd double %41, 1.000000e+00
%43 = fmul double %42, 2.000000e+00
%44 = fptosi double %43 to i32
%45 = fmul double %25, 2.000000e+00
%46 = fptosi double %45 to i32
%47 = sitofp i32 %46 to double
%48 = fsub double 1.000000e+00, %2
%49 = fmul double %48, %47
%50 = sitofp i32 %44 to double
%51 = fdiv double %49, %50
%52 = fdiv double %51, %2
br label %53
53: ; preds = %40, %27
%54 = phi double [ %52, %40 ], [ %39, %27 ]
%55 = phi i32 [ %44, %40 ], [ %30, %27 ]
%56 = phi i32 [ %46, %40 ], [ %33, %27 ]
store double %54, double* %5
%57 = tail call double @pf(double %3, i32 %55, i32 %56)
store double %57, double* %6
%58 = load double, double* %5
%59 = tail call double @llvm.fabs.f64(double %58)
%60 = fcmp oge double %59, %57
%61 = zext i1 %60 to i32
store i32 %61, i32* %4
br label %62
62: ; preds = %7, %53
%63 = phi i32 [ 0, %53 ], [ 999, %7 ]
ret i32 %63
}