#define NULL ((void *)0)
typedef unsigned long size_t; // Customize by platform.
typedef long intptr_t;
typedef unsigned long uintptr_t;
typedef long scalar_t__; // Either arithmetic or pointer type.
/* By default, we understand bool (as a convenience). */
typedef int bool;
#define false 0
#define true 1

/* Forward declarations */

/* Type definitions */
typedef int uint16_t;
typedef int op;

/* Variables and functions */
const char *opcode_get_name(uint16_t op) {
  const char *name = "?";
  if (op == 0x00E0) {
    name = "CLS";
  } else if (op == 0x00EE) {
    name = "RET";
  } else if ((((op)&0xF000) >> 12) == 0x0) {
    name = "SYS";
  } else if ((((op)&0xF000) >> 12) == 0x1) {
    name = "JMP";
  } else if ((((op)&0xF000) >> 12) == 0x2) {
    name = "CALL";
  } else if ((((op)&0xF000) >> 12) == 0x3 || (((op)&0xF000) >> 12) == 0x5) {
    name = "SE";
  } else if ((((op)&0xF000) >> 12) == 0x4 || (op & 0xF00F) == 0x9000) {
    name = "SNE";
  } else if ((((op)&0xF000) >> 12) == 0x6 || (op & 0xF00F) == 0x8000 ||
             (op & 0xF0FF) == 0xF007 || (op & 0xF0FF) == 0xF00A ||
             (op & 0xF0FF) == 0xF015 || (op & 0xF0FF) == 0xF018 ||
             (op & 0xF0FF) == 0xF029 || (op & 0xF0FF) == 0xF033) {
    name = "LD";
  } else if ((((op)&0xF000) >> 12) == 0x7 || (op & 0xF00F) == 0x8004) {
    name = "ADD";
  } else if ((op & 0xF00F) == 0x8001) {
    name = "OR";
  } else if ((op & 0xF00F) == 0x8002) {
    name = "AND";
  } else if ((op & 0xF00F) == 0x8003) {
    name = "XOR";
  } else if ((op & 0xF00F) == 0x8005) {
    name = "SUB";
  } else if ((op & 0xF00F) == 0x8006) {
    name = "SHR";
  } else if ((op & 0xF00F) == 0x8007) {
    name = "SUBN";
  } else if ((op & 0xF00F) == 0x800E) {
    name = "SHL";
  } else if ((((op)&0xF000) >> 12) == 0xA) {
    name = "LDI";
  } else if ((((op)&0xF000) >> 12) == 0xB) {
    name = "JPO";
  } else if ((((op)&0xF000) >> 12) == 0xC) {
    name = "RND";
  } else if ((((op)&0xF000) >> 12) == 0xD) {
    name = "DRW";
  } else if ((op & 0xF0FF) == 0xE09E) {
    name = "SKP";
  } else if ((op & 0xF0FF) == 0xE0A1) {
    name = "SKNP";
  } else if ((op & 0xF0FF) == 0xF01E) {
    name = "ADDI";
  } else if ((op & 0xF0FF) == 0xF055) {
    name = "SAVE";
  } else if ((op & 0xF0FF) == 0xF065) {
    name = "REST";
  }
  return name;
}


x86 assembly (clang, -O0):
<opcode_get_name>:
push   %rbp
mov    %rsp,%rbp
mov    %edi,-0x4(%rbp)
lea    0xef2(%rip),%rax
mov    %rax,-0x10(%rbp)
cmpl   $0xe0,-0x4(%rbp)
jne    112f <opcode_get_name+0x2f>
lea    0xedc(%rip),%rax
mov    %rax,-0x10(%rbp)
jmp    15ae <opcode_get_name+0x4ae>
cmpl   $0xee,-0x4(%rbp)
jne    114c <opcode_get_name+0x4c>
lea    0xec3(%rip),%rax
mov    %rax,-0x10(%rbp)
jmp    15a9 <opcode_get_name+0x4a9>
mov    -0x4(%rbp),%eax
and    $0xf000,%eax
sar    $0xc,%eax
cmp    $0x0,%eax
jne    1170 <opcode_get_name+0x70>
lea    0xea3(%rip),%rax
mov    %rax,-0x10(%rbp)
jmp    15a4 <opcode_get_name+0x4a4>
mov    -0x4(%rbp),%eax
and    $0xf000,%eax
sar    $0xc,%eax
cmp    $0x1,%eax
jne    1194 <opcode_get_name+0x94>
lea    0xe83(%rip),%rax
mov    %rax,-0x10(%rbp)
jmp    159f <opcode_get_name+0x49f>
mov    -0x4(%rbp),%eax
and    $0xf000,%eax
sar    $0xc,%eax
cmp    $0x2,%eax
jne    11b8 <opcode_get_name+0xb8>
lea    0xe63(%rip),%rax
mov    %rax,-0x10(%rbp)
jmp    159a <opcode_get_name+0x49a>
mov    -0x4(%rbp),%eax
and    $0xf000,%eax
sar    $0xc,%eax
cmp    $0x3,%eax
je     11e0 <opcode_get_name+0xe0>
mov    -0x4(%rbp),%eax
and    $0xf000,%eax
sar    $0xc,%eax
cmp    $0x5,%eax
jne    11f0 <opcode_get_name+0xf0>
lea    0xe30(%rip),%rax
mov    %rax,-0x10(%rbp)
jmp    1595 <opcode_get_name+0x495>
mov    -0x4(%rbp),%eax
and    $0xf000,%eax
sar    $0xc,%eax
cmp    $0x4,%eax
je     1217 <opcode_get_name+0x117>
mov    -0x4(%rbp),%eax
and    $0xf00f,%eax
cmp    $0x9000,%eax
jne    1227 <opcode_get_name+0x127>
lea    0xdfc(%rip),%rax
mov    %rax,-0x10(%rbp)
jmp    1590 <opcode_get_name+0x490>
mov    -0x4(%rbp),%eax
and    $0xf000,%eax
sar    $0xc,%eax
cmp    $0x6,%eax
je     12c0 <opcode_get_name+0x1c0>
mov    -0x4(%rbp),%eax
and    $0xf00f,%eax
cmp    $0x8000,%eax
je     12c0 <opcode_get_name+0x1c0>
mov    -0x4(%rbp),%eax
and    $0xf0ff,%eax
cmp    $0xf007,%eax
je     12c0 <opcode_get_name+0x1c0>
mov    -0x4(%rbp),%eax
and    $0xf0ff,%eax
cmp    $0xf00a,%eax
je     12c0 <opcode_get_name+0x1c0>
mov    -0x4(%rbp),%eax
and    $0xf0ff,%eax
cmp    $0xf015,%eax
je     12c0 <opcode_get_name+0x1c0>
mov    -0x4(%rbp),%eax
and    $0xf0ff,%eax
cmp    $0xf018,%eax
je     12c0 <opcode_get_name+0x1c0>
mov    -0x4(%rbp),%eax
and    $0xf0ff,%eax
cmp    $0xf029,%eax
je     12c0 <opcode_get_name+0x1c0>
mov    -0x4(%rbp),%eax
and    $0xf0ff,%eax
cmp    $0xf033,%eax
jne    12d0 <opcode_get_name+0x1d0>
lea    0xd57(%rip),%rax
mov    %rax,-0x10(%rbp)
jmp    158b <opcode_get_name+0x48b>
mov    -0x4(%rbp),%eax
and    $0xf000,%eax
sar    $0xc,%eax
cmp    $0x7,%eax
je     12f7 <opcode_get_name+0x1f7>
mov    -0x4(%rbp),%eax
and    $0xf00f,%eax
cmp    $0x8004,%eax
jne    1307 <opcode_get_name+0x207>
lea    0xd23(%rip),%rax
mov    %rax,-0x10(%rbp)
jmp    1586 <opcode_get_name+0x486>
mov    -0x4(%rbp),%eax
and    $0xf00f,%eax
cmp    $0x8001,%eax
jne    132a <opcode_get_name+0x22a>
lea    0xd09(%rip),%rax
mov    %rax,-0x10(%rbp)
jmp    1581 <opcode_get_name+0x481>
mov    -0x4(%rbp),%eax
and    $0xf00f,%eax
cmp    $0x8002,%eax
jne    134d <opcode_get_name+0x24d>
lea    0xce1(%rip),%rax
mov    %rax,-0x10(%rbp)
jmp    157c <opcode_get_name+0x47c>
mov    -0x4(%rbp),%eax
and    $0xf00f,%eax
cmp    $0x8003,%eax
jne    1370 <opcode_get_name+0x270>
lea    0xcc2(%rip),%rax
mov    %rax,-0x10(%rbp)
jmp    1577 <opcode_get_name+0x477>
mov    -0x4(%rbp),%eax
and    $0xf00f,%eax
cmp    $0x8005,%eax
jne    1393 <opcode_get_name+0x293>
lea    0xca3(%rip),%rax
mov    %rax,-0x10(%rbp)
jmp    1572 <opcode_get_name+0x472>
mov    -0x4(%rbp),%eax
and    $0xf00f,%eax
cmp    $0x8006,%eax
jne    13b6 <opcode_get_name+0x2b6>
lea    0xc84(%rip),%rax
mov    %rax,-0x10(%rbp)
jmp    156d <opcode_get_name+0x46d>
mov    -0x4(%rbp),%eax
and    $0xf00f,%eax
cmp    $0x8007,%eax
jne    13d9 <opcode_get_name+0x2d9>
lea    0xc65(%rip),%rax
mov    %rax,-0x10(%rbp)
jmp    1568 <opcode_get_name+0x468>
mov    -0x4(%rbp),%eax
and    $0xf00f,%eax
cmp    $0x800e,%eax
jne    13fc <opcode_get_name+0x2fc>
lea    0xc47(%rip),%rax
mov    %rax,-0x10(%rbp)
jmp    1563 <opcode_get_name+0x463>
mov    -0x4(%rbp),%eax
and    $0xf000,%eax
sar    $0xc,%eax
cmp    $0xa,%eax
jne    1420 <opcode_get_name+0x320>
lea    0xc27(%rip),%rax
mov    %rax,-0x10(%rbp)
jmp    155e <opcode_get_name+0x45e>
mov    -0x4(%rbp),%eax
and    $0xf000,%eax
sar    $0xc,%eax
cmp    $0xb,%eax
jne    1444 <opcode_get_name+0x344>
lea    0xc07(%rip),%rax
mov    %rax,-0x10(%rbp)
jmp    1559 <opcode_get_name+0x459>
mov    -0x4(%rbp),%eax
and    $0xf000,%eax
sar    $0xc,%eax
cmp    $0xc,%eax
jne    1468 <opcode_get_name+0x368>
lea    0xbe7(%rip),%rax
mov    %rax,-0x10(%rbp)
jmp    1554 <opcode_get_name+0x454>
mov    -0x4(%rbp),%eax
and    $0xf000,%eax
sar    $0xc,%eax
cmp    $0xd,%eax
jne    148c <opcode_get_name+0x38c>
lea    0xbc7(%rip),%rax
mov    %rax,-0x10(%rbp)
jmp    154f <opcode_get_name+0x44f>
mov    -0x4(%rbp),%eax
and    $0xf0ff,%eax
cmp    $0xe09e,%eax
jne    14af <opcode_get_name+0x3af>
lea    0xba8(%rip),%rax
mov    %rax,-0x10(%rbp)
jmp    154a <opcode_get_name+0x44a>
mov    -0x4(%rbp),%eax
and    $0xf0ff,%eax
cmp    $0xe0a1,%eax
jne    14d2 <opcode_get_name+0x3d2>
lea    0xb89(%rip),%rax
mov    %rax,-0x10(%rbp)
jmp    1545 <opcode_get_name+0x445>
mov    -0x4(%rbp),%eax
and    $0xf0ff,%eax
cmp    $0xf01e,%eax
jne    14f5 <opcode_get_name+0x3f5>
lea    0xb6b(%rip),%rax
mov    %rax,-0x10(%rbp)
jmp    1540 <opcode_get_name+0x440>
mov    -0x4(%rbp),%eax
and    $0xf0ff,%eax
cmp    $0xf055,%eax
jne    1518 <opcode_get_name+0x418>
lea    0xb4d(%rip),%rax
mov    %rax,-0x10(%rbp)
jmp    153b <opcode_get_name+0x43b>
mov    -0x4(%rbp),%eax
and    $0xf0ff,%eax
cmp    $0xf065,%eax
jne    1536 <opcode_get_name+0x436>
lea    0xb2f(%rip),%rax
mov    %rax,-0x10(%rbp)
jmp    153b <opcode_get_name+0x43b>
jmp    1540 <opcode_get_name+0x440>
jmp    1545 <opcode_get_name+0x445>
jmp    154a <opcode_get_name+0x44a>
jmp    154f <opcode_get_name+0x44f>
jmp    1554 <opcode_get_name+0x454>
jmp    1559 <opcode_get_name+0x459>
jmp    155e <opcode_get_name+0x45e>
jmp    1563 <opcode_get_name+0x463>
jmp    1568 <opcode_get_name+0x468>
jmp    156d <opcode_get_name+0x46d>
jmp    1572 <opcode_get_name+0x472>
jmp    1577 <opcode_get_name+0x477>
jmp    157c <opcode_get_name+0x47c>
jmp    1581 <opcode_get_name+0x481>
jmp    1586 <opcode_get_name+0x486>
jmp    158b <opcode_get_name+0x48b>
jmp    1590 <opcode_get_name+0x490>
jmp    1595 <opcode_get_name+0x495>
jmp    159a <opcode_get_name+0x49a>
jmp    159f <opcode_get_name+0x49f>
jmp    15a4 <opcode_get_name+0x4a4>
jmp    15a9 <opcode_get_name+0x4a9>
jmp    15ae <opcode_get_name+0x4ae>
mov    -0x10(%rbp),%rax
pop    %rbp
ret

x86 assembly (clang, -O2):
<opcode_get_name>:
cmp    $0xe0,%edi
je     1118 <opcode_get_name+0x18>
cmp    $0xee,%edi
jne    1120 <opcode_get_name+0x20>
lea    0xeef(%rip),%rax
ret
lea    0xee3(%rip),%rax
ret
mov    %edi,%ecx
shr    $0xc,%ecx
and    $0xf,%ecx
cmp    $0x6,%ecx
jae    113e <opcode_get_name+0x3e>
mov    %ecx,%eax
lea    0xf32(%rip),%rcx
movslq (%rcx,%rax,4),%rax
add    %rcx,%rax
ret
mov    %edi,%edx
and    $0xf00f,%edx
cmp    $0x9000,%edx
jne    1156 <opcode_get_name+0x56>
lea    0xec5(%rip),%rax
ret
lea    0xec1(%rip),%rax
cmp    $0x8000,%edx
je     113d <opcode_get_name+0x3d>
cmp    $0x6,%ecx
je     113d <opcode_get_name+0x3d>
and    $0xfffff0ff,%edi
lea    0xff9(%rdi),%esi
cmp    $0x2c,%si
ja     1190 <opcode_get_name+0x90>
movzwl %si,%r8d
movabs $0x100400024009,%rsi
bt     %r8,%rsi
jb     113d <opcode_get_name+0x3d>
lea    0xe8a(%rip),%rax
cmp    $0x8004,%edx
je     113d <opcode_get_name+0x3d>
cmp    $0x7,%ecx
je     113d <opcode_get_name+0x3d>
add    $0x7fff,%edx
cmp    $0xe,%dx
jae    11ba <opcode_get_name+0xba>
mov    $0x2077,%eax
bt     %edx,%eax
jb     11fc <opcode_get_name+0xfc>
add    $0xfffffff6,%ecx
cmp    $0x4,%ecx
jae    11d1 <opcode_get_name+0xd1>
movslq %ecx,%rax
lea    0xeec(%rip),%rcx
jmp    1136 <opcode_get_name+0x36>
movswl %di,%ecx
movzwl %cx,%eax
cmp    $0xfffff01d,%ecx
jle    120c <opcode_get_name+0x10c>
cmp    $0xf01e,%eax
je     1222 <opcode_get_name+0x122>
cmp    $0xf055,%eax
je     122a <opcode_get_name+0x12a>
cmp    $0xf065,%eax
jne    123a <opcode_get_name+0x13a>
lea    0xe66(%rip),%rax
ret
movswq %dx,%rax
lea    0xe79(%rip),%rcx
jmp    1136 <opcode_get_name+0x36>
cmp    $0xe09e,%eax
je     1232 <opcode_get_name+0x132>
cmp    $0xe0a1,%eax
jne    123a <opcode_get_name+0x13a>
lea    0xe31(%rip),%rax
ret
lea    0xe2e(%rip),%rax
ret
lea    0xe2b(%rip),%rax
ret
lea    0xe15(%rip),%rax
ret
lea    0xdbf(%rip),%rax
ret

LLVM IR (-O0):
@.str = [2 x i8] c"?\00"
@.str.1 = [4 x i8] c"CLS\00"
@.str.2 = [4 x i8] c"RET\00"
@.str.3 = [4 x i8] c"SYS\00"
@.str.4 = [4 x i8] c"JMP\00"
@.str.5 = [5 x i8] c"CALL\00"
@.str.6 = [3 x i8] c"SE\00"
@.str.7 = [4 x i8] c"SNE\00"
@.str.8 = [3 x i8] c"LD\00"
@.str.9 = [4 x i8] c"ADD\00"
@.str.10 = [3 x i8] c"OR\00"
@.str.11 = [4 x i8] c"AND\00"
@.str.12 = [4 x i8] c"XOR\00"
@.str.13 = [4 x i8] c"SUB\00"
@.str.14 = [4 x i8] c"SHR\00"
@.str.15 = [5 x i8] c"SUBN\00"
@.str.16 = [4 x i8] c"SHL\00"
@.str.17 = [4 x i8] c"LDI\00"
@.str.18 = [4 x i8] c"JPO\00"
@.str.19 = [4 x i8] c"RND\00"
@.str.20 = [4 x i8] c"DRW\00"
@.str.21 = [4 x i8] c"SKP\00"
@.str.22 = [5 x i8] c"SKNP\00"
@.str.23 = [5 x i8] c"ADDI\00"
@.str.24 = [5 x i8] c"SAVE\00"
@.str.25 = [5 x i8] c"REST\00"
define i8* @opcode_get_name(i32 %0) {
%2 = alloca i32
%3 = alloca i8*
store i32 %0, i32* %2
store i8* getelementptr inbounds ([2 x i8], [2 x i8]* @.str, i64 0, i64 0), i8** %3
%4 = load i32, i32* %2
%5 = icmp eq i32 %4, 224
br i1 %5, label %6, label %7
6: ; preds = %1
store i8* getelementptr inbounds ([4 x i8], [4 x i8]* @.str.1, i64 0, i64 0), i8** %3
br label %202
7: ; preds = %1
%8 = load i32, i32* %2
%9 = icmp eq i32 %8, 238
br i1 %9, label %10, label %11
10: ; preds = %7
store i8* getelementptr inbounds ([4 x i8], [4 x i8]* @.str.2, i64 0, i64 0), i8** %3
br label %201
11: ; preds = %7
%12 = load i32, i32* %2
%13 = and i32 %12, 61440
%14 = ashr i32 %13, 12
%15 = icmp eq i32 %14, 0
br i1 %15, label %16, label %17
16: ; preds = %11
store i8* getelementptr inbounds ([4 x i8], [4 x i8]* @.str.3, i64 0, i64 0), i8** %3
br label %200
17: ; preds = %11
%18 = load i32, i32* %2
%19 = and i32 %18, 61440
%20 = ashr i32 %19, 12
%21 = icmp eq i32 %20, 1
br i1 %21, label %22, label %23
22: ; preds = %17
store i8* getelementptr inbounds ([4 x i8], [4 x i8]* @.str.4, i64 0, i64 0), i8** %3
br label %199
23: ; preds = %17
%24 = load i32, i32* %2
%25 = and i32 %24, 61440
%26 = ashr i32 %25, 12
%27 = icmp eq i32 %26, 2
br i1 %27, label %28, label %29
28: ; preds = %23
store i8* getelementptr inbounds ([5 x i8], [5 x i8]* @.str.5, i64 0, i64 0), i8** %3
br label %198
29: ; preds = %23
%30 = load i32, i32* %2
%31 = and i32 %30, 61440
%32 = ashr i32 %31, 12
%33 = icmp eq i32 %32, 3
br i1 %33, label %39, label %34
34: ; preds = %29
%35 = load i32, i32* %2
%36 = and i32 %35, 61440
%37 = ashr i32 %36, 12
%38 = icmp eq i32 %37, 5
br i1 %38, label %39, label %40
39: ; preds = %34, %29
store i8* getelementptr inbounds ([3 x i8], [3 x i8]* @.str.6, i64 0, i64 0), i8** %3
br label %197
40: ; preds = %34
%41 = load i32, i32* %2
%42 = and i32 %41, 61440
%43 = ashr i32 %42, 12
%44 = icmp eq i32 %43, 4
br i1 %44, label %49, label %45
45: ; preds = %40
%46 = load i32, i32* %2
%47 = and i32 %46, 61455
%48 = icmp eq i32 %47, 36864
br i1 %48, label %49, label %50
49: ; preds = %45, %40
store i8* getelementptr inbounds ([4 x i8], [4 x i8]* @.str.7, i64 0, i64 0), i8** %3
br label %196
50: ; preds = %45
%51 = load i32, i32* %2
%52 = and i32 %51, 61440
%53 = ashr i32 %52, 12
%54 = icmp eq i32 %53, 6
br i1 %54, label %83, label %55
55: ; preds = %50
%56 = load i32, i32* %2
%57 = and i32 %56, 61455
%58 = icmp eq i32 %57, 32768
br i1 %58, label %83, label %59
59: ; preds = %55
%60 = load i32, i32* %2
%61 = and i32 %60, 61695
%62 = icmp eq i32 %61, 61447
br i1 %62, label %83, label %63
63: ; preds = %59
%64 = load i32, i32* %2
%65 = and i32 %64, 61695
%66 = icmp eq i32 %65, 61450
br i1 %66, label %83, label %67
67: ; preds = %63
%68 = load i32, i32* %2
%69 = and i32 %68, 61695
%70 = icmp eq i32 %69, 61461
br i1 %70, label %83, label %71
71: ; preds = %67
%72 = load i32, i32* %2
%73 = and i32 %72, 61695
%74 = icmp eq i32 %73, 61464
br i1 %74, label %83, label %75
75: ; preds = %71
%76 = load i32, i32* %2
%77 = and i32 %76, 61695
%78 = icmp eq i32 %77, 61481
br i1 %78, label %83, label %79
79: ; preds = %75
%80 = load i32, i32* %2
%81 = and i32 %80, 61695
%82 = icmp eq i32 %81, 61491
br i1 %82, label %83, label %84
83: ; preds = %79, %75, %71, %67, %63, %59, %55, %50
store i8* getelementptr inbounds ([3 x i8], [3 x i8]* @.str.8, i64 0, i64 0), i8** %3
br label %195
84: ; preds = %79
%85 = load i32, i32* %2
%86 = and i32 %85, 61440
%87 = ashr i32 %86, 12
%88 = icmp eq i32 %87, 7
br i1 %88, label %93, label %89
89: ; preds = %84
%90 = load i32, i32* %2
%91 = and i32 %90, 61455
%92 = icmp eq i32 %91, 32772
br i1 %92, label %93, label %94
93: ; preds = %89, %84
store i8* getelementptr inbounds ([4 x i8], [4 x i8]* @.str.9, i64 0, i64 0), i8** %3
br label %194
94: ; preds = %89
%95 = load i32, i32* %2
%96 = and i32 %95, 61455
%97 = icmp eq i32 %96, 32769
br i1 %97, label %98, label %99
98: ; preds = %94
store i8* getelementptr inbounds ([3 x i8], [3 x i8]* @.str.10, i64 0, i64 0), i8** %3
br label %193
99: ; preds = %94
%100 = load i32, i32* %2
%101 = and i32 %100, 61455
%102 = icmp eq i32 %101, 32770
br i1 %102, label %103, label %104
103: ; preds = %99
store i8* getelementptr inbounds ([4 x i8], [4 x i8]* @.str.11, i64 0, i64 0), i8** %3
br label %192
104: ; preds = %99
%105 = load i32, i32* %2
%106 = and i32 %105, 61455
%107 = icmp eq i32 %106, 32771
br i1 %107, label %108, label %109
108: ; preds = %104
store i8* getelementptr inbounds ([4 x i8], [4 x i8]* @.str.12, i64 0, i64 0), i8** %3
br label %191
109: ; preds = %104
%110 = load i32, i32* %2
%111 = and i32 %110, 61455
%112 = icmp eq i32 %111, 32773
br i1 %112, label %113, label %114
113: ; preds = %109
store i8* getelementptr inbounds ([4 x i8], [4 x i8]* @.str.13, i64 0, i64 0), i8** %3
br label %190
114: ; preds = %109
%115 = load i32, i32* %2
%116 = and i32 %115, 61455
%117 = icmp eq i32 %116, 32774
br i1 %117, label %118, label %119
118: ; preds = %114
store i8* getelementptr inbounds ([4 x i8], [4 x i8]* @.str.14, i64 0, i64 0), i8** %3
br label %189
119: ; preds = %114
%120 = load i32, i32* %2
%121 = and i32 %120, 61455
%122 = icmp eq i32 %121, 32775
br i1 %122, label %123, label %124
123: ; preds = %119
store i8* getelementptr inbounds ([5 x i8], [5 x i8]* @.str.15, i64 0, i64 0), i8** %3
br label %188
124: ; preds = %119
%125 = load i32, i32* %2
%126 = and i32 %125, 61455
%127 = icmp eq i32 %126, 32782
br i1 %127, label %128, label %129
128: ; preds = %124
store i8* getelementptr inbounds ([4 x i8], [4 x i8]* @.str.16, i64 0, i64 0), i8** %3
br label %187
129: ; preds = %124
%130 = load i32, i32* %2
%131 = and i32 %130, 61440
%132 = ashr i32 %131, 12
%133 = icmp eq i32 %132, 10
br i1 %133, label %134, label %135
134: ; preds = %129
store i8* getelementptr inbounds ([4 x i8], [4 x i8]* @.str.17, i64 0, i64 0), i8** %3
br label %186
135: ; preds = %129
%136 = load i32, i32* %2
%137 = and i32 %136, 61440
%138 = ashr i32 %137, 12
%139 = icmp eq i32 %138, 11
br i1 %139, label %140, label %141
140: ; preds = %135
store i8* getelementptr inbounds ([4 x i8], [4 x i8]* @.str.18, i64 0, i64 0), i8** %3
br label %185
141: ; preds = %135
%142 = load i32, i32* %2
%143 = and i32 %142, 61440
%144 = ashr i32 %143, 12
%145 = icmp eq i32 %144, 12
br i1 %145, label %146, label %147
146: ; preds = %141
store i8* getelementptr inbounds ([4 x i8], [4 x i8]* @.str.19, i64 0, i64 0), i8** %3
br label %184
147: ; preds = %141
%148 = load i32, i32* %2
%149 = and i32 %148, 61440
%150 = ashr i32 %149, 12
%151 = icmp eq i32 %150, 13
br i1 %151, label %152, label %153
152: ; preds = %147
store i8* getelementptr inbounds ([4 x i8], [4 x i8]* @.str.20, i64 0, i64 0), i8** %3
br label %183
153: ; preds = %147
%154 = load i32, i32* %2
%155 = and i32 %154, 61695
%156 = icmp eq i32 %155, 57502
br i1 %156, label %157, label %158
157: ; preds = %153
store i8* getelementptr inbounds ([4 x i8], [4 x i8]* @.str.21, i64 0, i64 0), i8** %3
br label %182
158: ; preds = %153
%159 = load i32, i32* %2
%160 = and i32 %159, 61695
%161 = icmp eq i32 %160, 57505
br i1 %161, label %162, label %163
162: ; preds = %158
store i8* getelementptr inbounds ([5 x i8], [5 x i8]* @.str.22, i64 0, i64 0), i8** %3
br label %181
163: ; preds = %158
%164 = load i32, i32* %2
%165 = and i32 %164, 61695
%166 = icmp eq i32 %165, 61470
br i1 %166, label %167, label %168
167: ; preds = %163
store i8* getelementptr inbounds ([5 x i8], [5 x i8]* @.str.23, i64 0, i64 0), i8** %3
br label %180
168: ; preds = %163
%169 = load i32, i32* %2
%170 = and i32 %169, 61695
%171 = icmp eq i32 %170, 61525
br i1 %171, label %172, label %173
172: ; preds = %168
store i8* getelementptr inbounds ([5 x i8], [5 x i8]* @.str.24, i64 0, i64 0), i8** %3
br label %179
173: ; preds = %168
%174 = load i32, i32* %2
%175 = and i32 %174, 61695
%176 = icmp eq i32 %175, 61541
br i1 %176, label %177, label %178
177: ; preds = %173
store i8* getelementptr inbounds ([5 x i8], [5 x i8]* @.str.25, i64 0, i64 0), i8** %3
br label %178
178: ; preds = %177, %173
br label %179
179: ; preds = %178, %172
br label %180
180: ; preds = %179, %167
br label %181
181: ; preds = %180, %162
br label %182
182: ; preds = %181, %157
br label %183
183: ; preds = %182, %152
br label %184
184: ; preds = %183, %146
br label %185
185: ; preds = %184, %140
br label %186
186: ; preds = %185, %134
br label %187
187: ; preds = %186, %128
br label %188
188: ; preds = %187, %123
br label %189
189: ; preds = %188, %118
br label %190
190: ; preds = %189, %113
br label %191
191: ; preds = %190, %108
br label %192
192: ; preds = %191, %103
br label %193
193: ; preds = %192, %98
br label %194
194: ; preds = %193, %93
br label %195
195: ; preds = %194, %83
br label %196
196: ; preds = %195, %49
br label %197
197: ; preds = %196, %39
br label %198
198: ; preds = %197, %28
br label %199
199: ; preds = %198, %22
br label %200
200: ; preds = %199, %16
br label %201
201: ; preds = %200, %10
br label %202
202: ; preds = %201, %6
%203 = load i8*, i8** %3
ret i8* %203
}

LLVM IR (-O2):
@.str = [2 x i8] c"?\00"
@.str.1 = [4 x i8] c"CLS\00"
@.str.2 = [4 x i8] c"RET\00"
@.str.3 = [4 x i8] c"SYS\00"
@.str.4 = [4 x i8] c"JMP\00"
@.str.5 = [5 x i8] c"CALL\00"
@.str.6 = [3 x i8] c"SE\00"
@.str.7 = [4 x i8] c"SNE\00"
@.str.8 = [3 x i8] c"LD\00"
@.str.9 = [4 x i8] c"ADD\00"
@.str.10 = [3 x i8] c"OR\00"
@.str.11 = [4 x i8] c"AND\00"
@.str.12 = [4 x i8] c"XOR\00"
@.str.13 = [4 x i8] c"SUB\00"
@.str.14 = [4 x i8] c"SHR\00"
@.str.15 = [5 x i8] c"SUBN\00"
@.str.16 = [4 x i8] c"SHL\00"
@.str.17 = [4 x i8] c"LDI\00"
@.str.18 = [4 x i8] c"JPO\00"
@.str.19 = [4 x i8] c"RND\00"
@.str.20 = [4 x i8] c"DRW\00"
@.str.21 = [4 x i8] c"SKP\00"
@.str.22 = [5 x i8] c"SKNP\00"
@.str.23 = [5 x i8] c"ADDI\00"
@.str.24 = [5 x i8] c"SAVE\00"
@.str.25 = [5 x i8] c"REST\00"
@reltable.opcode_get_name = [6 x i32] [i32 trunc (i64 sub (i64 ptrtoint ([4 x i8]* @.str.3 to i64), i64 ptrtoint ([6 x i32]* @reltable.opcode_get_name to i64)) to i32), i32 trunc (i64 sub (i64 ptrtoint ([4 x i8]* @.str.4 to i64), i64 ptrtoint ([6 x i32]* @reltable.opcode_get_name to i64)) to i32), i32 trunc (i64 sub (i64 ptrtoint ([5 x i8]* @.str.5 to i64), i64 ptrtoint ([6 x i32]* @reltable.opcode_get_name to i64)) to i32), i32 trunc (i64 sub (i64 ptrtoint ([3 x i8]* @.str.6 to i64), i64 ptrtoint ([6 x i32]* @reltable.opcode_get_name to i64)) to i32), i32 trunc (i64 sub (i64 ptrtoint ([4 x i8]* @.str.7 to i64), i64 ptrtoint ([6 x i32]* @reltable.opcode_get_name to i64)) to i32), i32 trunc (i64 sub (i64 ptrtoint ([3 x i8]* @.str.6 to i64), i64 ptrtoint ([6 x i32]* @reltable.opcode_get_name to i64)) to i32)]
@reltable.opcode_get_name.28 = [14 x i32] [i32 trunc (i64 sub (i64 ptrtoint ([3 x i8]* @.str.10 to i64), i64 ptrtoint ([14 x i32]* @reltable.opcode_get_name.28 to i64)) to i32), i32 trunc (i64 sub (i64 ptrtoint ([4 x i8]* @.str.11 to i64), i64 ptrtoint ([14 x i32]* @reltable.opcode_get_name.28 to i64)) to i32), i32 trunc (i64 sub (i64 ptrtoint ([4 x i8]* @.str.12 to i64), i64 ptrtoint ([14 x i32]* @reltable.opcode_get_name.28 to i64)) to i32), i32 trunc (i64 sub (i64 ptrtoint ([3 x i8]* @.str.10 to i64), i64 ptrtoint ([14 x i32]* @reltable.opcode_get_name.28 to i64)) to i32), i32 trunc (i64 sub (i64 ptrtoint ([4 x i8]* @.str.13 to i64), i64 ptrtoint ([14 x i32]* @reltable.opcode_get_name.28 to i64)) to i32), i32 trunc (i64 sub (i64 ptrtoint ([4 x i8]* @.str.14 to i64), i64 ptrtoint ([14 x i32]* @reltable.opcode_get_name.28 to i64)) to i32), i32 trunc (i64 sub (i64 ptrtoint ([5 x i8]* @.str.15 to i64), i64 ptrtoint ([14 x i32]* @reltable.opcode_get_name.28 to i64)) to i32), i32 trunc (i64 sub (i64 ptrtoint ([3 x i8]* @.str.10 to i64), i64 ptrtoint ([14 x i32]* @reltable.opcode_get_name.28 to i64)) to i32), i32 trunc (i64 sub (i64 ptrtoint ([3 x i8]* @.str.10 to i64), i64 ptrtoint ([14 x i32]* @reltable.opcode_get_name.28 to i64)) to i32), i32 trunc (i64 sub (i64 ptrtoint ([3 x i8]* @.str.10 to i64), i64 ptrtoint ([14 x i32]* @reltable.opcode_get_name.28 to i64)) to i32), i32 trunc (i64 sub (i64 ptrtoint ([3 x i8]* @.str.10 to i64), i64 ptrtoint ([14 x i32]* @reltable.opcode_get_name.28 to i64)) to i32), i32 trunc (i64 sub (i64 ptrtoint ([3 x i8]* @.str.10 to i64), i64 ptrtoint ([14 x i32]* @reltable.opcode_get_name.28 to i64)) to i32), i32 trunc (i64 sub (i64 ptrtoint ([3 x i8]* @.str.10 to i64), i64 ptrtoint ([14 x i32]* @reltable.opcode_get_name.28 to i64)) to i32), i32 trunc (i64 sub (i64 ptrtoint ([4 x i8]* @.str.16 to i64), i64 ptrtoint ([14 x i32]* @reltable.opcode_get_name.28 to i64)) to i32)]
@reltable.opcode_get_name.29 = [4 x i32] [i32 trunc (i64 sub (i64 ptrtoint ([4 x i8]* @.str.17 to i64), i64 ptrtoint ([4 x i32]* @reltable.opcode_get_name.29 to i64)) to i32), i32 trunc (i64 sub (i64 ptrtoint ([4 x i8]* @.str.18 to i64), i64 ptrtoint ([4 x i32]* @reltable.opcode_get_name.29 to i64)) to i32), i32 trunc (i64 sub (i64 ptrtoint ([4 x i8]* @.str.19 to i64), i64 ptrtoint ([4 x i32]* @reltable.opcode_get_name.29 to i64)) to i32), i32 trunc (i64 sub (i64 ptrtoint ([4 x i8]* @.str.20 to i64), i64 ptrtoint ([4 x i32]* @reltable.opcode_get_name.29 to i64)) to i32)]
define i8* @opcode_get_name(i32 %0) {
switch i32 %0, label %3 [
i32 224, label %50
i32 238, label %2
]
2: ; preds = %1
br label %50
3: ; preds = %1
%4 = lshr i32 %0, 12
%5 = and i32 %4, 15
%6 = icmp ult i32 %5, 6
br i1 %6, label %34, label %7
7: ; preds = %3
%8 = and i32 %0, 61455
%9 = icmp eq i32 %8, 36864
br i1 %9, label %50, label %10
10: ; preds = %7
%11 = icmp eq i32 %5, 6
%12 = icmp eq i32 %8, 32768
%13 = or i1 %12, %11
br i1 %13, label %50, label %14
14: ; preds = %10
%15 = trunc i32 %0 to i16
%16 = and i16 %15, -3841
switch i16 %16, label %17 [
i16 -4089, label %50
i16 -4086, label %50
i16 -4075, label %50
i16 -4072, label %50
i16 -4055, label %50
i16 -4045, label %50
]
17: ; preds = %14
%18 = icmp eq i32 %5, 7
%19 = icmp eq i32 %8, 32772
%20 = or i1 %19, %18
br i1 %20, label %50, label %21
21: ; preds = %17
%22 = trunc i32 %8 to i16
%23 = add i16 %22, 32767
%24 = icmp ult i16 %23, 14
br i1 %24, label %38, label %25
25: ; preds = %38, %21
%26 = add nsw i32 %5, -10
%27 = icmp ult i32 %26, 4
br i1 %27, label %46, label %28
28: ; preds = %25
switch i16 %16, label %33 [
i16 -8034, label %50
i16 -8031, label %29
i16 -4066, label %30
i16 -4011, label %31
i16 -3995, label %32
]
29: ; preds = %28
br label %50
30: ; preds = %28
br label %50
31: ; preds = %28
br label %50
32: ; preds = %28
br label %50
33: ; preds = %28
br label %50
34: ; preds = %3
%35 = zext i32 %5 to i64
%36 = shl i64 %35, 2
%37 = call i8* @llvm.load.relative.i64(i8* bitcast ([6 x i32]* @reltable.opcode_get_name to i8*), i64 %36)
br label %50
38: ; preds = %21
%39 = lshr i16 8311, %23
%40 = and i16 %39, 1
%41 = icmp eq i16 %40, 0
br i1 %41, label %25, label %42
42: ; preds = %38
%43 = sext i16 %23 to i64
%44 = shl i64 %43, 2
%45 = call i8* @llvm.load.relative.i64(i8* bitcast ([14 x i32]* @reltable.opcode_get_name.28 to i8*), i64 %44)
br label %50
46: ; preds = %25
%47 = sext i32 %26 to i64
%48 = shl i64 %47, 2
%49 = call i8* @llvm.load.relative.i64(i8* bitcast ([4 x i32]* @reltable.opcode_get_name.29 to i8*), i64 %48)
br label %50
50: ; preds = %46, %42, %7, %34, %28, %33, %17, %10, %14, %14, %14, %14, %14, %14, %1, %2, %29, %31, %32, %30
%51 = phi i8* [ getelementptr inbounds ([4 x i8], [4 x i8]* @.str.2, i64 0, i64 0), %2 ], [ getelementptr inbounds ([5 x i8], [5 x i8]* @.str.22, i64 0, i64 0), %29 ], [ getelementptr inbounds ([5 x i8], [5 x i8]* @.str.23, i64 0, i64 0), %30 ], [ getelementptr inbounds ([5 x i8], [5 x i8]* @.str.24, i64 0, i64 0), %31 ], [ getelementptr inbounds ([5 x i8], [5 x i8]* @.str.25, i64 0, i64 0), %32 ], [ getelementptr inbounds ([4 x i8], [4 x i8]* @.str.1, i64 0, i64 0), %1 ], [ getelementptr inbounds ([3 x i8], [3 x i8]* @.str.8, i64 0, i64 0), %14 ], [ getelementptr inbounds ([3 x i8], [3 x i8]* @.str.8, i64 0, i64 0), %14 ], [ getelementptr inbounds ([3 x i8], [3 x i8]* @.str.8, i64 0, i64 0), %14 ], [ getelementptr inbounds ([3 x i8], [3 x i8]* @.str.8, i64 0, i64 0), %14 ], [ getelementptr inbounds ([3 x i8], [3 x i8]* @.str.8, i64 0, i64 0), %14 ], [ getelementptr inbounds ([3 x i8], [3 x i8]* @.str.8, i64 0, i64 0), %14 ], [ getelementptr inbounds ([3 x i8], [3 x i8]* @.str.8, i64 0, i64 0), %10 ], [ getelementptr inbounds ([4 x i8], [4 x i8]* @.str.9, i64 0, i64 0), %17 ], [ getelementptr inbounds ([4 x i8], [4 x i8]* @.str.21, i64 0, i64 0), %28 ], [ getelementptr inbounds ([2 x i8], [2 x i8]* @.str, i64 0, i64 0), %33 ], [ %37, %34 ], [ getelementptr inbounds ([4 x i8], [4 x i8]* @.str.7, i64 0, i64 0), %7 ], [ %45, %42 ], [ %49, %46 ]
ret i8* %51
}