int do_validate_cmd(int cmd) {
  switch (((cmd >> 29) & 0x7)) {
  case 0x0:
    switch ((cmd >> 23) & 0x3f) {
    case 0x0:
      return 1;
    case 0x4:
      return 1;
    default:
      return 0;
    }
    break;
  case 0x1:
    return 0;
  case 0x2:
    return (cmd & 0xff) + 2;
  case 0x3:
    if (((cmd >> 24) & 0x1f) <= 0x18)
      return 1;
    switch ((cmd >> 24) & 0x1f) {
    case 0x1c:
      return 1;
    case 0x1d:
      switch ((cmd >> 16) & 0xff) {
      case 0x3:
        return (cmd & 0x1f) + 2;
      case 0x4:
        return (cmd & 0xf) + 2;
      default:
        return (cmd & 0xffff) + 2;
      }
    case 0x1e:
      if (cmd & (1 << 23))
        return (cmd & 0xffff) + 1;
      else
        return 1;
    case 0x1f:
      if ((cmd & (1 << 23)) == 0)
        return (cmd & 0x1ffff) + 2;
      else if (cmd & (1 << 17))
        if ((cmd & 0xffff) == 0)
          return 0;
        else
          return (((cmd & 0xffff) + 1) / 2) + 1;
      else
        return 2;
    default:
      return 0;
    }
  default:
    return 0;
  }
  return 0;
}


x86 assembly (clang, -O0):
<do_validate_cmd>:
push   %rbp
mov    %rsp,%rbp
mov    %edi,-0x8(%rbp)
mov    -0x8(%rbp),%eax
shr    $0x1d,%eax
mov    %eax,%ecx
mov    %rcx,-0x10(%rbp)
sub    $0x3,%eax
ja     1305 <do_validate_cmd+0x205>
mov    -0x10(%rbp),%rax
lea    0xed9(%rip),%rcx
movslq (%rcx,%rax,4),%rax
add    %rcx,%rax
jmp    *%rax
mov    -0x8(%rbp),%eax
shr    $0x17,%eax
and    $0x3f,%eax
mov    %eax,-0x14(%rbp)
je     1158 <do_validate_cmd+0x58>
jmp    1147 <do_validate_cmd+0x47>
mov    -0x14(%rbp),%eax
sub    $0x4,%eax
je     1164 <do_validate_cmd+0x64>
jmp    1170 <do_validate_cmd+0x70>
movl   $0x1,-0x4(%rbp)
jmp    130c <do_validate_cmd+0x20c>
movl   $0x1,-0x4(%rbp)
jmp    130c <do_validate_cmd+0x20c>
movl   $0x0,-0x4(%rbp)
jmp    130c <do_validate_cmd+0x20c>
movl   $0x0,-0x4(%rbp)
jmp    130c <do_validate_cmd+0x20c>
mov    -0x8(%rbp),%eax
and    $0xff,%eax
add    $0x2,%eax
mov    %eax,-0x4(%rbp)
jmp    130c <do_validate_cmd+0x20c>
mov    -0x8(%rbp),%eax
sar    $0x18,%eax
and    $0x1f,%eax
cmp    $0x18,%eax
jg     11b9 <do_validate_cmd+0xb9>
movl   $0x1,-0x4(%rbp)
jmp    130c <do_validate_cmd+0x20c>
movzbl -0x5(%rbp),%eax
and    $0x1f,%eax
add    $0xffffffe4,%eax
mov    %eax,%ecx
mov    %rcx,-0x20(%rbp)
sub    $0x3,%eax
ja     12f9 <do_validate_cmd+0x1f9>
mov    -0x20(%rbp),%rax
lea    0xe33(%rip),%rcx
movslq (%rcx,%rax,4),%rax
add    %rcx,%rax
jmp    *%rax
movl   $0x1,-0x4(%rbp)
jmp    130c <do_validate_cmd+0x20c>
movzbl -0x6(%rbp),%eax
mov    %eax,-0x24(%rbp)
sub    $0x3,%eax
je     1218 <do_validate_cmd+0x118>
jmp    1207 <do_validate_cmd+0x107>
mov    -0x24(%rbp),%eax
sub    $0x4,%eax
je     1229 <do_validate_cmd+0x129>
jmp    123a <do_validate_cmd+0x13a>
mov    -0x8(%rbp),%eax
and    $0x1f,%eax
add    $0x2,%eax
mov    %eax,-0x4(%rbp)
jmp    130c <do_validate_cmd+0x20c>
mov    -0x8(%rbp),%eax
and    $0xf,%eax
add    $0x2,%eax
mov    %eax,-0x4(%rbp)
jmp    130c <do_validate_cmd+0x20c>
mov    -0x8(%rbp),%eax
and    $0xffff,%eax
add    $0x2,%eax
mov    %eax,-0x4(%rbp)
jmp    130c <do_validate_cmd+0x20c>
mov    -0x8(%rbp),%eax
and    $0x800000,%eax
cmp    $0x0,%eax
je     1271 <do_validate_cmd+0x171>
mov    -0x8(%rbp),%eax
and    $0xffff,%eax
add    $0x1,%eax
mov    %eax,-0x4(%rbp)
jmp    130c <do_validate_cmd+0x20c>
movl   $0x1,-0x4(%rbp)
jmp    130c <do_validate_cmd+0x20c>
mov    -0x8(%rbp),%eax
and    $0x800000,%eax
cmp    $0x0,%eax
jne    12a1 <do_validate_cmd+0x1a1>
mov    -0x8(%rbp),%eax
and    $0x1ffff,%eax
add    $0x2,%eax
mov    %eax,-0x4(%rbp)
jmp    130c <do_validate_cmd+0x20c>
mov    -0x8(%rbp),%eax
and    $0x20000,%eax
cmp    $0x0,%eax
je     12ed <do_validate_cmd+0x1ed>
mov    -0x8(%rbp),%eax
and    $0xffff,%eax
cmp    $0x0,%eax
jne    12cf <do_validate_cmd+0x1cf>
movl   $0x0,-0x4(%rbp)
jmp    130c <do_validate_cmd+0x20c>
mov    -0x8(%rbp),%eax
and    $0xffff,%eax
add    $0x1,%eax
mov    $0x2,%ecx
cltd
idiv   %ecx
add    $0x1,%eax
mov    %eax,-0x4(%rbp)
jmp    130c <do_validate_cmd+0x20c>
movl   $0x2,-0x4(%rbp)
jmp    130c <do_validate_cmd+0x20c>
movl   $0x0,-0x4(%rbp)
jmp    130c <do_validate_cmd+0x20c>
movl   $0x0,-0x4(%rbp)
mov    -0x4(%rbp),%eax
pop    %rbp
ret

x86 assembly (clang, -O2):
<do_validate_cmd>:
mov    %edi,%ecx
shr    $0x1d,%ecx
cmp    $0x3,%ecx
je     1124 <do_validate_cmd+0x24>
cmp    $0x2,%ecx
je     1137 <do_validate_cmd+0x37>
mov    $0x0,%eax
test   %ecx,%ecx
jne    1136 <do_validate_cmd+0x36>
xor    %eax,%eax
test   $0x1d800000,%edi
sete   %al
ret
mov    %edi,%ecx
shr    $0x18,%ecx
and    $0x1f,%ecx
mov    $0x1,%eax
cmp    $0x19,%ecx
jae    113f <do_validate_cmd+0x3f>
ret
movzbl %dil,%eax
add    $0x2,%eax
ret
add    $0xffffffe4,%ecx
cmp    $0x3,%ecx
ja     1169 <do_validate_cmd+0x69>
lea    0xeb2(%rip),%rdx
movslq (%rdx,%rcx,4),%rcx
add    %rdx,%rcx
jmp    *%rcx
mov    %edi,%eax
shr    $0x10,%eax
cmp    $0x4,%al
je     11b0 <do_validate_cmd+0xb0>
cmp    $0x3,%al
jne    11b9 <do_validate_cmd+0xb9>
and    $0x1f,%edi
jmp    11b3 <do_validate_cmd+0xb3>
xor    %eax,%eax
ret
test   $0x800000,%edi
je     1136 <do_validate_cmd+0x36>
movzwl %di,%eax
add    $0x1,%eax
ret
test   $0x800000,%edi
jne    118b <do_validate_cmd+0x8b>
and    $0x1ffff,%edi
jmp    11b3 <do_validate_cmd+0xb3>
mov    $0x2,%eax
test   $0x20000,%edi
je     1136 <do_validate_cmd+0x36>
mov    $0x0,%eax
and    $0xffff,%edi
je     1136 <do_validate_cmd+0x36>
add    $0x1,%edi
shr    %edi
add    $0x1,%edi
mov    %edi,%eax
ret
and    $0xf,%edi
add    $0x2,%edi
mov    %edi,%eax
ret
movzwl %di,%eax
add    $0x2,%eax
ret

LLVM IR (-O0):
define i32 @do_validate_cmd(i32 %0) {
%2 = alloca i32
%3 = alloca i32
store i32 %0, i32* %3
%4 = load i32, i32* %3
%5 = ashr i32 %4, 29
%6 = and i32 %5, 7
switch i32 %6, label %80 [
i32 0, label %7
i32 1, label %14
i32 2, label %15
i32 3, label %19
]
7: ; preds = %1
%8 = load i32, i32* %3
%9 = ashr i32 %8, 23
%10 = and i32 %9, 63
switch i32 %10, label %13 [
i32 0, label %11
i32 4, label %12
]
11: ; preds = %7
store i32 1, i32* %2
br label %81
12: ; preds = %7
store i32 1, i32* %2
br label %81
13: ; preds = %7
store i32 0, i32* %2
br label %81
14: ; preds = %1
store i32 0, i32* %2
br label %81
15: ; preds = %1
%16 = load i32, i32* %3
%17 = and i32 %16, 255
%18 = add nsw i32 %17, 2
store i32 %18, i32* %2
br label %81
19: ; preds = %1
%20 = load i32, i32* %3
%21 = ashr i32 %20, 24
%22 = and i32 %21, 31
%23 = icmp sle i32 %22, 24
br i1 %23, label %24, label %25
24: ; preds = %19
store i32 1, i32* %2
br label %81
25: ; preds = %19
%26 = load i32, i32* %3
%27 = ashr i32 %26, 24
%28 = and i32 %27, 31
switch i32 %28, label %79 [
i32 28, label %29
i32 29, label %30
i32 30, label %46
i32 31, label %55
]
29: ; preds = %25
store i32 1, i32* %2
br label %81
30: ; preds = %25
%31 = load i32, i32* %3
%32 = ashr i32 %31, 16
%33 = and i32 %32, 255
switch i32 %33, label %42 [
i32 3, label %34
i32 4, label %38
]
34: ; preds = %30
%35 = load i32, i32* %3
%36 = and i32 %35, 31
%37 = add nsw i32 %36, 2
store i32 %37, i32* %2
br label %81
38: ; preds = %30
%39 = load i32, i32* %3
%40 = and i32 %39, 15
%41 = add nsw i32 %40, 2
store i32 %41, i32* %2
br label %81
42: ; preds = %30
%43 = load i32, i32* %3
%44 = and i32 %43, 65535
%45 = add nsw i32 %44, 2
store i32 %45, i32* %2
br label %81
46: ; preds = %25
%47 = load i32, i32* %3
%48 = and i32 %47, 8388608
%49 = icmp ne i32 %48, 0
br i1 %49, label %50, label %54
50: ; preds = %46
%51 = load i32, i32* %3
%52 = and i32 %51, 65535
%53 = add nsw i32 %52, 1
store i32 %53, i32* %2
br label %81
54: ; preds = %46
store i32 1, i32* %2
br label %81
55: ; preds = %25
%56 = load i32, i32* %3
%57 = and i32 %56, 8388608
%58 = icmp eq i32 %57, 0
br i1 %58, label %59, label %63
59: ; preds = %55
%60 = load i32, i32* %3
%61 = and i32 %60, 131071
%62 = add nsw i32 %61, 2
store i32 %62, i32* %2
br label %81
63: ; preds = %55
%64 = load i32, i32* %3
%65 = and i32 %64, 131072
%66 = icmp ne i32 %65, 0
br i1 %66, label %67, label %78
67: ; preds = %63
%68 = load i32, i32* %3
%69 = and i32 %68, 65535
%70 = icmp eq i32 %69, 0
br i1 %70, label %71, label %72
71: ; preds = %67
store i32 0, i32* %2
br label %81
72: ; preds = %67
%73 = load i32, i32* %3
%74 = and i32 %73, 65535
%75 = add nsw i32 %74, 1
%76 = sdiv i32 %75, 2
%77 = add nsw i32 %76, 1
store i32 %77, i32* %2
br label %81
78: ; preds = %63
store i32 2, i32* %2
br label %81
79: ; preds = %25
store i32 0, i32* %2
br label %81
80: ; preds = %1
store i32 0, i32* %2
br label %81
81: ; preds = %80, %79, %78, %72, %71, %59, %54, %50, %42, %38, %34, %29, %24, %15, %14, %13, %12, %11
%82 = load i32, i32* %2
ret i32 %82
}

LLVM IR (-O2):
define i32 @do_validate_cmd(i32 %0) {
%2 = lshr i32 %0, 29
switch i32 %2, label %50 [
i32 0, label %3
i32 3, label %10
i32 2, label %7
]
3: ; preds = %1
%4 = and i32 %0, 494927872
%5 = icmp eq i32 %4, 0
%6 = zext i1 %5 to i32
br label %50
7: ; preds = %1
%8 = and i32 %0, 255
%9 = add nuw nsw i32 %8, 2
br label %50
10: ; preds = %1
%11 = lshr i32 %0, 24
%12 = and i32 %11, 31
%13 = icmp ult i32 %12, 25
br i1 %13, label %50, label %14
14: ; preds = %10
switch i32 %12, label %49 [
i32 28, label %50
i32 29, label %15
i32 30, label %27
i32 31, label %33
]
15: ; preds = %14
%16 = lshr i32 %0, 16
%17 = trunc i32 %16 to i8
switch i8 %17, label %24 [
i8 3, label %18
i8 4, label %21
]
18: ; preds = %15
%19 = and i32 %0, 31
%20 = add nuw nsw i32 %19, 2
br label %50
21: ; preds = %15
%22 = and i32 %0, 15
%23 = add nuw nsw i32 %22, 2
br label %50
24: ; preds = %15
%25 = and i32 %0, 65535
%26 = add nuw nsw i32 %25, 2
br label %50
27: ; preds = %14
%28 = and i32 %0, 8388608
%29 = icmp eq i32 %28, 0
br i1 %29, label %50, label %30
30: ; preds = %27
%31 = and i32 %0, 65535
%32 = add nuw nsw i32 %31, 1
br label %50
33: ; preds = %14
%34 = and i32 %0, 8388608
%35 = icmp eq i32 %34, 0
br i1 %35, label %36, label %39
36: ; preds = %33
%37 = and i32 %0, 131071
%38 = add nuw nsw i32 %37, 2
br label %50
39: ; preds = %33
%40 = and i32 %0, 131072
%41 = icmp eq i32 %40, 0
br i1 %41, label %50, label %42
42: ; preds = %39
%43 = and i32 %0, 65535
%44 = icmp eq i32 %43, 0
br i1 %44, label %50, label %45
45: ; preds = %42
%46 = add nuw nsw i32 %43, 1
%47 = lshr i32 %46, 1
%48 = add nuw nsw i32 %47, 1
br label %50
49: ; preds = %14
br label %50
50: ; preds = %1, %39, %42, %27, %14, %10, %3, %49, %45, %36, %30, %24, %21, %18, %7
%51 = phi i32 [ 0, %49 ], [ %38, %36 ], [ %48, %45 ], [ %32, %30 ], [ %26, %24 ], [ %23, %21 ], [ %20, %18 ], [ %9, %7 ], [ %6, %3 ], [ 1, %10 ], [ 1, %14 ], [ 1, %27 ], [ 0, %42 ], [ 2, %39 ], [ 0, %1 ]
ret i32 %51
}