int valid_ea(unsigned int opcode, unsigned int mask) {
  if (mask == 0)
    return 1;
  switch (opcode & 0x3f) {
  case 0x00:
  case 0x01:
  case 0x02:
  case 0x03:
  case 0x04:
  case 0x05:
  case 0x06:
  case 0x07:
    return (mask & 0x800) != 0;
  case 0x08:
  case 0x09:
  case 0x0a:
  case 0x0b:
  case 0x0c:
  case 0x0d:
  case 0x0e:
  case 0x0f:
    return (mask & 0x400) != 0;
  case 0x10:
  case 0x11:
  case 0x12:
  case 0x13:
  case 0x14:
  case 0x15:
  case 0x16:
  case 0x17:
    return (mask & 0x200) != 0;
  case 0x18:
  case 0x19:
  case 0x1a:
  case 0x1b:
  case 0x1c:
  case 0x1d:
  case 0x1e:
  case 0x1f:
    return (mask & 0x100) != 0;
  case 0x20:
  case 0x21:
  case 0x22:
  case 0x23:
  case 0x24:
  case 0x25:
  case 0x26:
  case 0x27:
    return (mask & 0x080) != 0;
  case 0x28:
  case 0x29:
  case 0x2a:
  case 0x2b:
  case 0x2c:
  case 0x2d:
  case 0x2e:
  case 0x2f:
    return (mask & 0x040) != 0;
  case 0x30:
  case 0x31:
  case 0x32:
  case 0x33:
  case 0x34:
  case 0x35:
  case 0x36:
  case 0x37:
    return (mask & 0x020) != 0;
  case 0x38:
    return (mask & 0x010) != 0;
  case 0x39:
    return (mask & 0x008) != 0;
  case 0x3a:
    return (mask & 0x002) != 0;
  case 0x3b:
    return (mask & 0x001) != 0;
  case 0x3c:
    return (mask & 0x004) != 0;
  }
  return 0;
}


x86 assembly (clang, -O0):
<valid_ea>:
push   %rbp
mov    %rsp,%rbp
mov    %edi,-0x8(%rbp)
mov    %esi,-0xc(%rbp)
cmpl   $0x0,-0xc(%rbp)
jne    1120 <valid_ea+0x20>
movl   $0x1,-0x4(%rbp)
jmp    1284 <valid_ea+0x184>
mov    -0x8(%rbp),%eax
and    $0x3f,%eax
mov    %rax,-0x18(%rbp)
sub    $0x3c,%eax
ja     127d <valid_ea+0x17d>
mov    -0x18(%rbp),%rax
lea    0xec2(%rip),%rcx
movslq (%rcx,%rax,4),%rax
add    %rcx,%rax
jmp    *%rax
mov    -0xc(%rbp),%eax
and    $0x800,%eax
cmp    $0x0,%eax
setne  %al
and    $0x1,%al
movzbl %al,%eax
mov    %eax,-0x4(%rbp)
jmp    1284 <valid_ea+0x184>
mov    -0xc(%rbp),%eax
and    $0x400,%eax
cmp    $0x0,%eax
setne  %al
and    $0x1,%al
movzbl %al,%eax
mov    %eax,-0x4(%rbp)
jmp    1284 <valid_ea+0x184>
mov    -0xc(%rbp),%eax
and    $0x200,%eax
cmp    $0x0,%eax
setne  %al
and    $0x1,%al
movzbl %al,%eax
mov    %eax,-0x4(%rbp)
jmp    1284 <valid_ea+0x184>
mov    -0xc(%rbp),%eax
and    $0x100,%eax
cmp    $0x0,%eax
setne  %al
and    $0x1,%al
movzbl %al,%eax
mov    %eax,-0x4(%rbp)
jmp    1284 <valid_ea+0x184>
mov    -0xc(%rbp),%eax
and    $0x80,%eax
cmp    $0x0,%eax
setne  %al
and    $0x1,%al
movzbl %al,%eax
mov    %eax,-0x4(%rbp)
jmp    1284 <valid_ea+0x184>
mov    -0xc(%rbp),%eax
and    $0x40,%eax
cmp    $0x0,%eax
setne  %al
and    $0x1,%al
movzbl %al,%eax
mov    %eax,-0x4(%rbp)
jmp    1284 <valid_ea+0x184>
mov    -0xc(%rbp),%eax
and    $0x20,%eax
cmp    $0x0,%eax
setne  %al
and    $0x1,%al
movzbl %al,%eax
mov    %eax,-0x4(%rbp)
jmp    1284 <valid_ea+0x184>
mov    -0xc(%rbp),%eax
and    $0x10,%eax
cmp    $0x0,%eax
setne  %al
and    $0x1,%al
movzbl %al,%eax
mov    %eax,-0x4(%rbp)
jmp    1284 <valid_ea+0x184>
mov    -0xc(%rbp),%eax
and    $0x8,%eax
cmp    $0x0,%eax
setne  %al
and    $0x1,%al
movzbl %al,%eax
mov    %eax,-0x4(%rbp)
jmp    1284 <valid_ea+0x184>
mov    -0xc(%rbp),%eax
and    $0x2,%eax
cmp    $0x0,%eax
setne  %al
and    $0x1,%al
movzbl %al,%eax
mov    %eax,-0x4(%rbp)
jmp    1284 <valid_ea+0x184>
mov    -0xc(%rbp),%eax
and    $0x1,%eax
cmp    $0x0,%eax
setne  %al
and    $0x1,%al
movzbl %al,%eax
mov    %eax,-0x4(%rbp)
jmp    1284 <valid_ea+0x184>
mov    -0xc(%rbp),%eax
and    $0x4,%eax
cmp    $0x0,%eax
setne  %al
and    $0x1,%al
movzbl %al,%eax
mov    %eax,-0x4(%rbp)
jmp    1284 <valid_ea+0x184>
movl   $0x0,-0x4(%rbp)
mov    -0x4(%rbp),%eax
pop    %rbp
ret

x86 assembly (clang, -O2):
<valid_ea>:
test   %esi,%esi
je     1125 <valid_ea+0x25>
and    $0x3f,%edi
cmp    $0x3c,%edi
ja     1155 <valid_ea+0x55>
mov    %esi,%eax
lea    0xeeb(%rip),%rcx
movslq (%rcx,%rdi,4),%rdx
add    %rcx,%rdx
jmp    *%rdx
shr    $0xb,%eax
and    $0x1,%eax
ret
mov    $0x1,%eax
ret
shr    $0xa,%eax
and    $0x1,%eax
ret
shr    $0x9,%eax
and    $0x1,%eax
ret
shr    $0x8,%eax
and    $0x1,%eax
ret
shr    $0x7,%eax
and    $0x1,%eax
ret
shr    $0x6,%eax
and    $0x1,%eax
ret
shr    $0x5,%eax
and    $0x1,%eax
ret
xor    %eax,%eax
ret
shr    $0x4,%eax
and    $0x1,%eax
ret
shr    %eax
and    $0x1,%eax
ret
shr    $0x2,%eax
and    $0x1,%eax
ret
shr    $0x3,%eax
and    $0x1,%eax
ret

LLVM IR (-O0):
define i32 @valid_ea(i32 %0, i32 %1) {
%3 = alloca i32
%4 = alloca i32
%5 = alloca i32
store i32 %0, i32* %4
store i32 %1, i32* %5
%6 = load i32, i32* %5
%7 = icmp eq i32 %6, 0
br i1 %7, label %8, label %9
8: ; preds = %2
store i32 1, i32* %3
br label %73
9: ; preds = %2
%10 = load i32, i32* %4
%11 = and i32 %10, 63
switch i32 %11, label %72 [
i32 0, label %12
i32 1, label %12
i32 2, label %12
i32 3, label %12
i32 4, label %12
i32 5, label %12
i32 6, label %12
i32 7, label %12
i32 8, label %17
i32 9, label %17
i32 10, label %17
i32 11, label %17
i32 12, label %17
i32 13, label %17
i32 14, label %17
i32 15, label %17
i32 16, label %22
i32 17, label %22
i32 18, label %22
i32 19, label %22
i32 20, label %22
i32 21, label %22
i32 22, label %22
i32 23, label %22
i32 24, label %27
i32 25, label %27
i32 26, label %27
i32 27, label %27
i32 28, label %27
i32 29, label %27
i32 30, label %27
i32 31, label %27
i32 32, label %32
i32 33, label %32
i32 34, label %32
i32 35, label %32
i32 36, label %32
i32 37, label %32
i32 38, label %32
i32 39, label %32
i32 40, label %37
i32 41, label %37
i32 42, label %37
i32 43, label %37
i32 44, label %37
i32 45, label %37
i32 46, label %37
i32 47, label %37
i32 48, label %42
i32 49, label %42
i32 50, label %42
i32 51, label %42
i32 52, label %42
i32 53, label %42
i32 54, label %42
i32 55, label %42
i32 56, label %47
i32 57, label %52
i32 58, label %57
i32 59, label %62
i32 60, label %67
]
12: ; preds = %9, %9, %9, %9, %9, %9, %9, %9
%13 = load i32, i32* %5
%14 = and i32 %13, 2048
%15 = icmp ne i32 %14, 0
%16 = zext i1 %15 to i32
store i32 %16, i32* %3
br label %73
17: ; preds = %9, %9, %9, %9, %9, %9, %9, %9
%18 = load i32, i32* %5
%19 = and i32 %18, 1024
%20 = icmp ne i32 %19, 0
%21 = zext i1 %20 to i32
store i32 %21, i32* %3
br label %73
22: ; preds = %9, %9, %9, %9, %9, %9, %9, %9
%23 = load i32, i32* %5
%24 = and i32 %23, 512
%25 = icmp ne i32 %24, 0
%26 = zext i1 %25 to i32
store i32 %26, i32* %3
br label %73
27: ; preds = %9, %9, %9, %9, %9, %9, %9, %9
%28 = load i32, i32* %5
%29 = and i32 %28, 256
%30 = icmp ne i32 %29, 0
%31 = zext i1 %30 to i32
store i32 %31, i32* %3
br label %73
32: ; preds = %9, %9, %9, %9, %9, %9, %9, %9
%33 = load i32, i32* %5
%34 = and i32 %33, 128
%35 = icmp ne i32 %34, 0
%36 = zext i1 %35 to i32
store i32 %36, i32* %3
br label %73
37: ; preds = %9, %9, %9, %9, %9, %9, %9, %9
%38 = load i32, i32* %5
%39 = and i32 %38, 64
%40 = icmp ne i32 %39, 0
%41 = zext i1 %40 to i32
store i32 %41, i32* %3
br label %73
42: ; preds = %9, %9, %9, %9, %9, %9, %9, %9
%43 = load i32, i32* %5
%44 = and i32 %43, 32
%45 = icmp ne i32 %44, 0
%46 = zext i1 %45 to i32
store i32 %46, i32* %3
br label %73
47: ; preds = %9
%48 = load i32, i32* %5
%49 = and i32 %48, 16
%50 = icmp ne i32 %49, 0
%51 = zext i1 %50 to i32
store i32 %51, i32* %3
br label %73
52: ; preds = %9
%53 = load i32, i32* %5
%54 = and i32 %53, 8
%55 = icmp ne i32 %54, 0
%56 = zext i1 %55 to i32
store i32 %56, i32* %3
br label %73
57: ; preds = %9
%58 = load i32, i32* %5
%59 = and i32 %58, 2
%60 = icmp ne i32 %59, 0
%61 = zext i1 %60 to i32
store i32 %61, i32* %3
br label %73
62: ; preds = %9
%63 = load i32, i32* %5
%64 = and i32 %63, 1
%65 = icmp ne i32 %64, 0
%66 = zext i1 %65 to i32
store i32 %66, i32* %3
br label %73
67: ; preds = %9
%68 = load i32, i32* %5
%69 = and i32 %68, 4
%70 = icmp ne i32 %69, 0
%71 = zext i1 %70 to i32
store i32 %71, i32* %3
br label %73
72: ; preds = %9
store i32 0, i32* %3
br label %73
73: ; preds = %72, %67, %62, %57, %52, %47, %42, %37, %32, %27, %22, %17, %12, %8
%74 = load i32, i32* %3
ret i32 %74
}

LLVM IR (-O2):
define i32 @valid_ea(i32 %0, i32 %1) {
%3 = icmp eq i32 %1, 0
br i1 %3, label %41, label %4
4: ; preds = %2
%5 = and i32 %0, 63
switch i32 %5, label %41 [
i32 0, label %6
i32 1, label %6
i32 2, label %6
i32 3, label %6
i32 4, label %6
i32 5, label %6
i32 6, label %6
i32 7, label %6
i32 8, label %9
i32 9, label %9
i32 10, label %9
i32 11, label %9
i32 12, label %9
i32 13, label %9
i32 14, label %9
i32 15, label %9
i32 16, label %12
i32 17, label %12
i32 18, label %12
i32 19, label %12
i32 20, label %12
i32 21, label %12
i32 22, label %12
i32 23, label %12
i32 24, label %15
i32 25, label %15
i32 26, label %15
i32 27, label %15
i32 28, label %15
i32 29, label %15
i32 30, label %15
i32 31, label %15
i32 32, label %18
i32 33, label %18
i32 34, label %18
i32 35, label %18
i32 36, label %18
i32 37, label %18
i32 38, label %18
i32 39, label %18
i32 40, label %21
i32 41, label %21
i32 42, label %21
i32 43, label %21
i32 44, label %21
i32 45, label %21
i32 46, label %21
i32 47, label %21
i32 48, label %24
i32 49, label %24
i32 50, label %24
i32 51, label %24
i32 52, label %24
i32 53, label %24
i32 54, label %24
i32 55, label %24
i32 56, label %27
i32 57, label %30
i32 58, label %33
i32 59, label %36
i32 60, label %38
]
6: ; preds = %4, %4, %4, %4, %4, %4, %4, %4
%7 = lshr i32 %1, 11
%8 = and i32 %7, 1
br label %41
9: ; preds = %4, %4, %4, %4, %4, %4, %4, %4
%10 = lshr i32 %1, 10
%11 = and i32 %10, 1
br label %41
12: ; preds = %4, %4, %4, %4, %4, %4, %4, %4
%13 = lshr i32 %1, 9
%14 = and i32 %13, 1
br label %41
15: ; preds = %4, %4, %4, %4, %4, %4, %4, %4
%16 = lshr i32 %1, 8
%17 = and i32 %16, 1
br label %41
18: ; preds = %4, %4, %4, %4, %4, %4, %4, %4
%19 = lshr i32 %1, 7
%20 = and i32 %19, 1
br label %41
21: ; preds = %4, %4, %4, %4, %4, %4, %4, %4
%22 = lshr i32 %1, 6
%23 = and i32 %22, 1
br label %41
24: ; preds = %4, %4, %4, %4, %4, %4, %4, %4
%25 = lshr i32 %1, 5
%26 = and i32 %25, 1
br label %41
27: ; preds = %4
%28 = lshr i32 %1, 4
%29 = and i32 %28, 1
br label %41
30: ; preds = %4
%31 = lshr i32 %1, 3
%32 = and i32 %31, 1
br label %41
33: ; preds = %4
%34 = lshr i32 %1, 1
%35 = and i32 %34, 1
br label %41
36: ; preds = %4
%37 = and i32 %1, 1
br label %41
38: ; preds = %4
%39 = lshr i32 %1, 2
%40 = and i32 %39, 1
br label %41
41: ; preds = %4, %2, %38, %36, %33, %30, %27, %24, %21, %18, %15, %12, %9, %6
%42 = phi i32 [ %40, %38 ], [ %37, %36 ], [ %35, %33 ], [ %32, %30 ], [ %29, %27 ], [ %26, %24 ], [ %23, %21 ], [ %20, %18 ], [ %17, %15 ], [ %14, %12 ], [ %11, %9 ], [ %8, %6 ], [ 1, %2 ], [ 0, %4 ]
ret i32 %42
}