__attribute__((always_)) int yc_poly_emulator(char *decryptor_offset,
                                              char *code, unsigned int ecx) {
  unsigned char al;
  unsigned char cl = ecx & 0xff;
  unsigned int j, i;
  for (i = 0; i < ecx; i++) {
    al = code[i];
    for (j = 0; j < 0x30; j++) {
      switch (decryptor_offset[j]) {
      case '\xEB':
        j++;
        j = j + decryptor_offset[j];
        break;
      case '\xFE':
        al--;
        j++;
        break;
      case '\x2A':
        al = al - cl;
        j++;
        break;
      case '\x02':
        al = al + cl;
        j++;
        break;
      case '\x32':
        al = al ^ cl;
        j++;
        break;
        ;
      case '\x04':
        j++;
        al = al + decryptor_offset[j];
        break;
        ;
      case '\x34':
        j++;
        al = al ^ decryptor_offset[j];
        break;
      case '\x2C':
        j++;
        al = al - decryptor_offset[j];
        break;
      case '\xC0':
        j++;
        if (decryptor_offset[j] == '\xC0') {
          j++;
          al = (al << (decryptor_offset[j] % (sizeof(al) << 3))) |
               (al >> ((sizeof(al) << 3) -
                       (decryptor_offset[j] % (sizeof(al) << 3))));
        } else {
          j++;
          al = (al >> (decryptor_offset[j] % (sizeof(al) << 3))) |
               (al << ((sizeof(al) << 3) -
                       (decryptor_offset[j] % (sizeof(al) << 3))));
        }
        break;
      case '\xD2':
        j++;
        if (decryptor_offset[j] == '\xC8') {
          j++;
          al = (al >> (cl % (sizeof(al) << 3))) |
               (al << ((sizeof(al) << 3) - (cl % (sizeof(al) << 3))));
        } else {
          j++;
          al = (al << (cl % (sizeof(al) << 3))) |
               (al >> ((sizeof(al) << 3) - (cl % (sizeof(al) << 3))));
        }
        break;
      case '\x90':
      case '\xf8':
      case '\xf9':
        break;
      default:;
        return 1;
      }
    }
    cl--;
    code[i] = al;
  }
  return 0;
}


x86 assembly (clang, -O0):
<yc_poly_emulator>:
push   %rbp
mov    %rsp,%rbp
mov    %rdi,-0x10(%rbp)
mov    %rsi,-0x18(%rbp)
mov    %edx,-0x1c(%rbp)
mov    -0x1c(%rbp),%eax
and    $0xff,%eax
mov    %al,-0x1e(%rbp)
movl   $0x0,-0x28(%rbp)
mov    -0x28(%rbp),%eax
cmp    -0x1c(%rbp),%eax
jae    149c <yc_poly_emulator+0x39c>
mov    -0x18(%rbp),%rax
mov    -0x28(%rbp),%ecx
mov    (%rax,%rcx,1),%al
mov    %al,-0x1d(%rbp)
movl   $0x0,-0x24(%rbp)
cmpl   $0x30,-0x24(%rbp)
jae    1479 <yc_poly_emulator+0x379>
mov    -0x10(%rbp),%rax
mov    -0x24(%rbp),%ecx
movsbl (%rax,%rcx,1),%eax
mov    %eax,-0x2c(%rbp)
sub    $0xffffff90,%eax
je     1455 <yc_poly_emulator+0x355>
jmp    1167 <yc_poly_emulator+0x67>
mov    -0x2c(%rbp),%eax
sub    $0xffffffc0,%eax
je     1313 <yc_poly_emulator+0x213>
jmp    1178 <yc_poly_emulator+0x78>
mov    -0x2c(%rbp),%eax
sub    $0xffffffd2,%eax
je     13c2 <yc_poly_emulator+0x2c2>
jmp    1189 <yc_poly_emulator+0x89>
mov    -0x2c(%rbp),%eax
sub    $0xffffffeb,%eax
je     1225 <yc_poly_emulator+0x125>
jmp    119a <yc_poly_emulator+0x9a>
mov    -0x2c(%rbp),%eax
add    $0x8,%eax
sub    $0x2,%eax
jb     1455 <yc_poly_emulator+0x355>
jmp    11ae <yc_poly_emulator+0xae>
mov    -0x2c(%rbp),%eax
sub    $0xfffffffe,%eax
je     1246 <yc_poly_emulator+0x146>
jmp    11bf <yc_poly_emulator+0xbf>
mov    -0x2c(%rbp),%eax
sub    $0x2,%eax
je     1277 <yc_poly_emulator+0x177>
jmp    11d0 <yc_poly_emulator+0xd0>
mov    -0x2c(%rbp),%eax
sub    $0x4,%eax
je     12ad <yc_poly_emulator+0x1ad>
jmp    11e1 <yc_poly_emulator+0xe1>
mov    -0x2c(%rbp),%eax
sub    $0x2a,%eax
je     125c <yc_poly_emulator+0x15c>
jmp    11f2 <yc_poly_emulator+0xf2>
mov    -0x2c(%rbp),%eax
sub    $0x2c,%eax
je     12f1 <yc_poly_emulator+0x1f1>
jmp    1203 <yc_poly_emulator+0x103>
mov    -0x2c(%rbp),%eax
sub    $0x32,%eax
je     1292 <yc_poly_emulator+0x192>
jmp    1214 <yc_poly_emulator+0x114>
mov    -0x2c(%rbp),%eax
sub    $0x34,%eax
je     12cf <yc_poly_emulator+0x1cf>
jmp    145a <yc_poly_emulator+0x35a>
mov    -0x24(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x24(%rbp)
mov    -0x24(%rbp),%eax
mov    -0x10(%rbp),%rcx
mov    -0x24(%rbp),%edx
movsbl (%rcx,%rdx,1),%ecx
add    %ecx,%eax
mov    %eax,-0x24(%rbp)
jmp    1466 <yc_poly_emulator+0x366>
mov    -0x1d(%rbp),%al
add    $0xff,%al
mov    %al,-0x1d(%rbp)
mov    -0x24(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x24(%rbp)
jmp    1466 <yc_poly_emulator+0x366>
movzbl -0x1d(%rbp),%eax
movzbl -0x1e(%rbp),%ecx
sub    %ecx,%eax
mov    %al,-0x1d(%rbp)
mov    -0x24(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x24(%rbp)
jmp    1466 <yc_poly_emulator+0x366>
movzbl -0x1d(%rbp),%eax
movzbl -0x1e(%rbp),%ecx
add    %ecx,%eax
mov    %al,-0x1d(%rbp)
mov    -0x24(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x24(%rbp)
jmp    1466 <yc_poly_emulator+0x366>
movzbl -0x1d(%rbp),%eax
movzbl -0x1e(%rbp),%ecx
xor    %ecx,%eax
mov    %al,-0x1d(%rbp)
mov    -0x24(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x24(%rbp)
jmp    1466 <yc_poly_emulator+0x366>
mov    -0x24(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x24(%rbp)
movzbl -0x1d(%rbp),%eax
mov    -0x10(%rbp),%rcx
mov    -0x24(%rbp),%edx
movsbl (%rcx,%rdx,1),%ecx
add    %ecx,%eax
mov    %al,-0x1d(%rbp)
jmp    1466 <yc_poly_emulator+0x366>
mov    -0x24(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x24(%rbp)
movzbl -0x1d(%rbp),%eax
mov    -0x10(%rbp),%rcx
mov    -0x24(%rbp),%edx
movsbl (%rcx,%rdx,1),%ecx
xor    %ecx,%eax
mov    %al,-0x1d(%rbp)
jmp    1466 <yc_poly_emulator+0x366>
mov    -0x24(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x24(%rbp)
movzbl -0x1d(%rbp),%eax
mov    -0x10(%rbp),%rcx
mov    -0x24(%rbp),%edx
movsbl (%rcx,%rdx,1),%ecx
sub    %ecx,%eax
mov    %al,-0x1d(%rbp)
jmp    1466 <yc_poly_emulator+0x366>
mov    -0x24(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x24(%rbp)
mov    -0x10(%rbp),%rax
mov    -0x24(%rbp),%ecx
movsbl (%rax,%rcx,1),%eax
cmp    $0xffffffc0,%eax
jne    1379 <yc_poly_emulator+0x279>
mov    -0x24(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x24(%rbp)
movzbl -0x1d(%rbp),%eax
mov    -0x10(%rbp),%rcx
mov    -0x24(%rbp),%edx
movsbq (%rcx,%rdx,1),%rcx
and    $0x7,%rcx
shl    %cl,%eax
movzbl -0x1d(%rbp),%edx
mov    -0x10(%rbp),%rcx
mov    -0x24(%rbp),%esi
movsbq (%rcx,%rsi,1),%rsi
and    $0x7,%rsi
mov    $0x8,%ecx
sub    %rsi,%rcx
sar    %cl,%edx
mov    %edx,%ecx
or     %ecx,%eax
mov    %al,-0x1d(%rbp)
jmp    13bd <yc_poly_emulator+0x2bd>
mov    -0x24(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x24(%rbp)
movzbl -0x1d(%rbp),%eax
mov    -0x10(%rbp),%rcx
mov    -0x24(%rbp),%edx
movsbq (%rcx,%rdx,1),%rcx
and    $0x7,%rcx
sar    %cl,%eax
movzbl -0x1d(%rbp),%edx
mov    -0x10(%rbp),%rcx
mov    -0x24(%rbp),%esi
movsbq (%rcx,%rsi,1),%rsi
and    $0x7,%rsi
mov    $0x8,%ecx
sub    %rsi,%rcx
shl    %cl,%edx
mov    %edx,%ecx
or     %ecx,%eax
mov    %al,-0x1d(%rbp)
jmp    1466 <yc_poly_emulator+0x366>
mov    -0x24(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x24(%rbp)
mov    -0x10(%rbp),%rax
mov    -0x24(%rbp),%ecx
movsbl (%rax,%rcx,1),%eax
cmp    $0xffffffc8,%eax
jne    141a <yc_poly_emulator+0x31a>
mov    -0x24(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x24(%rbp)
movzbl -0x1d(%rbp),%eax
movzbl -0x1e(%rbp),%ecx
and    $0x7,%rcx
sar    %cl,%eax
movzbl -0x1d(%rbp),%edx
movzbl -0x1e(%rbp),%ecx
mov    %ecx,%esi
and    $0x7,%rsi
mov    $0x8,%ecx
sub    %rsi,%rcx
shl    %cl,%edx
mov    %edx,%ecx
or     %ecx,%eax
mov    %al,-0x1d(%rbp)
jmp    1450 <yc_poly_emulator+0x350>
mov    -0x24(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x24(%rbp)
movzbl -0x1d(%rbp),%eax
movzbl -0x1e(%rbp),%ecx
and    $0x7,%rcx
shl    %cl,%eax
movzbl -0x1d(%rbp),%edx
movzbl -0x1e(%rbp),%ecx
mov    %ecx,%esi
and    $0x7,%rsi
mov    $0x8,%ecx
sub    %rsi,%rcx
sar    %cl,%edx
mov    %edx,%ecx
or     %ecx,%eax
mov    %al,-0x1d(%rbp)
jmp    1466 <yc_poly_emulator+0x366>
jmp    1466 <yc_poly_emulator+0x366>
movl   $0x1,-0x4(%rbp)
jmp    14a3 <yc_poly_emulator+0x3a3>
jmp    146b <yc_poly_emulator+0x36b>
mov    -0x24(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x24(%rbp)
jmp    1141 <yc_poly_emulator+0x41>
mov    -0x1e(%rbp),%al
add    $0xff,%al
mov    %al,-0x1e(%rbp)
mov    -0x1d(%rbp),%dl
mov    -0x18(%rbp),%rax
mov    -0x28(%rbp),%ecx
mov    %dl,(%rax,%rcx,1)
mov    -0x28(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x28(%rbp)
jmp    1121 <yc_poly_emulator+0x21>
movl   $0x0,-0x4(%rbp)
mov    -0x4(%rbp),%eax
pop    %rbp
ret

x86 assembly (clang, -O2):
<yc_poly_emulator>:
push   %rbp
push   %r15
push   %r14
push   %rbx
test   %edx,%edx
je     123d <yc_poly_emulator+0x13d>
mov    %edx,%r10d
xor    %r11d,%r11d
lea    0xee5(%rip),%r14
jmp    1134 <yc_poly_emulator+0x34>
nopl   (%rax)
add    $0xff,%dl
mov    %r15b,(%rsi,%r11,1)
add    $0x1,%r11
cmp    %r10,%r11
je     123d <yc_poly_emulator+0x13d>
mov    (%rsi,%r11,1),%r15b
mov    %edx,%r9d
and    $0x7,%r9b
mov    $0x8,%r8b
sub    %r9b,%r8b
xor    %ebx,%ebx
jmp    115c <yc_poly_emulator+0x5c>
add    0x1(%rdi,%rax,1),%r15b
add    $0x1,%rax
mov    %eax,%ebx
add    $0x1,%ebx
cmp    $0x30,%ebx
jae    1120 <yc_poly_emulator+0x20>
mov    %ebx,%eax
movsbl (%rdi,%rax,1),%ecx
lea    0x40(%rcx),%ebp
cmp    $0x74,%ebp
ja     11a1 <yc_poly_emulator+0xa1>
movslq (%r14,%rbp,4),%rcx
add    %r14,%rcx
jmp    *%rcx
lea    0x2(%rax),%rbx
movzbl 0x2(%rdi,%rax,1),%ecx
and    $0x7,%ecx
cmpb   $0xc0,0x1(%rax,%rdi,1)
movzbl %r15b,%r15d
mov    %r15d,%ebp
jne    121a <yc_poly_emulator+0x11a>
shl    %cl,%ebp
mov    $0x8,%al
sub    %cl,%al
mov    %eax,%ecx
shr    %cl,%r15d
or     %ebp,%r15d
jmp    1154 <yc_poly_emulator+0x54>
cmp    $0xffffff90,%ecx
je     1154 <yc_poly_emulator+0x54>
jmp    1241 <yc_poly_emulator+0x141>
add    $0x2,%ebx
cmpb   $0xc8,0x1(%rax,%rdi,1)
movzbl %r15b,%r15d
mov    %r15d,%eax
mov    %r9d,%ecx
jne    122d <yc_poly_emulator+0x12d>
shr    %cl,%eax
mov    %r8d,%ecx
shl    %cl,%r15d
jmp    1235 <yc_poly_emulator+0x135>
movsbl 0x1(%rdi,%rax,1),%ecx
add    $0x1,%rax
add    %ecx,%eax
jmp    1152 <yc_poly_emulator+0x52>
add    $0xff,%r15b
add    $0x1,%ebx
jmp    1154 <yc_poly_emulator+0x54>
add    %dl,%r15b
add    $0x1,%ebx
jmp    1154 <yc_poly_emulator+0x54>
sub    %dl,%r15b
add    $0x1,%ebx
jmp    1154 <yc_poly_emulator+0x54>
sub    0x1(%rdi,%rax,1),%r15b
jmp    114e <yc_poly_emulator+0x4e>
xor    %dl,%r15b
add    $0x1,%ebx
jmp    1154 <yc_poly_emulator+0x54>
xor    0x1(%rdi,%rax,1),%r15b
jmp    114e <yc_poly_emulator+0x4e>
shr    %cl,%ebp
mov    $0x8,%al
sub    %cl,%al
mov    %eax,%ecx
shl    %cl,%r15d
or     %ebp,%r15d
jmp    1154 <yc_poly_emulator+0x54>
shl    %cl,%eax
mov    %r8d,%ecx
shr    %cl,%r15d
or     %eax,%r15d
jmp    1154 <yc_poly_emulator+0x54>
xor    %eax,%eax
jmp    1246 <yc_poly_emulator+0x146>
mov    $0x1,%eax
pop    %rbx
pop    %r14
pop    %r15
pop    %rbp
ret

LLVM IR (-O0):
define i32 @yc_poly_emulator(i8* %0, i8* %1, i32 %2) {
%4 = alloca i32
%5 = alloca i8*
%6 = alloca i8*
%7 = alloca i32
%8 = alloca i8
%9 = alloca i8
%10 = alloca i32
%11 = alloca i32
store i8* %0, i8** %5
store i8* %1, i8** %6
store i32 %2, i32* %7
%12 = load i32, i32* %7
%13 = and i32 %12, 255
%14 = trunc i32 %13 to i8
store i8 %14, i8* %9
store i32 0, i32* %11
br label %15
15: ; preds = %249, %3
%16 = load i32, i32* %11
%17 = load i32, i32* %7
%18 = icmp ult i32 %16, %17
br i1 %18, label %19, label %252
19: ; preds = %15
%20 = load i8*, i8** %6
%21 = load i32, i32* %11
%22 = zext i32 %21 to i64
%23 = getelementptr inbounds i8, i8* %20, i64 %22
%24 = load i8, i8* %23
store i8 %24, i8* %8
store i32 0, i32* %10
br label %25
25: ; preds = %238, %19
%26 = load i32, i32* %10
%27 = icmp ult i32 %26, 48
br i1 %27, label %28, label %241
28: ; preds = %25
%29 = load i8*, i8** %5
%30 = load i32, i32* %10
%31 = zext i32 %30 to i64
%32 = getelementptr inbounds i8, i8* %29, i64 %31
%33 = load i8, i8* %32
%34 = sext i8 %33 to i32
switch i32 %34, label %236 [
i32 -21, label %35
i32 -2, label %46
i32 42, label %51
i32 2, label %60
i32 50, label %69
i32 4, label %78
i32 52, label %91
i32 44, label %104
i32 -64, label %117
i32 -46, label %184
i32 -112, label %235
i32 -8, label %235
i32 -7, label %235
]
35: ; preds = %28
%36 = load i32, i32* %10
%37 = add i32 %36, 1
store i32 %37, i32* %10
%38 = load i32, i32* %10
%39 = load i8*, i8** %5
%40 = load i32, i32* %10
%41 = zext i32 %40 to i64
%42 = getelementptr inbounds i8, i8* %39, i64 %41
%43 = load i8, i8* %42
%44 = sext i8 %43 to i32
%45 = add i32 %38, %44
store i32 %45, i32* %10
br label %237
46: ; preds = %28
%47 = load i8, i8* %8
%48 = add i8 %47, -1
store i8 %48, i8* %8
%49 = load i32, i32* %10
%50 = add i32 %49, 1
store i32 %50, i32* %10
br label %237
51: ; preds = %28
%52 = load i8, i8* %8
%53 = zext i8 %52 to i32
%54 = load i8, i8* %9
%55 = zext i8 %54 to i32
%56 = sub nsw i32 %53, %55
%57 = trunc i32 %56 to i8
store i8 %57, i8* %8
%58 = load i32, i32* %10
%59 = add i32 %58, 1
store i32 %59, i32* %10
br label %237
60: ; preds = %28
%61 = load i8, i8* %8
%62 = zext i8 %61 to i32
%63 = load i8, i8* %9
%64 = zext i8 %63 to i32
%65 = add nsw i32 %62, %64
%66 = trunc i32 %65 to i8
store i8 %66, i8* %8
%67 = load i32, i32* %10
%68 = add i32 %67, 1
store i32 %68, i32* %10
br label %237
69: ; preds = %28
%70 = load i8, i8* %8
%71 = zext i8 %70 to i32
%72 = load i8, i8* %9
%73 = zext i8 %72 to i32
%74 = xor i32 %71, %73
%75 = trunc i32 %74 to i8
store i8 %75, i8* %8
%76 = load i32, i32* %10
%77 = add i32 %76, 1
store i32 %77, i32* %10
br label %237
78: ; preds = %28
%79 = load i32, i32* %10
%80 = add i32 %79, 1
store i32 %80, i32* %10
%81 = load i8, i8* %8
%82 = zext i8 %81 to i32
%83 = load i8*, i8** %5
%84 = load i32, i32* %10
%85 = zext i32 %84 to i64
%86 = getelementptr inbounds i8, i8* %83, i64 %85
%87 = load i8, i8* %86
%88 = sext i8 %87 to i32
%89 = add nsw i32 %82, %88
%90 = trunc i32 %89 to i8
store i8 %90, i8* %8
br label %237
91: ; preds = %28
%92 = load i32, i32* %10
%93 = add i32 %92, 1
store i32 %93, i32* %10
%94 = load i8, i8* %8
%95 = zext i8 %94 to i32
%96 = load i8*, i8** %5
%97 = load i32, i32* %10
%98 = zext i32 %97 to i64
%99 = getelementptr inbounds i8, i8* %96, i64 %98
%100 = load i8, i8* %99
%101 = sext i8 %100 to i32
%102 = xor i32 %95, %101
%103 = trunc i32 %102 to i8
store i8 %103, i8* %8
br label %237
104: ; preds = %28
%105 = load i32, i32* %10
%106 = add i32 %105, 1
store i32 %106, i32* %10
%107 = load i8, i8* %8
%108 = zext i8 %107 to i32
%109 = load i8*, i8** %5
%110 = load i32, i32* %10
%111 = zext i32 %110 to i64
%112 = getelementptr inbounds i8, i8* %109, i64 %111
%113 = load i8, i8* %112
%114 = sext i8 %113 to i32
%115 = sub nsw i32 %108, %114
%116 = trunc i32 %115 to i8
store i8 %116, i8* %8
br label %237
117: ; preds = %28
%118 = load i32, i32* %10
%119 = add i32 %118, 1
store i32 %119, i32* %10
%120 = load i8*, i8** %5
%121 = load i32, i32* %10
%122 = zext i32 %121 to i64
%123 = getelementptr inbounds i8, i8* %120, i64 %122
%124 = load i8, i8* %123
%125 = sext i8 %124 to i32
%126 = icmp eq i32 %125, -64
br i1 %126, label %127, label %155
127: ; preds = %117
%128 = load i32, i32* %10
%129 = add i32 %128, 1
store i32 %129, i32* %10
%130 = load i8, i8* %8
%131 = zext i8 %130 to i32
%132 = load i8*, i8** %5
%133 = load i32, i32* %10
%134 = zext i32 %133 to i64
%135 = getelementptr inbounds i8, i8* %132, i64 %134
%136 = load i8, i8* %135
%137 = sext i8 %136 to i64
%138 = urem i64 %137, 8
%139 = trunc i64 %138 to i32
%140 = shl i32 %131, %139
%141 = load i8, i8* %8
%142 = zext i8 %141 to i32
%143 = load i8*, i8** %5
%144 = load i32, i32* %10
%145 = zext i32 %144 to i64
%146 = getelementptr inbounds i8, i8* %143, i64 %145
%147 = load i8, i8* %146
%148 = sext i8 %147 to i64
%149 = urem i64 %148, 8
%150 = sub i64 8, %149
%151 = trunc i64 %150 to i32
%152 = ashr i32 %142, %151
%153 = or i32 %140, %152
%154 = trunc i32 %153 to i8
store i8 %154, i8* %8
br label %183
155: ; preds = %117
%156 = load i32, i32* %10
%157 = add i32 %156, 1
store i32 %157, i32* %10
%158 = load i8, i8* %8
%159 = zext i8 %158 to i32
%160 = load i8*, i8** %5
%161 = load i32, i32* %10
%162 = zext i32 %161 to i64
%163 = getelementptr inbounds i8, i8* %160, i64 %162
%164 = load i8, i8* %163
%165 = sext i8 %164 to i64
%166 = urem i64 %165, 8
%167 = trunc i64 %166 to i32
%168 = ashr i32 %159, %167
%169 = load i8, i8* %8
%170 = zext i8 %169 to i32
%171 = load i8*, i8** %5
%172 = load i32, i32* %10
%173 = zext i32 %172 to i64
%174 = getelementptr inbounds i8, i8* %171, i64 %173
%175 = load i8, i8* %174
%176 = sext i8 %175 to i64
%177 = urem i64 %176, 8
%178 = sub i64 8, %177
%179 = trunc i64 %178 to i32
%180 = shl i32 %170, %179
%181 = or i32 %168, %180
%182 = trunc i32 %181 to i8
store i8 %182, i8* %8
br label %183
183: ; preds = %155, %127
br label %237
184: ; preds = %28
%185 = load i32, i32* %10
%186 = add i32 %185, 1
store i32 %186, i32* %10
%187 = load i8*, i8** %5
%188 = load i32, i32* %10
%189 = zext i32 %188 to i64
%190 = getelementptr inbounds i8, i8* %187, i64 %189
%191 = load i8, i8* %190
%192 = sext i8 %191 to i32
%193 = icmp eq i32 %192, -56
br i1 %193, label %194, label %214
194: ; preds = %184
%195 = load i32, i32* %10
%196 = add i32 %195, 1
store i32 %196, i32* %10
%197 = load i8, i8* %8
%198 = zext i8 %197 to i32
%199 = load i8, i8* %9
%200 = zext i8 %199 to i64
%201 = urem i64 %200, 8
%202 = trunc i64 %201 to i32
%203 = ashr i32 %198, %202
%204 = load i8, i8* %8
%205 = zext i8 %204 to i32
%206 = load i8, i8* %9
%207 = zext i8 %206 to i64
%208 = urem i64 %207, 8
%209 = sub i64 8, %208
%210 = trunc i64 %209 to i32
%211 = shl i32 %205, %210
%212 = or i32 %203, %211
%213 = trunc i32 %212 to i8
store i8 %213, i8* %8
br label %234
214: ; preds = %184
%215 = load i32, i32* %10
%216 = add i32 %215, 1
store i32 %216, i32* %10
%217 = load i8, i8* %8
%218 = zext i8 %217 to i32
%219 = load i8, i8* %9
%220 = zext i8 %219 to i64
%221 = urem i64 %220, 8
%222 = trunc i64 %221 to i32
%223 = shl i32 %218, %222
%224 = load i8, i8* %8
%225 = zext i8 %224 to i32
%226 = load i8, i8* %9
%227 = zext i8 %226 to i64
%228 = urem i64 %227, 8
%229 = sub i64 8, %228
%230 = trunc i64 %229 to i32
%231 = ashr i32 %225, %230
%232 = or i32 %223, %231
%233 = trunc i32 %232 to i8
store i8 %233, i8* %8
br label %234
234: ; preds = %214, %194
br label %237
235: ; preds = %28, %28, %28
br label %237
236: ; preds = %28
store i32 1, i32* %4
br label %253
237: ; preds = %235, %234, %183, %104, %91, %78, %69, %60, %51, %46, %35
br label %238
238: ; preds = %237
%239 = load i32, i32* %10
%240 = add i32 %239, 1
store i32 %240, i32* %10
br label %25
241: ; preds = %25
%242 = load i8, i8* %9
%243 = add i8 %242, -1
store i8 %243, i8* %9
%244 = load i8, i8* %8
%245 = load i8*, i8** %6
%246 = load i32, i32* %11
%247 = zext i32 %246 to i64
%248 = getelementptr inbounds i8, i8* %245, i64 %247
store i8 %244, i8* %248
br label %249
249: ; preds = %241
%250 = load i32, i32* %11
%251 = add i32 %250, 1
store i32 %251, i32* %11
br label %15
252: ; preds = %15
store i32 0, i32* %4
br label %253
253: ; preds = %252, %236
%254 = load i32, i32* %4
ret i32 %254
}

LLVM IR (-O2):
define i32 @yc_poly_emulator(i8* nocapture %0, i8* nocapture %1, i32 %2) {
%4 = icmp eq i32 %2, 0
br i1 %4, label %115, label %5
5: ; preds = %3
%6 = trunc i32 %2 to i8
%7 = zext i32 %2 to i64
br label %8
8: ; preds = %5, %111
%9 = phi i64 [ 0, %5 ], [ %113, %111 ]
%10 = phi i8 [ %6, %5 ], [ %112, %111 ]
%11 = getelementptr inbounds i8, i8* %1, i64 %9
%12 = load i8, i8* %11
%13 = and i8 %10, 7
%14 = zext i8 %13 to i32
%15 = sub nuw nsw i8 8, %13
%16 = zext i8 %15 to i32
br label %17
17: ; preds = %8, %106
%18 = phi i32 [ 0, %8 ], [ %109, %106 ]
%19 = phi i8 [ %12, %8 ], [ %107, %106 ]
%20 = zext i32 %18 to i64
%21 = getelementptr inbounds i8, i8* %0, i64 %20
%22 = load i8, i8* %21
%23 = sext i8 %22 to i32
switch i32 %23, label %115 [
i32 -21, label %24
i32 -2, label %31
i32 42, label %34
i32 2, label %37
i32 50, label %40
i32 4, label %43
i32 52, label %49
i32 44, label %55
i32 -64, label %61
i32 -46, label %88
i32 -112, label %106
i32 -8, label %106
i32 -7, label %106
]
24: ; preds = %17
%25 = add nuw nsw i32 %18, 1
%26 = zext i32 %25 to i64
%27 = getelementptr inbounds i8, i8* %0, i64 %26
%28 = load i8, i8* %27
%29 = sext i8 %28 to i32
%30 = add nsw i32 %25, %29
br label %106
31: ; preds = %17
%32 = add i8 %19, -1
%33 = add nuw nsw i32 %18, 1
br label %106
34: ; preds = %17
%35 = sub i8 %19, %10
%36 = add nuw nsw i32 %18, 1
br label %106
37: ; preds = %17
%38 = add i8 %19, %10
%39 = add nuw nsw i32 %18, 1
br label %106
40: ; preds = %17
%41 = xor i8 %19, %10
%42 = add nuw nsw i32 %18, 1
br label %106
43: ; preds = %17
%44 = add nuw nsw i32 %18, 1
%45 = zext i32 %44 to i64
%46 = getelementptr inbounds i8, i8* %0, i64 %45
%47 = load i8, i8* %46
%48 = add i8 %47, %19
br label %106
49: ; preds = %17
%50 = add nuw nsw i32 %18, 1
%51 = zext i32 %50 to i64
%52 = getelementptr inbounds i8, i8* %0, i64 %51
%53 = load i8, i8* %52
%54 = xor i8 %53, %19
br label %106
55: ; preds = %17
%56 = add nuw nsw i32 %18, 1
%57 = zext i32 %56 to i64
%58 = getelementptr inbounds i8, i8* %0, i64 %57
%59 = load i8, i8* %58
%60 = sub i8 %19, %59
br label %106
61: ; preds = %17
%62 = add nuw nsw i32 %18, 1
%63 = zext i32 %62 to i64
%64 = getelementptr inbounds i8, i8* %0, i64 %63
%65 = load i8, i8* %64
%66 = icmp eq i8 %65, -64
%67 = add nuw nsw i32 %18, 2
%68 = zext i8 %19 to i32
%69 = zext i32 %67 to i64
%70 = getelementptr inbounds i8, i8* %0, i64 %69
%71 = load i8, i8* %70
%72 = and i8 %71, 7
%73 = zext i8 %72 to i32
br i1 %66, label %74, label %81
74: ; preds = %61
%75 = shl nuw nsw i32 %68, %73
%76 = sub nuw nsw i8 8, %72
%77 = zext i8 %76 to i32
%78 = lshr i32 %68, %77
%79 = or i32 %78, %75
%80 = trunc i32 %79 to i8
br label %106
81: ; preds = %61
%82 = lshr i32 %68, %73
%83 = sub nuw nsw i8 8, %72
%84 = zext i8 %83 to i32
%85 = shl nuw nsw i32 %68, %84
%86 = or i32 %85, %82
%87 = trunc i32 %86 to i8
br label %106
88: ; preds = %17
%89 = add nuw nsw i32 %18, 1
%90 = zext i32 %89 to i64
%91 = getelementptr inbounds i8, i8* %0, i64 %90
%92 = load i8, i8* %91
%93 = icmp eq i8 %92, -56
%94 = add nuw nsw i32 %18, 2
%95 = zext i8 %19 to i32
br i1 %93, label %96, label %101
96: ; preds = %88
%97 = lshr i32 %95, %14
%98 = shl nuw nsw i32 %95, %16
%99 = or i32 %97, %98
%100 = trunc i32 %99 to i8
br label %106
101: ; preds = %88
%102 = shl nuw nsw i32 %95, %14
%103 = lshr i32 %95, %16
%104 = or i32 %102, %103
%105 = trunc i32 %104 to i8
br label %106
106: ; preds = %24, %31, %34, %37, %40, %43, %49, %55, %81, %74, %101, %96, %17, %17, %17
%107 = phi i8 [ %19, %17 ], [ %19, %17 ], [ %19, %17 ], [ %100, %96 ], [ %105, %101 ], [ %80, %74 ], [ %87, %81 ], [ %60, %55 ], [ %54, %49 ], [ %48, %43 ], [ %41, %40 ], [ %38, %37 ], [ %35, %34 ], [ %32, %31 ], [ %19, %24 ]
%108 = phi i32 [ %18, %17 ], [ %18, %17 ], [ %18, %17 ], [ %94, %96 ], [ %94, %101 ], [ %67, %74 ], [ %67, %81 ], [ %56, %55 ], [ %50, %49 ], [ %44, %43 ], [ %42, %40 ], [ %39, %37 ], [ %36, %34 ], [ %33, %31 ], [ %30, %24 ]
%109 = add nsw i32 %108, 1
%110 = icmp ult i32 %109, 48
br i1 %110, label %17, label %111
111: ; preds = %106
%112 = add i8 %10, -1
store i8 %107, i8* %11
%113 = add nuw nsw i64 %9, 1
%114 = icmp eq i64 %113, %7
br i1 %114, label %115, label %8
115: ; preds = %111, %17, %3
%116 = phi i32 [ 0, %3 ], [ 1, %17 ], [ 0, %111 ]
ret i32 %116
}