int ZopfliGetDistExtraBitsValue(int dist) {
  if (dist < 5)
    return 0;
  else if (dist < 9)
    return (dist - 5) & 1;
  else if (dist < 17)
    return (dist - 9) & 3;
  else if (dist < 33)
    return (dist - 17) & 7;
  else if (dist < 65)
    return (dist - 33) & 15;
  else if (dist < 129)
    return (dist - 65) & 31;
  else if (dist < 257)
    return (dist - 129) & 63;
  else if (dist < 513)
    return (dist - 257) & 127;
  else if (dist < 1025)
    return (dist - 513) & 255;
  else if (dist < 2049)
    return (dist - 1025) & 511;
  else if (dist < 4097)
    return (dist - 2049) & 1023;
  else if (dist < 8193)
    return (dist - 4097) & 2047;
  else if (dist < 16385)
    return (dist - 8193) & 4095;
  else
    return (dist - 16385) & 8191;
}


x86 assembly (clang, -O0):
<ZopfliGetDistExtraBitsValue>:
push   %rbp
mov    %rsp,%rbp
mov    %edi,-0x8(%rbp)
cmpl   $0x5,-0x8(%rbp)
jge    111d <ZopfliGetDistExtraBitsValue+0x1d>
movl   $0x0,-0x4(%rbp)
jmp    12a1 <ZopfliGetDistExtraBitsValue+0x1a1>
cmpl   $0x9,-0x8(%rbp)
jge    1138 <ZopfliGetDistExtraBitsValue+0x38>
mov    -0x8(%rbp),%eax
sub    $0x5,%eax
and    $0x1,%eax
mov    %eax,-0x4(%rbp)
jmp    12a1 <ZopfliGetDistExtraBitsValue+0x1a1>
cmpl   $0x11,-0x8(%rbp)
jge    1153 <ZopfliGetDistExtraBitsValue+0x53>
mov    -0x8(%rbp),%eax
sub    $0x9,%eax
and    $0x3,%eax
mov    %eax,-0x4(%rbp)
jmp    12a1 <ZopfliGetDistExtraBitsValue+0x1a1>
cmpl   $0x21,-0x8(%rbp)
jge    116e <ZopfliGetDistExtraBitsValue+0x6e>
mov    -0x8(%rbp),%eax
sub    $0x11,%eax
and    $0x7,%eax
mov    %eax,-0x4(%rbp)
jmp    12a1 <ZopfliGetDistExtraBitsValue+0x1a1>
cmpl   $0x41,-0x8(%rbp)
jge    1189 <ZopfliGetDistExtraBitsValue+0x89>
mov    -0x8(%rbp),%eax
sub    $0x21,%eax
and    $0xf,%eax
mov    %eax,-0x4(%rbp)
jmp    12a1 <ZopfliGetDistExtraBitsValue+0x1a1>
cmpl   $0x81,-0x8(%rbp)
jge    11a7 <ZopfliGetDistExtraBitsValue+0xa7>
mov    -0x8(%rbp),%eax
sub    $0x41,%eax
and    $0x1f,%eax
mov    %eax,-0x4(%rbp)
jmp    12a1 <ZopfliGetDistExtraBitsValue+0x1a1>
cmpl   $0x101,-0x8(%rbp)
jge    11c7 <ZopfliGetDistExtraBitsValue+0xc7>
mov    -0x8(%rbp),%eax
sub    $0x81,%eax
and    $0x3f,%eax
mov    %eax,-0x4(%rbp)
jmp    12a1 <ZopfliGetDistExtraBitsValue+0x1a1>
cmpl   $0x201,-0x8(%rbp)
jge    11e7 <ZopfliGetDistExtraBitsValue+0xe7>
mov    -0x8(%rbp),%eax
sub    $0x101,%eax
and    $0x7f,%eax
mov    %eax,-0x4(%rbp)
jmp    12a1 <ZopfliGetDistExtraBitsValue+0x1a1>
cmpl   $0x401,-0x8(%rbp)
jge    1209 <ZopfliGetDistExtraBitsValue+0x109>
mov    -0x8(%rbp),%eax
sub    $0x201,%eax
and    $0xff,%eax
mov    %eax,-0x4(%rbp)
jmp    12a1 <ZopfliGetDistExtraBitsValue+0x1a1>
cmpl   $0x801,-0x8(%rbp)
jge    122b <ZopfliGetDistExtraBitsValue+0x12b>
mov    -0x8(%rbp),%eax
sub    $0x401,%eax
and    $0x1ff,%eax
mov    %eax,-0x4(%rbp)
jmp    12a1 <ZopfliGetDistExtraBitsValue+0x1a1>
cmpl   $0x1001,-0x8(%rbp)
jge    124d <ZopfliGetDistExtraBitsValue+0x14d>
mov    -0x8(%rbp),%eax
sub    $0x801,%eax
and    $0x3ff,%eax
mov    %eax,-0x4(%rbp)
jmp    12a1 <ZopfliGetDistExtraBitsValue+0x1a1>
cmpl   $0x2001,-0x8(%rbp)
jge    126f <ZopfliGetDistExtraBitsValue+0x16f>
mov    -0x8(%rbp),%eax
sub    $0x1001,%eax
and    $0x7ff,%eax
mov    %eax,-0x4(%rbp)
jmp    12a1 <ZopfliGetDistExtraBitsValue+0x1a1>
cmpl   $0x4001,-0x8(%rbp)
jge    1291 <ZopfliGetDistExtraBitsValue+0x191>
mov    -0x8(%rbp),%eax
sub    $0x2001,%eax
and    $0xfff,%eax
mov    %eax,-0x4(%rbp)
jmp    12a1 <ZopfliGetDistExtraBitsValue+0x1a1>
mov    -0x8(%rbp),%eax
sub    $0x4001,%eax
and    $0x1fff,%eax
mov    %eax,-0x4(%rbp)
mov    -0x4(%rbp),%eax
pop    %rbp
ret

x86 assembly (clang, -O2):
<ZopfliGetDistExtraBitsValue>:
xor    %eax,%eax
cmp    $0x5,%edi
jl     11e4 <ZopfliGetDistExtraBitsValue+0xe4>
cmp    $0x8,%edi
ja     111a <ZopfliGetDistExtraBitsValue+0x1a>
not    %edi
and    $0x1,%edi
jmp    11e2 <ZopfliGetDistExtraBitsValue+0xe2>
cmp    $0x10,%edi
ja     112a <ZopfliGetDistExtraBitsValue+0x2a>
add    $0xffffffff,%edi
and    $0x3,%edi
jmp    11e2 <ZopfliGetDistExtraBitsValue+0xe2>
cmp    $0x20,%edi
ja     113a <ZopfliGetDistExtraBitsValue+0x3a>
add    $0xffffffff,%edi
and    $0x7,%edi
jmp    11e2 <ZopfliGetDistExtraBitsValue+0xe2>
cmp    $0x40,%edi
ja     114a <ZopfliGetDistExtraBitsValue+0x4a>
add    $0xffffffff,%edi
and    $0xf,%edi
jmp    11e2 <ZopfliGetDistExtraBitsValue+0xe2>
cmp    $0x80,%edi
ja     115d <ZopfliGetDistExtraBitsValue+0x5d>
add    $0xffffffff,%edi
and    $0x1f,%edi
jmp    11e2 <ZopfliGetDistExtraBitsValue+0xe2>
cmp    $0x100,%edi
ja     116d <ZopfliGetDistExtraBitsValue+0x6d>
add    $0xffffffff,%edi
and    $0x3f,%edi
jmp    11e2 <ZopfliGetDistExtraBitsValue+0xe2>
cmp    $0x200,%edi
ja     117d <ZopfliGetDistExtraBitsValue+0x7d>
add    $0xffffffff,%edi
and    $0x7f,%edi
jmp    11e2 <ZopfliGetDistExtraBitsValue+0xe2>
cmp    $0x400,%edi
ja     118d <ZopfliGetDistExtraBitsValue+0x8d>
add    $0xffffffff,%edi
movzbl %dil,%eax
ret
cmp    $0x800,%edi
ja     11a0 <ZopfliGetDistExtraBitsValue+0xa0>
add    $0xffffffff,%edi
and    $0x1ff,%edi
jmp    11e2 <ZopfliGetDistExtraBitsValue+0xe2>
cmp    $0x1000,%edi
ja     11b3 <ZopfliGetDistExtraBitsValue+0xb3>
add    $0xffffffff,%edi
and    $0x3ff,%edi
jmp    11e2 <ZopfliGetDistExtraBitsValue+0xe2>
cmp    $0x2000,%edi
ja     11c6 <ZopfliGetDistExtraBitsValue+0xc6>
add    $0xffffffff,%edi
and    $0x7ff,%edi
jmp    11e2 <ZopfliGetDistExtraBitsValue+0xe2>
cmp    $0x4000,%edi
ja     11d9 <ZopfliGetDistExtraBitsValue+0xd9>
add    $0xffffffff,%edi
and    $0xfff,%edi
jmp    11e2 <ZopfliGetDistExtraBitsValue+0xe2>
add    $0xffffffff,%edi
and    $0x1fff,%edi
mov    %edi,%eax
ret

LLVM IR (-O0):
define i32 @ZopfliGetDistExtraBitsValue(i32 %0) {
%2 = alloca i32
%3 = alloca i32
store i32 %0, i32* %3
%4 = load i32, i32* %3
%5 = icmp slt i32 %4, 5
br i1 %5, label %6, label %7
6: ; preds = %1
store i32 0, i32* %2
br label %95
7: ; preds = %1
%8 = load i32, i32* %3
%9 = icmp slt i32 %8, 9
br i1 %9, label %10, label %14
10: ; preds = %7
%11 = load i32, i32* %3
%12 = sub nsw i32 %11, 5
%13 = and i32 %12, 1
store i32 %13, i32* %2
br label %95
14: ; preds = %7
%15 = load i32, i32* %3
%16 = icmp slt i32 %15, 17
br i1 %16, label %17, label %21
17: ; preds = %14
%18 = load i32, i32* %3
%19 = sub nsw i32 %18, 9
%20 = and i32 %19, 3
store i32 %20, i32* %2
br label %95
21: ; preds = %14
%22 = load i32, i32* %3
%23 = icmp slt i32 %22, 33
br i1 %23, label %24, label %28
24: ; preds = %21
%25 = load i32, i32* %3
%26 = sub nsw i32 %25, 17
%27 = and i32 %26, 7
store i32 %27, i32* %2
br label %95
28: ; preds = %21
%29 = load i32, i32* %3
%30 = icmp slt i32 %29, 65
br i1 %30, label %31, label %35
31: ; preds = %28
%32 = load i32, i32* %3
%33 = sub nsw i32 %32, 33
%34 = and i32 %33, 15
store i32 %34, i32* %2
br label %95
35: ; preds = %28
%36 = load i32, i32* %3
%37 = icmp slt i32 %36, 129
br i1 %37, label %38, label %42
38: ; preds = %35
%39 = load i32, i32* %3
%40 = sub nsw i32 %39, 65
%41 = and i32 %40, 31
store i32 %41, i32* %2
br label %95
42: ; preds = %35
%43 = load i32, i32* %3
%44 = icmp slt i32 %43, 257
br i1 %44, label %45, label %49
45: ; preds = %42
%46 = load i32, i32* %3
%47 = sub nsw i32 %46, 129
%48 = and i32 %47, 63
store i32 %48, i32* %2
br label %95
49: ; preds = %42
%50 = load i32, i32* %3
%51 = icmp slt i32 %50, 513
br i1 %51, label %52, label %56
52: ; preds = %49
%53 = load i32, i32* %3
%54 = sub nsw i32 %53, 257
%55 = and i32 %54, 127
store i32 %55, i32* %2
br label %95
56: ; preds = %49
%57 = load i32, i32* %3
%58 = icmp slt i32 %57, 1025
br i1 %58, label %59, label %63
59: ; preds = %56
%60 = load i32, i32* %3
%61 = sub nsw i32 %60, 513
%62 = and i32 %61, 255
store i32 %62, i32* %2
br label %95
63: ; preds = %56
%64 = load i32, i32* %3
%65 = icmp slt i32 %64, 2049
br i1 %65, label %66, label %70
66: ; preds = %63
%67 = load i32, i32* %3
%68 = sub nsw i32 %67, 1025
%69 = and i32 %68, 511
store i32 %69, i32* %2
br label %95
70: ; preds = %63
%71 = load i32, i32* %3
%72 = icmp slt i32 %71, 4097
br i1 %72, label %73, label %77
73: ; preds = %70
%74 = load i32, i32* %3
%75 = sub nsw i32 %74, 2049
%76 = and i32 %75, 1023
store i32 %76, i32* %2
br label %95
77: ; preds = %70
%78 = load i32, i32* %3
%79 = icmp slt i32 %78, 8193
br i1 %79, label %80, label %84
80: ; preds = %77
%81 = load i32, i32* %3
%82 = sub nsw i32 %81, 4097
%83 = and i32 %82, 2047
store i32 %83, i32* %2
br label %95
84: ; preds = %77
%85 = load i32, i32* %3
%86 = icmp slt i32 %85, 16385
br i1 %86, label %87, label %91
87: ; preds = %84
%88 = load i32, i32* %3
%89 = sub nsw i32 %88, 8193
%90 = and i32 %89, 4095
store i32 %90, i32* %2
br label %95
91: ; preds = %84
%92 = load i32, i32* %3
%93 = sub nsw i32 %92, 16385
%94 = and i32 %93, 8191
store i32 %94, i32* %2
br label %95
95: ; preds = %91, %87, %80, %73, %66, %59, %52, %45, %38, %31, %24, %17, %10, %6
%96 = load i32, i32* %2
ret i32 %96
}

LLVM IR (-O2):
define i32 @ZopfliGetDistExtraBitsValue(i32 %0) {
%2 = icmp slt i32 %0, 5
br i1 %2, label %66, label %3
3: ; preds = %1
%4 = icmp ult i32 %0, 9
br i1 %4, label %5, label %8
5: ; preds = %3
%6 = and i32 %0, 1
%7 = xor i32 %6, 1
br label %66
8: ; preds = %3
%9 = icmp ult i32 %0, 17
br i1 %9, label %10, label %13
10: ; preds = %8
%11 = add nuw nsw i32 %0, 3
%12 = and i32 %11, 3
br label %66
13: ; preds = %8
%14 = icmp ult i32 %0, 33
br i1 %14, label %15, label %18
15: ; preds = %13
%16 = add nuw nsw i32 %0, 7
%17 = and i32 %16, 7
br label %66
18: ; preds = %13
%19 = icmp ult i32 %0, 65
br i1 %19, label %20, label %23
20: ; preds = %18
%21 = add nuw nsw i32 %0, 15
%22 = and i32 %21, 15
br label %66
23: ; preds = %18
%24 = icmp ult i32 %0, 129
br i1 %24, label %25, label %28
25: ; preds = %23
%26 = add nuw nsw i32 %0, 31
%27 = and i32 %26, 31
br label %66
28: ; preds = %23
%29 = icmp ult i32 %0, 257
br i1 %29, label %30, label %33
30: ; preds = %28
%31 = add nuw nsw i32 %0, 63
%32 = and i32 %31, 63
br label %66
33: ; preds = %28
%34 = icmp ult i32 %0, 513
br i1 %34, label %35, label %38
35: ; preds = %33
%36 = add nuw nsw i32 %0, 127
%37 = and i32 %36, 127
br label %66
38: ; preds = %33
%39 = icmp ult i32 %0, 1025
br i1 %39, label %40, label %43
40: ; preds = %38
%41 = add nuw nsw i32 %0, 255
%42 = and i32 %41, 255
br label %66
43: ; preds = %38
%44 = icmp ult i32 %0, 2049
br i1 %44, label %45, label %48
45: ; preds = %43
%46 = add nuw nsw i32 %0, 511
%47 = and i32 %46, 511
br label %66
48: ; preds = %43
%49 = icmp ult i32 %0, 4097
br i1 %49, label %50, label %53
50: ; preds = %48
%51 = add nuw nsw i32 %0, 1023
%52 = and i32 %51, 1023
br label %66
53: ; preds = %48
%54 = icmp ult i32 %0, 8193
br i1 %54, label %55, label %58
55: ; preds = %53
%56 = add nuw nsw i32 %0, 2047
%57 = and i32 %56, 2047
br label %66
58: ; preds = %53
%59 = icmp ult i32 %0, 16385
br i1 %59, label %60, label %63
60: ; preds = %58
%61 = add nuw nsw i32 %0, 4095
%62 = and i32 %61, 4095
br label %66
63: ; preds = %58
%64 = add nuw i32 %0, 8191
%65 = and i32 %64, 8191
br label %66
66: ; preds = %1, %63, %60, %55, %50, %45, %40, %35, %30, %25, %20, %15, %10, %5
%67 = phi i32 [ %7, %5 ], [ %12, %10 ], [ %17, %15 ], [ %22, %20 ], [ %27, %25 ], [ %32, %30 ], [ %37, %35 ], [ %42, %40 ], [ %47, %45 ], [ %52, %50 ], [ %57, %55 ], [ %62, %60 ], [ %65, %63 ], [ 0, %1 ]
ret i32 %67
}