int get_sector_size_kb(int sector) {
  if ((sector >= 0 && sector < 4) || (sector >= 12 && sector < 16))
    return 16;
  else if (sector == 4 || sector == 16)
    return 64;
  else if ((sector >= 5 && sector <= 11) || (sector >= 17 && sector <= 23))
    return 128;
  return 0;
}


x86 assembly (clang, -O0):
<get_sector_size_kb>:
push   %rbp
mov    %rsp,%rbp
mov    %edi,-0x8(%rbp)
cmpl   $0x0,-0x8(%rbp)
jl     111b <get_sector_size_kb+0x1b>
cmpl   $0x4,-0x8(%rbp)
jl     112f <get_sector_size_kb+0x2f>
cmpl   $0xc,-0x8(%rbp)
jl     113b <get_sector_size_kb+0x3b>
cmpl   $0x10,-0x8(%rbp)
jge    113b <get_sector_size_kb+0x3b>
movl   $0x10,-0x4(%rbp)
jmp    11a0 <get_sector_size_kb+0xa0>
cmpl   $0x4,-0x8(%rbp)
je     114f <get_sector_size_kb+0x4f>
cmpl   $0x10,-0x8(%rbp)
jne    115b <get_sector_size_kb+0x5b>
movl   $0x40,-0x4(%rbp)
jmp    11a0 <get_sector_size_kb+0xa0>
cmpl   $0x5,-0x8(%rbp)
jl     116f <get_sector_size_kb+0x6f>
cmpl   $0xb,-0x8(%rbp)
jle    1183 <get_sector_size_kb+0x83>
cmpl   $0x11,-0x8(%rbp)
jl     118f <get_sector_size_kb+0x8f>
cmpl   $0x17,-0x8(%rbp)
jg     118f <get_sector_size_kb+0x8f>
movl   $0x80,-0x4(%rbp)
jmp    11a0 <get_sector_size_kb+0xa0>
jmp    1194 <get_sector_size_kb+0x94>
jmp    1199 <get_sector_size_kb+0x99>
movl   $0x0,-0x4(%rbp)
mov    -0x4(%rbp),%eax
pop    %rbp
ret

x86 assembly (clang, -O2):
<get_sector_size_kb>:
mov    $0x10,%eax
cmp    $0x4,%edi
jb     112b <get_sector_size_kb+0x2b>
mov    %edi,%ecx
and    $0xfffffffc,%ecx
cmp    $0xc,%ecx
je     112b <get_sector_size_kb+0x2b>
add    $0xfffffffc,%edi
xor    %eax,%eax
cmp    $0x13,%edi
ja     112b <get_sector_size_kb+0x2b>
movslq %edi,%rax
lea    0xed8(%rip),%rcx
mov    (%rcx,%rax,4),%eax
ret

LLVM IR (-O0):
define i32 @get_sector_size_kb(i32 %0) {
%2 = alloca i32
%3 = alloca i32
store i32 %0, i32* %3
%4 = load i32, i32* %3
%5 = icmp sge i32 %4, 0
br i1 %5, label %6, label %9
6: ; preds = %1
%7 = load i32, i32* %3
%8 = icmp slt i32 %7, 4
br i1 %8, label %15, label %9
9: ; preds = %6, %1
%10 = load i32, i32* %3
%11 = icmp sge i32 %10, 12
br i1 %11, label %12, label %16
12: ; preds = %9
%13 = load i32, i32* %3
%14 = icmp slt i32 %13, 16
br i1 %14, label %15, label %16
15: ; preds = %12, %6
store i32 16, i32* %2
br label %39
16: ; preds = %12, %9
%17 = load i32, i32* %3
%18 = icmp eq i32 %17, 4
br i1 %18, label %22, label %19
19: ; preds = %16
%20 = load i32, i32* %3
%21 = icmp eq i32 %20, 16
br i1 %21, label %22, label %23
22: ; preds = %19, %16
store i32 64, i32* %2
br label %39
23: ; preds = %19
%24 = load i32, i32* %3
%25 = icmp sge i32 %24, 5
br i1 %25, label %26, label %29
26: ; preds = %23
%27 = load i32, i32* %3
%28 = icmp sle i32 %27, 11
br i1 %28, label %35, label %29
29: ; preds = %26, %23
%30 = load i32, i32* %3
%31 = icmp sge i32 %30, 17
br i1 %31, label %32, label %36
32: ; preds = %29
%33 = load i32, i32* %3
%34 = icmp sle i32 %33, 23
br i1 %34, label %35, label %36
35: ; preds = %32, %26
store i32 128, i32* %2
br label %39
36: ; preds = %32, %29
br label %37
37: ; preds = %36
br label %38
38: ; preds = %37
store i32 0, i32* %2
br label %39
39: ; preds = %38, %35, %22, %15
%40 = load i32, i32* %2
ret i32 %40
}

LLVM IR (-O2):
@switch.table.get_sector_size_kb = [20 x i32] [i32 64, i32 128, i32 128, i32 128, i32 128, i32 128, i32 128, i32 128, i32 0, i32 0, i32 0, i32 0, i32 64, i32 128, i32 128, i32 128, i32 128, i32 128, i32 128, i32 128]
define i32 @get_sector_size_kb(i32 %0) {
%2 = icmp ult i32 %0, 4
%3 = and i32 %0, -4
%4 = icmp eq i32 %3, 12
%5 = or i1 %2, %4
br i1 %5, label %13, label %6
6: ; preds = %1
%7 = add i32 %0, -4
%8 = icmp ult i32 %7, 20
br i1 %8, label %9, label %13
9: ; preds = %6
%10 = sext i32 %7 to i64
%11 = getelementptr inbounds [20 x i32], [20 x i32]* @switch.table.get_sector_size_kb, i64 0, i64 %10
%12 = load i32, i32* %11
br label %13
13: ; preds = %6, %9, %1
%14 = phi i32 [ 16, %1 ], [ %12, %9 ], [ 0, %6 ]
ret i32 %14
}