// File: /workspace/github_c_makefile_star2_O0/ryancdotorg[P]bloomslice/pcalc.c
// Function: main
int main() {
    int i;
    unsigned char *h;

    uint8_t log2m;
    uint32_t k, inc;
    uint64_t m, n;
    double fp, st;

    uint8_t max_k_by_log2m[49];
    for (i = 0; i <= 48; ++i) {
        if (i < 9) {
            max_k_by_log2m[i] =  10;
        } else if (i < 17) {
            max_k_by_log2m[i] = 190;
        } else if (i < 33) {
            max_k_by_log2m[i] =  45;
        } else {
            max_k_by_log2m[i] = 120;
        }
    }

    n = 0;
    log2m = 8; m = 1<<log2m;
    k = 1;
    inc = 1;

    st = fp = 0;

    for (;;) {
        if (k <= 10 && log2m <= 16) {
            h = "hash1s";
        } else if (k <= 190 && log2m >  8 && log2m <= 16) {
            h = "hash2b";
        } else if (k <=  45 && log2m > 16 && log2m <= 32) {
            h = "hash2s";
        } else if (k <= 120 && log2m > 32 && log2m <= 48) {
            h = "hash3s";
        } else {
            h = "NOHASH";
        }


        if (n > inc<<26) inc <<= 1;

        while (fp <= MAX_FP_RATE && st <= MAX_SATURATION) {
            n += inc;
            st = saturation(k, m, n);
            fp = pow(st, (double)k);
        }

        while (fp > MAX_FP_RATE || st > MAX_SATURATION) {
            if (k >= max_k_by_log2m[log2m]) {
                m <<= 1; ++log2m;
                k = 0;
            }
            ++k;
            st = saturation(k, m, n);
            fp = pow(st, (double)k);
        }

        if ((n > 9999*1000000ULL) || (log2m > 40)) {
            break;
        } else {
            printf("%10zu   %2u   %s   %3u   %4.1f%%   1 in %.2e\n", n, log2m, h, k, st*100, 1/fp);
        }
    }

    return 0;
}

// Assembly:
pushq %rbp
movq %rsp, %rbp
subq $0x90, %rsp
movl $0x0, -0x4(%rbp)
movl $0x0, -0x8(%rbp)
cmpl $0x30, -0x8(%rbp)
jg 0x13dc
cmpl $0x9, -0x8(%rbp)
jge 0x13a0
movslq -0x8(%rbp), %rax
movb $0xa, -0x80(%rbp,%rax)
jmp 0x13cf
cmpl $0x11, -0x8(%rbp)
jge 0x13b1
movslq -0x8(%rbp), %rax
movb $-0x42, -0x80(%rbp,%rax)
jmp 0x13cd
cmpl $0x21, -0x8(%rbp)
jge 0x13c2
movslq -0x8(%rbp), %rax
movb $0x2d, -0x80(%rbp,%rax)
jmp 0x13cb
movslq -0x8(%rbp), %rax
movb $0x78, -0x80(%rbp,%rax)
jmp 0x13cd
jmp 0x13cf
jmp 0x13d1
movl -0x8(%rbp), %eax
addl $0x1, %eax
movl %eax, -0x8(%rbp)
jmp 0x1389
movq $0x0, -0x30(%rbp)
movb $0x8, -0x11(%rbp)
movzbl -0x11(%rbp), %ecx
movl $0x1, %eax
shll %cl, %eax
cltq
movq %rax, -0x28(%rbp)
movl $0x1, -0x18(%rbp)
movl $0x1, -0x1c(%rbp)
xorps %xmm0, %xmm0
movsd %xmm0, -0x38(%rbp)
xorps %xmm0, %xmm0
movsd %xmm0, -0x40(%rbp)
cmpl $0xa, -0x18(%rbp)
ja 0x1436
movzbl -0x11(%rbp), %eax
cmpl $0x10, %eax
jg 0x1436
leaq 0xc73(%rip), %rax       # 0x20a0
movq %rax, -0x10(%rbp)
jmp 0x14b9
cmpl $0xbe, -0x18(%rbp)
ja 0x145e
movzbl -0x11(%rbp), %eax
cmpl $0x8, %eax
jle 0x145e
movzbl -0x11(%rbp), %eax
cmpl $0x10, %eax
jg 0x145e
leaq 0xc4f(%rip), %rax       # 0x20a7
movq %rax, -0x10(%rbp)
jmp 0x14b7
cmpl $0x2d, -0x18(%rbp)
ja 0x1483
movzbl -0x11(%rbp), %eax
cmpl $0x10, %eax
jle 0x1483
movzbl -0x11(%rbp), %eax
cmpl $0x20, %eax
jg 0x1483
leaq 0xc31(%rip), %rax       # 0x20ae
movq %rax, -0x10(%rbp)
jmp 0x14b5
cmpl $0x78, -0x18(%rbp)
ja 0x14a8
movzbl -0x11(%rbp), %eax
cmpl $0x20, %eax
jle 0x14a8
movzbl -0x11(%rbp), %eax
cmpl $0x30, %eax
jg 0x14a8
leaq 0xc13(%rip), %rax       # 0x20b5
movq %rax, -0x10(%rbp)
jmp 0x14b3
leaq 0xc0d(%rip), %rax       # 0x20bc
movq %rax, -0x10(%rbp)
jmp 0x14b5
jmp 0x14b7
jmp 0x14b9
movq -0x30(%rbp), %rax
movl -0x1c(%rbp), %ecx
shll $0x1a, %ecx
movl %ecx, %ecx
cmpq %rcx, %rax
jbe 0x14d2
movl -0x1c(%rbp), %eax
shll %eax
movl %eax, -0x1c(%rbp)
jmp 0x14d4
xorl %eax, %eax
movsd 0xb6a(%rip), %xmm0      # 0x2048
ucomisd -0x38(%rbp), %xmm0
movb %al, -0x81(%rbp)
jb 0x1501
movsd 0xb5d(%rip), %xmm0      # 0x2050
ucomisd -0x40(%rbp), %xmm0
setae %al
movb %al, -0x81(%rbp)
movb -0x81(%rbp), %al
testb $0x1, %al
jne 0x150d
jmp 0x154b
movl -0x1c(%rbp), %eax
movl %eax, %ecx
movq -0x30(%rbp), %rax
addq %rcx, %rax
movq %rax, -0x30(%rbp)
movl -0x18(%rbp), %edi
movq -0x28(%rbp), %rsi
movq -0x30(%rbp), %rdx
callq 0x12a0
movsd %xmm0, -0x40(%rbp)
movsd -0x40(%rbp), %xmm0
movl -0x18(%rbp), %eax
cvtsi2sd %rax, %xmm1
callq 0x1030
movsd %xmm0, -0x38(%rbp)
jmp 0x14d4
jmp 0x154d
movsd -0x38(%rbp), %xmm0
movb $0x1, %al
movsd 0xaec(%rip), %xmm1      # 0x2048
ucomisd %xmm1, %xmm0
movb %al, -0x82(%rbp)
ja 0x1582
movsd -0x40(%rbp), %xmm0
movsd 0xadb(%rip), %xmm1      # 0x2050
ucomisd %xmm1, %xmm0
seta %al
movb %al, -0x82(%rbp)
movb -0x82(%rbp), %al
testb $0x1, %al
jne 0x158e
jmp 0x15f1
movl -0x18(%rbp), %eax
movzbl -0x11(%rbp), %ecx
movzbl -0x80(%rbp,%rcx), %ecx
cmpl %ecx, %eax
jb 0x15b8
movq -0x28(%rbp), %rax
shlq %rax
movq %rax, -0x28(%rbp)
movb -0x11(%rbp), %al
addb $0x1, %al
movb %al, -0x11(%rbp)
movl $0x0, -0x18(%rbp)
movl -0x18(%rbp), %eax
incl %eax
movl %eax, -0x18(%rbp)
movl -0x18(%rbp), %edi
movq -0x28(%rbp), %rsi
movq -0x30(%rbp), %rdx
callq 0x12a0
movsd %xmm0, -0x40(%rbp)
movsd -0x40(%rbp), %xmm0
movl -0x18(%rbp), %eax
cvtsi2sd %rax, %xmm1
callq 0x1030
movsd %xmm0, -0x38(%rbp)
jmp 0x154d
movabsq $0x253fca1c0, %rax      # imm = 0x253FCA1C0
cmpq %rax, -0x30(%rbp)
ja 0x160a
movzbl -0x11(%rbp), %eax
cmpl $0x28, %eax
jle 0x160c
jmp 0x1649
movq -0x30(%rbp), %rsi
movzbl -0x11(%rbp), %edx
movq -0x10(%rbp), %rcx
movl -0x18(%rbp), %r8d
movsd 0xa34(%rip), %xmm0      # 0x2058
mulsd -0x40(%rbp), %xmm0
movsd 0xa0f(%rip), %xmm1      # 0x2040
divsd -0x38(%rbp), %xmm1
leaq 0xa86(%rip), %rdi       # 0x20c3
movb $0x2, %al
callq 0x1040
jmp 0x1417
xorl %eax, %eax
addq $0x90, %rsp
popq %rbp
retq