int base64_dec(const void *src, void *dest, int len) {
  int i, j, idx;
  const unsigned char *arr_in = (const unsigned char *)src;
  unsigned char *arr_out = (unsigned char *)dest;
  union {
    unsigned char four[4];
    unsigned short two[2];
    unsigned int one;
  } var;
  unsigned char base64[256] = {
      0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
      0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
      0,  0,  0,  0,  0,  0,  0,  62, 0,  0,  0,  63, 52, 53, 54, 55, 56, 57,
      58, 59, 60, 61, 0,  0,  0,  0,  0,  0,  0,  0,  1,  2,  3,  4,  5,  6,
      7,  8,  9,  10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24,
      25, 0,  0,  0,  0,  0,  0,  26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36,
      37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 0,  0,  0,
      0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
      0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
      0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
      0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
      0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
      0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
      0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
      0,  0,  0,  0};
  var.one = 0;
  for (i = 0, j = 0, idx = 0; i < len; i++) {
    if (arr_in[i] <= ' ') {
      continue;
    }
    if (arr_in[i] == '=') {
      break;
    }
    if (arr_in[i] != 'A') {
      if (base64[arr_in[i]] == 0) {
        return -1;
      }
    }
    var.one += base64[arr_in[i]];
    idx++;
    if (idx < 4) {
      var.one <<= 6;
    } else {
      idx = 0;
      arr_out[j++] = var.four[2];
      arr_out[j++] = var.four[1];
      arr_out[j++] = var.four[0];
      var.one = 0;
    }
  }
  if (idx == 2) {
    var.one >>= 6;
    arr_out[j++] = var.four[0];
  } else if (idx == 3) {
    var.one >>= 6;
    arr_out[j++] = var.four[1];
    arr_out[j++] = var.four[0];
  }
  return j;
}


x86 assembly (clang, -O0):
<base64_dec>:
push   %rbp
mov    %rsp,%rbp
sub    $0x140,%rsp
mov    %rdi,-0x10(%rbp)
mov    %rsi,-0x18(%rbp)
mov    %edx,-0x1c(%rbp)
mov    -0x10(%rbp),%rax
mov    %rax,-0x30(%rbp)
mov    -0x18(%rbp),%rax
mov    %rax,-0x38(%rbp)
lea    -0x140(%rbp),%rdi
lea    0xebc(%rip),%rsi
mov    $0x100,%edx
call   1030 <memcpy@plt>
movl   $0x0,-0x40(%rbp)
movl   $0x0,-0x20(%rbp)
movl   $0x0,-0x24(%rbp)
movl   $0x0,-0x28(%rbp)
mov    -0x20(%rbp),%eax
cmp    -0x1c(%rbp),%eax
jge    1291 <base64_dec+0x181>
mov    -0x30(%rbp),%rax
movslq -0x20(%rbp),%rcx
movzbl (%rax,%rcx,1),%eax
cmp    $0x20,%eax
jg     1190 <base64_dec+0x80>
jmp    1283 <base64_dec+0x173>
mov    -0x30(%rbp),%rax
movslq -0x20(%rbp),%rcx
movzbl (%rax,%rcx,1),%eax
cmp    $0x3d,%eax
jne    11aa <base64_dec+0x9a>
jmp    1291 <base64_dec+0x181>
mov    -0x30(%rbp),%rax
movslq -0x20(%rbp),%rcx
movzbl (%rax,%rcx,1),%eax
cmp    $0x41,%eax
je     11ed <base64_dec+0xdd>
mov    -0x30(%rbp),%rax
movslq -0x20(%rbp),%rcx
movzbl (%rax,%rcx,1),%eax
movzbl -0x140(%rbp,%rax,1),%eax
ff
cmp    $0x0,%eax
jne    11e8 <base64_dec+0xd8>
movl   $0xffffffff,-0x4(%rbp)
jmp    130f <base64_dec+0x1ff>
jmp    11ed <base64_dec+0xdd>
mov    -0x30(%rbp),%rax
movslq -0x20(%rbp),%rcx
movzbl (%rax,%rcx,1),%eax
movzbl -0x140(%rbp,%rax,1),%eax
add    -0x40(%rbp),%eax
mov    %eax,-0x40(%rbp)
mov    -0x28(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x28(%rbp)
cmpl   $0x4,-0x28(%rbp)
jge    1228 <base64_dec+0x118>
mov    -0x40(%rbp),%eax
shl    $0x6,%eax
mov    %eax,-0x40(%rbp)
jmp    127e <base64_dec+0x16e>
movl   $0x0,-0x28(%rbp)
mov    -0x3e(%rbp),%dl
mov    -0x38(%rbp),%rax
mov    -0x24(%rbp),%ecx
mov    %ecx,%esi
add    $0x1,%esi
mov    %esi,-0x24(%rbp)
movslq %ecx,%rcx
mov    %dl,(%rax,%rcx,1)
mov    -0x3f(%rbp),%dl
mov    -0x38(%rbp),%rax
mov    -0x24(%rbp),%ecx
mov    %ecx,%esi
add    $0x1,%esi
mov    %esi,-0x24(%rbp)
movslq %ecx,%rcx
mov    %dl,(%rax,%rcx,1)
mov    -0x40(%rbp),%dl
mov    -0x38(%rbp),%rax
mov    -0x24(%rbp),%ecx
mov    %ecx,%esi
add    $0x1,%esi
mov    %esi,-0x24(%rbp)
movslq %ecx,%rcx
mov    %dl,(%rax,%rcx,1)
movl   $0x0,-0x40(%rbp)
jmp    1283 <base64_dec+0x173>
mov    -0x20(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x20(%rbp)
jmp    116a <base64_dec+0x5a>
cmpl   $0x2,-0x28(%rbp)
jne    12c1 <base64_dec+0x1b1>
mov    -0x40(%rbp),%eax
shr    $0x6,%eax
mov    %eax,-0x40(%rbp)
mov    -0x40(%rbp),%dl
mov    -0x38(%rbp),%rax
mov    -0x24(%rbp),%ecx
mov    %ecx,%esi
add    $0x1,%esi
mov    %esi,-0x24(%rbp)
movslq %ecx,%rcx
mov    %dl,(%rax,%rcx,1)
jmp    1309 <base64_dec+0x1f9>
cmpl   $0x3,-0x28(%rbp)
jne    1304 <base64_dec+0x1f4>
mov    -0x40(%rbp),%eax
shr    $0x6,%eax
mov    %eax,-0x40(%rbp)
mov    -0x3f(%rbp),%dl
mov    -0x38(%rbp),%rax
mov    -0x24(%rbp),%ecx
mov    %ecx,%esi
add    $0x1,%esi
mov    %esi,-0x24(%rbp)
movslq %ecx,%rcx
mov    %dl,(%rax,%rcx,1)
mov    -0x40(%rbp),%dl
mov    -0x38(%rbp),%rax
mov    -0x24(%rbp),%ecx
mov    %ecx,%esi
add    $0x1,%esi
mov    %esi,-0x24(%rbp)
movslq %ecx,%rcx
mov    %dl,(%rax,%rcx,1)
jmp    1309 <base64_dec+0x1f9>
mov    -0x24(%rbp),%eax
mov    %eax,-0x4(%rbp)
mov    -0x4(%rbp),%eax
add    $0x140,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<base64_dec>:
push   %rbp
push   %rbx
test   %edx,%edx
jle    11dc <base64_dec+0xdc>
mov    %edx,%r9d
xor    %edx,%edx
lea    0xeea(%rip),%r8
xor    %r11d,%r11d
xor    %ebp,%ebp
xor    %ebx,%ebx
xor    %r10d,%r10d
xor    %eax,%eax
jmp    1159 <base64_dec+0x59>
mov    %ebx,%ecx
shr    $0x10,%ecx
movslq %eax,%rbp
mov    %cl,(%rsi,%rbp,1)
mov    %bh,0x1(%rsi,%rbp,1)
lea    0x3(%rbp),%eax
mov    %bl,0x2(%rsi,%rbp,1)
xor    %r10d,%r10d
xor    %ebx,%ebx
xor    %ebp,%ebp
xor    %r11d,%r11d
cs nopw 0x0(%rax,%rax,1)
xchg   %ax,%ax
add    $0x1,%rdx
cmp    %rdx,%r9
je     11b7 <base64_dec+0xb7>
movzbl (%rdi,%rdx,1),%ecx
cmp    $0x21,%rcx
jb     1150 <base64_dec+0x50>
cmp    $0x41,%cl
je     1180 <base64_dec+0x80>
cmp    $0x3d,%cl
je     11b7 <base64_dec+0xb7>
movzbl (%rcx,%r8,1),%ecx
test   %cl,%cl
jne    1182 <base64_dec+0x82>
jmp    1214 <base64_dec+0x114>
nopl   0x0(%rax,%rax,1)
xor    %ecx,%ecx
movzbl %cl,%ecx
movzbl %bl,%ebx
shl    $0x10,%ebx
movzbl %bpl,%ebp
shl    $0x8,%ebp
or     %ebx,%ebp
movzbl %r11b,%ebx
or     %ebp,%ebx
add    %ecx,%ebx
cmp    $0x2,%r10d
jg     1124 <base64_dec+0x24>
add    $0x1,%r10d
mov    %ebx,%r11d
shl    $0x6,%r11b
mov    %ebx,%ebp
shr    $0x2,%ebp
shr    $0xa,%ebx
jmp    1150 <base64_dec+0x50>
cmp    $0x3,%r10d
je     11e0 <base64_dec+0xe0>
cmp    $0x2,%r10d
jne    1219 <base64_dec+0x119>
movzbl %bpl,%edx
shl    $0x8,%edx
movzbl %r11b,%ecx
or     %edx,%ecx
shr    $0x6,%ecx
mov    $0x1,%edi
mov    %eax,%edx
jmp    120a <base64_dec+0x10a>
xor    %eax,%eax
jmp    1219 <base64_dec+0x119>
movzbl %bl,%edi
shl    $0x10,%edi
movzbl %bpl,%edx
shl    $0x8,%edx
or     %edx,%edi
movzbl %r11b,%ecx
or     %edx,%ecx
shr    $0x6,%ecx
shr    $0xe,%edi
lea    0x1(%rax),%edx
movslq %eax,%rbp
mov    %dil,(%rsi,%rbp,1)
mov    $0x2,%edi
add    %edi,%eax
movslq %edx,%rdx
mov    %cl,(%rsi,%rdx,1)
jmp    1219 <base64_dec+0x119>
mov    $0xffffffff,%eax
pop    %rbx
pop    %rbp
ret

LLVM IR (-O0):
%union.anon = type { i32 }
@__const.base64_dec.base64 = <{ [123 x i8], [133 x i8] }> <{ [123 x i8] c"\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00>\00\00\00?456789:;<=\00\00\00\00\00\00\00\00\01\02\03\04\05\06\07\08\09\0A\0B\0C\0D\0E\0F\10\11\12\13\14\15\16\17\18\19\00\00\00\00\00\00\1A\1B\1C\1D\1E\1F !\22#$%&'()*+,-./0123", [133 x i8] zeroinitializer }>
define i32 @base64_dec(i8* %0, i8* %1, i32 %2) {
%4 = alloca i32
%5 = alloca i8*
%6 = alloca i8*
%7 = alloca i32
%8 = alloca i32
%9 = alloca i32
%10 = alloca i32
%11 = alloca i8*
%12 = alloca i8*
%13 = alloca %union.anon
%14 = alloca [256 x i8]
store i8* %0, i8** %5
store i8* %1, i8** %6
store i32 %2, i32* %7
%15 = load i8*, i8** %5
store i8* %15, i8** %11
%16 = load i8*, i8** %6
store i8* %16, i8** %12
%17 = bitcast [256 x i8]* %14 to i8*
%18 = bitcast %union.anon* %13 to i32*
store i32 0, i32* %18
store i32 0, i32* %8
store i32 0, i32* %9
store i32 0, i32* %10
br label %19
19: ; preds = %110, %3
%20 = load i32, i32* %8
%21 = load i32, i32* %7
%22 = icmp slt i32 %20, %21
br i1 %22, label %23, label %113
23: ; preds = %19
%24 = load i8*, i8** %11
%25 = load i32, i32* %8
%26 = sext i32 %25 to i64
%27 = getelementptr inbounds i8, i8* %24, i64 %26
%28 = load i8, i8* %27
%29 = zext i8 %28 to i32
%30 = icmp sle i32 %29, 32
br i1 %30, label %31, label %32
31: ; preds = %23
br label %110
32: ; preds = %23
%33 = load i8*, i8** %11
%34 = load i32, i32* %8
%35 = sext i32 %34 to i64
%36 = getelementptr inbounds i8, i8* %33, i64 %35
%37 = load i8, i8* %36
%38 = zext i8 %37 to i32
%39 = icmp eq i32 %38, 61
br i1 %39, label %40, label %41
40: ; preds = %32
br label %113
41: ; preds = %32
%42 = load i8*, i8** %11
%43 = load i32, i32* %8
%44 = sext i32 %43 to i64
%45 = getelementptr inbounds i8, i8* %42, i64 %44
%46 = load i8, i8* %45
%47 = zext i8 %46 to i32
%48 = icmp ne i32 %47, 65
br i1 %48, label %49, label %62
49: ; preds = %41
%50 = load i8*, i8** %11
%51 = load i32, i32* %8
%52 = sext i32 %51 to i64
%53 = getelementptr inbounds i8, i8* %50, i64 %52
%54 = load i8, i8* %53
%55 = zext i8 %54 to i64
%56 = getelementptr inbounds [256 x i8], [256 x i8]* %14, i64 0, i64 %55
%57 = load i8, i8* %56
%58 = zext i8 %57 to i32
%59 = icmp eq i32 %58, 0
br i1 %59, label %60, label %61
60: ; preds = %49
store i32 -1, i32* %4
br label %154
61: ; preds = %49
br label %62
62: ; preds = %61, %41
%63 = load i8*, i8** %11
%64 = load i32, i32* %8
%65 = sext i32 %64 to i64
%66 = getelementptr inbounds i8, i8* %63, i64 %65
%67 = load i8, i8* %66
%68 = zext i8 %67 to i64
%69 = getelementptr inbounds [256 x i8], [256 x i8]* %14, i64 0, i64 %68
%70 = load i8, i8* %69
%71 = zext i8 %70 to i32
%72 = bitcast %union.anon* %13 to i32*
%73 = load i32, i32* %72
%74 = add i32 %73, %71
store i32 %74, i32* %72
%75 = load i32, i32* %10
%76 = add nsw i32 %75, 1
store i32 %76, i32* %10
%77 = load i32, i32* %10
%78 = icmp slt i32 %77, 4
br i1 %78, label %79, label %83
79: ; preds = %62
%80 = bitcast %union.anon* %13 to i32*
%81 = load i32, i32* %80
%82 = shl i32 %81, 6
store i32 %82, i32* %80
br label %109
83: ; preds = %62
store i32 0, i32* %10
%84 = bitcast %union.anon* %13 to [4 x i8]*
%85 = getelementptr inbounds [4 x i8], [4 x i8]* %84, i64 0, i64 2
%86 = load i8, i8* %85
%87 = load i8*, i8** %12
%88 = load i32, i32* %9
%89 = add nsw i32 %88, 1
store i32 %89, i32* %9
%90 = sext i32 %88 to i64
%91 = getelementptr inbounds i8, i8* %87, i64 %90
store i8 %86, i8* %91
%92 = bitcast %union.anon* %13 to [4 x i8]*
%93 = getelementptr inbounds [4 x i8], [4 x i8]* %92, i64 0, i64 1
%94 = load i8, i8* %93
%95 = load i8*, i8** %12
%96 = load i32, i32* %9
%97 = add nsw i32 %96, 1
store i32 %97, i32* %9
%98 = sext i32 %96 to i64
%99 = getelementptr inbounds i8, i8* %95, i64 %98
store i8 %94, i8* %99
%100 = bitcast %union.anon* %13 to [4 x i8]*
%101 = getelementptr inbounds [4 x i8], [4 x i8]* %100, i64 0, i64 0
%102 = load i8, i8* %101
%103 = load i8*, i8** %12
%104 = load i32, i32* %9
%105 = add nsw i32 %104, 1
store i32 %105, i32* %9
%106 = sext i32 %104 to i64
%107 = getelementptr inbounds i8, i8* %103, i64 %106
store i8 %102, i8* %107
%108 = bitcast %union.anon* %13 to i32*
store i32 0, i32* %108
br label %109
109: ; preds = %83, %79
br label %110
110: ; preds = %109, %31
%111 = load i32, i32* %8
%112 = add nsw i32 %111, 1
store i32 %112, i32* %8
br label %19
113: ; preds = %40, %19
%114 = load i32, i32* %10
%115 = icmp eq i32 %114, 2
br i1 %115, label %116, label %128
116: ; preds = %113
%117 = bitcast %union.anon* %13 to i32*
%118 = load i32, i32* %117
%119 = lshr i32 %118, 6
store i32 %119, i32* %117
%120 = bitcast %union.anon* %13 to [4 x i8]*
%121 = getelementptr inbounds [4 x i8], [4 x i8]* %120, i64 0, i64 0
%122 = load i8, i8* %121
%123 = load i8*, i8** %12
%124 = load i32, i32* %9
%125 = add nsw i32 %124, 1
store i32 %125, i32* %9
%126 = sext i32 %124 to i64
%127 = getelementptr inbounds i8, i8* %123, i64 %126
store i8 %122, i8* %127
br label %152
128: ; preds = %113
%129 = load i32, i32* %10
%130 = icmp eq i32 %129, 3
br i1 %130, label %131, label %151
131: ; preds = %128
%132 = bitcast %union.anon* %13 to i32*
%133 = load i32, i32* %132
%134 = lshr i32 %133, 6
store i32 %134, i32* %132
%135 = bitcast %union.anon* %13 to [4 x i8]*
%136 = getelementptr inbounds [4 x i8], [4 x i8]* %135, i64 0, i64 1
%137 = load i8, i8* %136
%138 = load i8*, i8** %12
%139 = load i32, i32* %9
%140 = add nsw i32 %139, 1
store i32 %140, i32* %9
%141 = sext i32 %139 to i64
%142 = getelementptr inbounds i8, i8* %138, i64 %141
store i8 %137, i8* %142
%143 = bitcast %union.anon* %13 to [4 x i8]*
%144 = getelementptr inbounds [4 x i8], [4 x i8]* %143, i64 0, i64 0
%145 = load i8, i8* %144
%146 = load i8*, i8** %12
%147 = load i32, i32* %9
%148 = add nsw i32 %147, 1
store i32 %148, i32* %9
%149 = sext i32 %147 to i64
%150 = getelementptr inbounds i8, i8* %146, i64 %149
store i8 %145, i8* %150
br label %151
151: ; preds = %131, %128
br label %152
152: ; preds = %151, %116
%153 = load i32, i32* %9
store i32 %153, i32* %4
br label %154
154: ; preds = %152, %60
%155 = load i32, i32* %4
ret i32 %155
}

LLVM IR (-O2):
@__const.base64_dec.base64 = <{ [123 x i8], [133 x i8] }> <{ [123 x i8] c"\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00>\00\00\00?456789:;<=\00\00\00\00\00\00\00\00\01\02\03\04\05\06\07\08\09\0A\0B\0C\0D\0E\0F\10\11\12\13\14\15\16\17\18\19\00\00\00\00\00\00\1A\1B\1C\1D\1E\1F !\22#$%&'()*+,-./0123", [133 x i8] zeroinitializer }>
define i32 @base64_dec(i8* nocapture %0, i8* nocapture writeonly %1, i32 %2) {
%4 = icmp sgt i32 %2, 0
br i1 %4, label %5, label %101
5: ; preds = %3
%6 = zext i32 %2 to i64
br label %7
7: ; preds = %5, %58
%8 = phi i64 [ 0, %5 ], [ %64, %58 ]
%9 = phi i8 [ 0, %5 ], [ %63, %58 ]
%10 = phi i8 [ 0, %5 ], [ %62, %58 ]
%11 = phi i8 [ 0, %5 ], [ %61, %58 ]
%12 = phi i32 [ 0, %5 ], [ %60, %58 ]
%13 = phi i32 [ 0, %5 ], [ %59, %58 ]
%14 = getelementptr inbounds i8, i8* %0, i64 %8
%15 = load i8, i8* %14
%16 = icmp ult i8 %15, 33
br i1 %16, label %58, label %17
17: ; preds = %7
switch i8 %15, label %18 [
i8 61, label %66
i8 65, label %23
]
18: ; preds = %17
%19 = zext i8 %15 to i64
%20 = getelementptr inbounds [256 x i8], [256 x i8]* bitcast (<{ [123 x i8], [133 x i8] }>* @__const.base64_dec.base64 to [256 x i8]*), i64 0, i64 %19
%21 = load i8, i8* %20
%22 = icmp eq i8 %21, 0
br i1 %22, label %101, label %23
23: ; preds = %17, %18
%24 = phi i8 [ %21, %18 ], [ 0, %17 ]
%25 = zext i8 %24 to i32
%26 = zext i8 %11 to i32
%27 = shl nuw nsw i32 %26, 16
%28 = zext i8 %10 to i32
%29 = shl nuw nsw i32 %28, 8
%30 = or i32 %27, %29
%31 = zext i8 %9 to i32
%32 = or i32 %30, %31
%33 = add nuw nsw i32 %32, %25
%34 = icmp slt i32 %12, 3
br i1 %34, label %35, label %43
35: ; preds = %23
%36 = add nsw i32 %12, 1
%37 = trunc i32 %33 to i8
%38 = shl i8 %37, 6
%39 = lshr i32 %33, 2
%40 = trunc i32 %39 to i8
%41 = lshr i32 %33, 10
%42 = trunc i32 %41 to i8
br label %58
43: ; preds = %23
%44 = trunc i32 %33 to i8
%45 = lshr i32 %33, 8
%46 = trunc i32 %45 to i8
%47 = lshr i32 %33, 16
%48 = trunc i32 %47 to i8
%49 = add nsw i32 %13, 1
%50 = sext i32 %13 to i64
%51 = getelementptr inbounds i8, i8* %1, i64 %50
store i8 %48, i8* %51
%52 = add nsw i32 %13, 2
%53 = sext i32 %49 to i64
%54 = getelementptr inbounds i8, i8* %1, i64 %53
store i8 %46, i8* %54
%55 = add nsw i32 %13, 3
%56 = sext i32 %52 to i64
%57 = getelementptr inbounds i8, i8* %1, i64 %56
store i8 %44, i8* %57
br label %58
58: ; preds = %35, %43, %7
%59 = phi i32 [ %13, %7 ], [ %13, %35 ], [ %55, %43 ]
%60 = phi i32 [ %12, %7 ], [ %36, %35 ], [ 0, %43 ]
%61 = phi i8 [ %11, %7 ], [ %42, %35 ], [ 0, %43 ]
%62 = phi i8 [ %10, %7 ], [ %40, %35 ], [ 0, %43 ]
%63 = phi i8 [ %9, %7 ], [ %38, %35 ], [ 0, %43 ]
%64 = add nuw nsw i64 %8, 1
%65 = icmp eq i64 %64, %6
br i1 %65, label %66, label %7
66: ; preds = %58, %17
%67 = phi i32 [ %59, %58 ], [ %13, %17 ]
%68 = phi i32 [ %60, %58 ], [ %12, %17 ]
%69 = phi i8 [ %61, %58 ], [ %11, %17 ]
%70 = phi i8 [ %62, %58 ], [ %10, %17 ]
%71 = phi i8 [ %63, %58 ], [ %9, %17 ]
switch i32 %68, label %101 [
i32 2, label %72
i32 3, label %79
]
72: ; preds = %66
%73 = zext i8 %70 to i16
%74 = shl nuw i16 %73, 8
%75 = zext i8 %71 to i16
%76 = or i16 %74, %75
%77 = lshr i16 %76, 6
%78 = trunc i16 %77 to i8
br label %94
79: ; preds = %66
%80 = zext i8 %69 to i32
%81 = shl nuw nsw i32 %80, 16
%82 = zext i8 %70 to i32
%83 = shl nuw nsw i32 %82, 8
%84 = or i32 %83, %81
%85 = zext i8 %71 to i32
%86 = or i32 %83, %85
%87 = lshr i32 %86, 6
%88 = trunc i32 %87 to i8
%89 = lshr i32 %84, 14
%90 = trunc i32 %89 to i8
%91 = add nsw i32 %67, 1
%92 = sext i32 %67 to i64
%93 = getelementptr inbounds i8, i8* %1, i64 %92
store i8 %90, i8* %93
br label %94
94: ; preds = %79, %72
%95 = phi i32 [ 1, %72 ], [ 2, %79 ]
%96 = phi i32 [ %67, %72 ], [ %91, %79 ]
%97 = phi i8 [ %78, %72 ], [ %88, %79 ]
%98 = add nsw i32 %67, %95
%99 = sext i32 %96 to i64
%100 = getelementptr inbounds i8, i8* %1, i64 %99
store i8 %97, i8* %100
br label %101
101: ; preds = %18, %94, %3, %66
%102 = phi i32 [ %67, %66 ], [ 0, %3 ], [ %98, %94 ], [ -1, %18 ]
ret i32 %102
}