// File: /workspace/github_c_makefile_star2_O0/ryancdotorg[P]bloomslice/bloomutl.c
// Function: bloom_pick_hash_wi
uint8_t bloom_pick_hash_wi(uint8_t width, uint64_t items, uint8_t *k) {
  double bits = 1ULL<<width;
  unsigned int opt = round((log(2.0) * bits) / (double)items);
  uint8_t kOpt = opt < 256 ? (opt > 0 ? opt : 1) : 255;

  if (width < 8 || width > 48) { // invalid parameters
    return 255;
  } else if (kOpt <= hash1sN && width >= 8 && width <= 16) { // hash1s
    *k = kOpt;
    return bloom_pick_hash_wk(width, kOpt);
  } else if (width == 8) {
    *k = hash1sN;
    return bloom_pick_hash_wk(width, hash1sN);
  } else if (kOpt <= hash2bN && width >  8 && width <= 16) { // hash2b
    *k = kOpt;
    return bloom_pick_hash_wk(width, kOpt);
  } else if (width <= 16) {
    *k = hash2bN;
    return bloom_pick_hash_wk(width, hash2bN);
  } else if (kOpt <= hash2sN && width > 16 && width <= 32) { // hash2s
    *k = kOpt;
    return bloom_pick_hash_wk(width, kOpt);
  } else if (width <= 32) {
    *k = hash2sN;
    return bloom_pick_hash_wk(width, hash2sN);
  } else if (kOpt <= hash3sN && width > 32 && width <= 48) { // hash3s
    *k = kOpt;
    return bloom_pick_hash_wk(width, kOpt);
  } else if (width <= 48) {
    *k = hash3sN;
    return bloom_pick_hash_wk(width, hash3sN);
  } else { // no suitable hash found
    return 255;
  }
}

// Assembly:
pushq %rbp
movq %rsp, %rbp
subq $0x60, %rsp
movb %dil, %al
movb %al, -0x2(%rbp)
movq %rsi, -0x10(%rbp)
movq %rdx, -0x18(%rbp)
movb -0x2(%rbp), %cl
movl $0x1, %eax
shlq %cl, %rax
movq %rax, %xmm0
movaps 0x1af3(%rip), %xmm1     # 0xb030
movaps %xmm1, -0x50(%rbp)
punpckldq %xmm1, %xmm0    # xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]
movapd 0x1af3(%rip), %xmm1     # 0xb040
movaps %xmm1, -0x40(%rbp)
subpd %xmm1, %xmm0
movaps %xmm0, %xmm1
unpckhpd %xmm0, %xmm0            # xmm0 = xmm0[1,1]
addsd %xmm1, %xmm0
movsd %xmm0, -0x20(%rbp)
movsd 0x2ba3(%rip), %xmm0     # 0xc110
callq 0x1100
movaps -0x50(%rbp), %xmm3
movaps -0x40(%rbp), %xmm2
movsd -0x20(%rbp), %xmm1
mulsd %xmm1, %xmm0
movq -0x10(%rbp), %xmm1
punpckldq %xmm3, %xmm1    # xmm1 = xmm1[0],xmm3[0],xmm1[1],xmm3[1]
subpd %xmm2, %xmm1
movaps %xmm1, %xmm2
unpckhpd %xmm1, %xmm1            # xmm1 = xmm1[1,1]
addsd %xmm2, %xmm1
divsd %xmm1, %xmm0
callq 0x1040
cvttsd2si %xmm0, %rax
movl %eax, -0x24(%rbp)
cmpl $0x100, -0x24(%rbp)     # imm = 0x100
jae 0x95d5
cmpl $0x0, -0x24(%rbp)
jbe 0x95c3
movl -0x24(%rbp), %eax
movl %eax, -0x54(%rbp)
jmp 0x95cd
movl $0x1, %eax
movl %eax, -0x54(%rbp)
jmp 0x95cd
movl -0x54(%rbp), %eax
movl %eax, -0x58(%rbp)
jmp 0x95df
movl $0xff, %eax
movl %eax, -0x58(%rbp)
jmp 0x95df
movl -0x58(%rbp), %eax
movb %al, -0x25(%rbp)
movzbl -0x2(%rbp), %eax
cmpl $0x8, %eax
jl 0x95f7
movzbl -0x2(%rbp), %eax
cmpl $0x30, %eax
jle 0x9600
movb $-0x1, -0x1(%rbp)
jmp 0x97df
movzbl -0x25(%rbp), %eax
leaq 0x4cef(%rip), %rcx      # 0xe2fa
movzbl (%rcx), %ecx
cmpl %ecx, %eax
jg 0x9644
movzbl -0x2(%rbp), %eax
cmpl $0x8, %eax
jl 0x9644
movzbl -0x2(%rbp), %eax
cmpl $0x10, %eax
jg 0x9644
movb -0x25(%rbp), %cl
movq -0x18(%rbp), %rax
movb %cl, (%rax)
movb -0x2(%rbp), %al
movzbl %al, %edi
movzbl -0x25(%rbp), %esi
callq 0x93c0
movb %al, -0x1(%rbp)
jmp 0x97df
movzbl -0x2(%rbp), %eax
cmpl $0x8, %eax
jne 0x9679
leaq 0x4ca6(%rip), %rax      # 0xe2fa
movb (%rax), %cl
movq -0x18(%rbp), %rax
movb %cl, (%rax)
movb -0x2(%rbp), %cl
leaq 0x4c94(%rip), %rax      # 0xe2fa
movzbl %cl, %edi
movzbl (%rax), %esi
callq 0x93c0
movb %al, -0x1(%rbp)
jmp 0x97df
movzbl -0x25(%rbp), %eax
leaq 0x4c81(%rip), %rcx      # 0xe305
movzbl (%rcx), %ecx
cmpl %ecx, %eax
jg 0x96bd
movzbl -0x2(%rbp), %eax
cmpl $0x8, %eax
jle 0x96bd
movzbl -0x2(%rbp), %eax
cmpl $0x10, %eax
jg 0x96bd
movb -0x25(%rbp), %cl
movq -0x18(%rbp), %rax
movb %cl, (%rax)
movb -0x2(%rbp), %al
movzbl %al, %edi
movzbl -0x25(%rbp), %esi
callq 0x93c0
movb %al, -0x1(%rbp)
jmp 0x97df
movzbl -0x2(%rbp), %eax
cmpl $0x10, %eax
jg 0x96f2
leaq 0x4c38(%rip), %rax      # 0xe305
movb (%rax), %cl
movq -0x18(%rbp), %rax
movb %cl, (%rax)
movb -0x2(%rbp), %cl
leaq 0x4c26(%rip), %rax      # 0xe305
movzbl %cl, %edi
movzbl (%rax), %esi
callq 0x93c0
movb %al, -0x1(%rbp)
jmp 0x97df
movzbl -0x25(%rbp), %eax
leaq 0x4b93(%rip), %rcx      # 0xe290
movzbl (%rcx), %ecx
cmpl %ecx, %eax
jg 0x9736
movzbl -0x2(%rbp), %eax
cmpl $0x10, %eax
jle 0x9736
movzbl -0x2(%rbp), %eax
cmpl $0x20, %eax
jg 0x9736
movb -0x25(%rbp), %cl
movq -0x18(%rbp), %rax
movb %cl, (%rax)
movb -0x2(%rbp), %al
movzbl %al, %edi
movzbl -0x25(%rbp), %esi
callq 0x93c0
movb %al, -0x1(%rbp)
jmp 0x97df
movzbl -0x2(%rbp), %eax
cmpl $0x20, %eax
jg 0x9768
leaq 0x4b4a(%rip), %rax      # 0xe290
movb (%rax), %cl
movq -0x18(%rbp), %rax
movb %cl, (%rax)
movb -0x2(%rbp), %cl
leaq 0x4b38(%rip), %rax      # 0xe290
movzbl %cl, %edi
movzbl (%rax), %esi
callq 0x93c0
movb %al, -0x1(%rbp)
jmp 0x97df
movzbl -0x25(%rbp), %eax
leaq 0x49ed(%rip), %rcx      # 0xe160
movzbl (%rcx), %ecx
cmpl %ecx, %eax
jg 0x97a9
movzbl -0x2(%rbp), %eax
cmpl $0x20, %eax
jle 0x97a9
movzbl -0x2(%rbp), %eax
cmpl $0x30, %eax
jg 0x97a9
movb -0x25(%rbp), %cl
movq -0x18(%rbp), %rax
movb %cl, (%rax)
movb -0x2(%rbp), %al
movzbl %al, %edi
movzbl -0x25(%rbp), %esi
callq 0x93c0
movb %al, -0x1(%rbp)
jmp 0x97df
movzbl -0x2(%rbp), %eax
cmpl $0x30, %eax
jg 0x97db
leaq 0x49a7(%rip), %rax      # 0xe160
movb (%rax), %cl
movq -0x18(%rbp), %rax
movb %cl, (%rax)
movb -0x2(%rbp), %cl
leaq 0x4995(%rip), %rax      # 0xe160
movzbl %cl, %edi
movzbl (%rax), %esi
callq 0x93c0
movb %al, -0x1(%rbp)
jmp 0x97df
movb $-0x1, -0x1(%rbp)
movb -0x1(%rbp), %al
addq $0x60, %rsp
popq %rbp
retq
nopl (%rax,%rax)