char bfd_hppa_insn2fmt(insn)
unsigned long insn;
{
  char fmt = -1;
  unsigned char op = ((insn)&0xfc000000) >> 26;
  switch (op) {
  case 0x2d:
  case 0x2c:
  case 0x25:
    fmt = 11;
    break;
  case 0x32:
  case 0x33:
  case 0x20:
  case 0x22:
  case 0x21:
  case 0x23:
  case 0x28:
  case 0x2a:
  case 0x29:
  case 0x2b:
  case 0x30:
  case 0x31:
    fmt = 12;
    break;
  case 0x0d:
  case 0x10:
  case 0x11:
  case 0x12:
  case 0x13:
  case 0x18:
  case 0x19:
  case 0x1a:
  case 0x1b:
    fmt = 14;
    break;
  case 0x3a:
  case 0x38:
  case 0x39:
    fmt = 17;
    break;
  case 0x08:
  case 0x0a:
    fmt = 21;
    break;
  default:
    fmt = 32;
    break;
  }
  return fmt;
}


x86 assembly (clang, -O0):
<bfd_hppa_insn2fmt>:
push   %rbp
mov    %rsp,%rbp
mov    %rdi,-0x8(%rbp)
movb   $0xff,-0x9(%rbp)
mov    -0x8(%rbp),%eax
shr    $0x1a,%rax
mov    %al,-0xa(%rbp)
movzbl -0xa(%rbp),%eax
add    $0xfffffff8,%eax
mov    %eax,%ecx
mov    %rcx,-0x18(%rbp)
sub    $0x32,%eax
ja     116d <bfd_hppa_insn2fmt+0x6d>
mov    -0x18(%rbp),%rax
lea    0xec9(%rip),%rcx
movslq (%rcx,%rax,4),%rax
add    %rcx,%rax
jmp    *%rax
movb   $0xb,-0x9(%rbp)
jmp    1171 <bfd_hppa_insn2fmt+0x71>
movb   $0xc,-0x9(%rbp)
jmp    1171 <bfd_hppa_insn2fmt+0x71>
movb   $0xe,-0x9(%rbp)
jmp    1171 <bfd_hppa_insn2fmt+0x71>
movb   $0x11,-0x9(%rbp)
jmp    1171 <bfd_hppa_insn2fmt+0x71>
movb   $0x15,-0x9(%rbp)
jmp    1171 <bfd_hppa_insn2fmt+0x71>
movb   $0x20,-0x9(%rbp)
movsbl -0x9(%rbp),%eax
pop    %rbp
ret

x86 assembly (clang, -O2):
<bfd_hppa_insn2fmt>:
shr    $0x1a,%edi
add    $0xfffffffffffffff8,%rdi
mov    $0x20,%al
cmp    $0x32,%edi
ja     1118 <bfd_hppa_insn2fmt+0x18>
lea    0xeeb(%rip),%rax
mov    (%rdi,%rax,1),%al
ret

LLVM IR (-O0):
define signext i8 @bfd_hppa_insn2fmt(i64 %0) {
%2 = alloca i64
%3 = alloca i8
%4 = alloca i8
store i64 %0, i64* %2
store i8 -1, i8* %3
%5 = load i64, i64* %2
%6 = and i64 %5, 4227858432
%7 = lshr i64 %6, 26
%8 = trunc i64 %7 to i8
store i8 %8, i8* %4
%9 = load i8, i8* %4
%10 = zext i8 %9 to i32
switch i32 %10, label %16 [
i32 45, label %11
i32 44, label %11
i32 37, label %11
i32 50, label %12
i32 51, label %12
i32 32, label %12
i32 34, label %12
i32 33, label %12
i32 35, label %12
i32 40, label %12
i32 42, label %12
i32 41, label %12
i32 43, label %12
i32 48, label %12
i32 49, label %12
i32 13, label %13
i32 16, label %13
i32 17, label %13
i32 18, label %13
i32 19, label %13
i32 24, label %13
i32 25, label %13
i32 26, label %13
i32 27, label %13
i32 58, label %14
i32 56, label %14
i32 57, label %14
i32 8, label %15
i32 10, label %15
]
11: ; preds = %1, %1, %1
store i8 11, i8* %3
br label %17
12: ; preds = %1, %1, %1, %1, %1, %1, %1, %1, %1, %1, %1, %1
store i8 12, i8* %3
br label %17
13: ; preds = %1, %1, %1, %1, %1, %1, %1, %1, %1
store i8 14, i8* %3
br label %17
14: ; preds = %1, %1, %1
store i8 17, i8* %3
br label %17
15: ; preds = %1, %1
store i8 21, i8* %3
br label %17
16: ; preds = %1
store i8 32, i8* %3
br label %17
17: ; preds = %16, %15, %14, %13, %12, %11
%18 = load i8, i8* %3
ret i8 %18
}

LLVM IR (-O2):
@switch.table.bfd_hppa_insn2fmt = [51 x i8] c"\15 \15 \0E \0E\0E\0E\0E \0E\0E\0E\0E \0C\0C\0C\0C \0B \0C\0C\0C\0C\0B\0B \0C\0C\0C\0C \11\11\11"
define signext i8 @bfd_hppa_insn2fmt(i64 %0) {
%2 = trunc i64 %0 to i32
%3 = lshr i32 %2, 26
%4 = add nsw i32 %3, -8
%5 = icmp ult i32 %4, 51
br i1 %5, label %6, label %10
6: ; preds = %1
%7 = sext i32 %4 to i64
%8 = getelementptr inbounds [51 x i8], [51 x i8]* @switch.table.bfd_hppa_insn2fmt, i64 0, i64 %7
%9 = load i8, i8* %8
br label %10
10: ; preds = %1, %6
%11 = phi i8 [ %9, %6 ], [ 32, %1 ]
ret i8 %11
}