int decBase64(unsigned char *out, char *in) {
  static int map[256] = {
      -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
      -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
      -1, -1, -1, -1, -1, -1, -1, 62, -1, -1, -1, 63, 52, 53, 54, 55, 56, 57,
      58, 59, 60, 61, -1, -1, -1, -1, -1, -1, -1, 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, -1, -1, -1, -1, -1, -1, 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, -1, -1, -1,
      -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
      -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
      -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
      -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
      -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
      -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
      -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
      -1, -1, -1, -1,
  };
  int state;
  unsigned int val;
  int digit;
  val = 0;
  state = 0;
  while (*in != 0 && *in != '=') {
    digit = map[(unsigned char)*in++];
    if (digit < 0)
      return -1;
    val = (val << 6) | digit;
    if (state == 1)
      *out++ = (unsigned char)(val >> 4);
    else if (state == 2)
      *out++ = (unsigned char)(val >> 2);
    else if (state == 3)
      *out++ = (unsigned char)val;
    state = (state + 1) & 3;
  }
  return 0;
}


x86 assembly (clang, -O0):
<decBase64>:
push   %rbp
mov    %rsp,%rbp
mov    %rdi,-0x10(%rbp)
mov    %rsi,-0x18(%rbp)
movl   $0x0,-0x20(%rbp)
movl   $0x0,-0x1c(%rbp)
mov    -0x18(%rbp),%rax
movsbl (%rax),%ecx
xor    %eax,%eax
cmp    $0x0,%ecx
mov    %al,-0x25(%rbp)
je     113f <decBase64+0x3f>
mov    -0x18(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x3d,%eax
setne  %al
mov    %al,-0x25(%rbp)
mov    -0x25(%rbp),%al
test   $0x1,%al
jne    114f <decBase64+0x4f>
jmp    121d <decBase64+0x11d>
mov    -0x18(%rbp),%rax
mov    %rax,%rcx
add    $0x1,%rcx
mov    %rcx,-0x18(%rbp)
movzbl (%rax),%eax
mov    %eax,%ecx
lea    0x2ec6(%rip),%rax
mov    (%rax,%rcx,4),%eax
mov    %eax,-0x24(%rbp)
cmpl   $0x0,-0x24(%rbp)
jge    1186 <decBase64+0x86>
movl   $0xffffffff,-0x4(%rbp)
jmp    1224 <decBase64+0x124>
mov    -0x20(%rbp),%eax
shl    $0x6,%eax
or     -0x24(%rbp),%eax
mov    %eax,-0x20(%rbp)
cmpl   $0x1,-0x1c(%rbp)
jne    11ba <decBase64+0xba>
mov    -0x20(%rbp),%eax
shr    $0x4,%eax
mov    %al,%cl
mov    -0x10(%rbp),%rax
mov    %rax,%rdx
add    $0x1,%rdx
mov    %rdx,-0x10(%rbp)
mov    %cl,(%rax)
jmp    120c <decBase64+0x10c>
cmpl   $0x2,-0x1c(%rbp)
jne    11e2 <decBase64+0xe2>
mov    -0x20(%rbp),%eax
shr    $0x2,%eax
mov    %al,%cl
mov    -0x10(%rbp),%rax
mov    %rax,%rdx
add    $0x1,%rdx
mov    %rdx,-0x10(%rbp)
mov    %cl,(%rax)
jmp    1207 <decBase64+0x107>
cmpl   $0x3,-0x1c(%rbp)
jne    1202 <decBase64+0x102>
mov    -0x20(%rbp),%eax
mov    %al,%cl
mov    -0x10(%rbp),%rax
mov    %rax,%rdx
add    $0x1,%rdx
mov    %rdx,-0x10(%rbp)
mov    %cl,(%rax)
jmp    1207 <decBase64+0x107>
jmp    120c <decBase64+0x10c>
mov    -0x1c(%rbp),%eax
add    $0x1,%eax
and    $0x3,%eax
mov    %eax,-0x1c(%rbp)
jmp    111a <decBase64+0x1a>
movl   $0x0,-0x4(%rbp)
mov    -0x4(%rbp),%eax
pop    %rbp
ret

x86 assembly (clang, -O2):
<decBase64>:
xor    %eax,%eax
lea    0xef7(%rip),%r8
xor    %edx,%edx
xor    %r9d,%r9d
jmp    1126 <decBase64+0x26>
mov    %r9d,%ecx
shr    $0x2,%ecx
mov    %cl,(%rdi)
add    $0x1,%rdi
add    $0x1,%rsi
add    $0x1,%edx
and    $0x3,%edx
movzbl (%rsi),%ecx
test   %rcx,%rcx
je     1161 <decBase64+0x61>
cmp    $0x3d,%cl
je     1161 <decBase64+0x61>
mov    (%r8,%rcx,4),%ecx
test   %ecx,%ecx
js     115c <decBase64+0x5c>
shl    $0x6,%r9d
or     %ecx,%r9d
mov    %r9d,%ecx
cmp    $0x3,%edx
je     1116 <decBase64+0x16>
cmp    $0x2,%edx
je     1110 <decBase64+0x10>
cmp    $0x1,%edx
jne    111c <decBase64+0x1c>
mov    %r9d,%ecx
shr    $0x4,%ecx
jmp    1116 <decBase64+0x16>
mov    $0xffffffff,%eax
ret

LLVM IR (-O0):
@decBase64.map = internal global [256 x i32] [i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 62, i32 -1, i32 -1, i32 -1, i32 63, i32 52, i32 53, i32 54, i32 55, i32 56, i32 57, i32 58, i32 59, i32 60, i32 61, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15, i32 16, i32 17, i32 18, i32 19, i32 20, i32 21, i32 22, i32 23, i32 24, i32 25, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 26, i32 27, i32 28, i32 29, i32 30, i32 31, i32 32, i32 33, i32 34, i32 35, i32 36, i32 37, i32 38, i32 39, i32 40, i32 41, i32 42, i32 43, i32 44, i32 45, i32 46, i32 47, i32 48, i32 49, i32 50, i32 51, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1]
define i32 @decBase64(i8* %0, i8* %1) {
%3 = alloca i32
%4 = alloca i8*
%5 = alloca i8*
%6 = alloca i32
%7 = alloca i32
%8 = alloca i32
store i8* %0, i8** %4
store i8* %1, i8** %5
store i32 0, i32* %7
store i32 0, i32* %6
br label %9
9: ; preds = %63, %2
%10 = load i8*, i8** %5
%11 = load i8, i8* %10
%12 = sext i8 %11 to i32
%13 = icmp ne i32 %12, 0
br i1 %13, label %14, label %19
14: ; preds = %9
%15 = load i8*, i8** %5
%16 = load i8, i8* %15
%17 = sext i8 %16 to i32
%18 = icmp ne i32 %17, 61
br label %19
19: ; preds = %14, %9
%20 = phi i1 [ false, %9 ], [ %18, %14 ]
br i1 %20, label %21, label %67
21: ; preds = %19
%22 = load i8*, i8** %5
%23 = getelementptr inbounds i8, i8* %22, i32 1
store i8* %23, i8** %5
%24 = load i8, i8* %22
%25 = zext i8 %24 to i64
%26 = getelementptr inbounds [256 x i32], [256 x i32]* @decBase64.map, i64 0, i64 %25
%27 = load i32, i32* %26
store i32 %27, i32* %8
%28 = load i32, i32* %8
%29 = icmp slt i32 %28, 0
br i1 %29, label %30, label %31
30: ; preds = %21
store i32 -1, i32* %3
br label %68
31: ; preds = %21
%32 = load i32, i32* %7
%33 = shl i32 %32, 6
%34 = load i32, i32* %8
%35 = or i32 %33, %34
store i32 %35, i32* %7
%36 = load i32, i32* %6
%37 = icmp eq i32 %36, 1
br i1 %37, label %38, label %44
38: ; preds = %31
%39 = load i32, i32* %7
%40 = lshr i32 %39, 4
%41 = trunc i32 %40 to i8
%42 = load i8*, i8** %4
%43 = getelementptr inbounds i8, i8* %42, i32 1
store i8* %43, i8** %4
store i8 %41, i8* %42
br label %63
44: ; preds = %31
%45 = load i32, i32* %6
%46 = icmp eq i32 %45, 2
br i1 %46, label %47, label %53
47: ; preds = %44
%48 = load i32, i32* %7
%49 = lshr i32 %48, 2
%50 = trunc i32 %49 to i8
%51 = load i8*, i8** %4
%52 = getelementptr inbounds i8, i8* %51, i32 1
store i8* %52, i8** %4
store i8 %50, i8* %51
br label %62
53: ; preds = %44
%54 = load i32, i32* %6
%55 = icmp eq i32 %54, 3
br i1 %55, label %56, label %61
56: ; preds = %53
%57 = load i32, i32* %7
%58 = trunc i32 %57 to i8
%59 = load i8*, i8** %4
%60 = getelementptr inbounds i8, i8* %59, i32 1
store i8* %60, i8** %4
store i8 %58, i8* %59
br label %61
61: ; preds = %56, %53
br label %62
62: ; preds = %61, %47
br label %63
63: ; preds = %62, %38
%64 = load i32, i32* %6
%65 = add nsw i32 %64, 1
%66 = and i32 %65, 3
store i32 %66, i32* %6
br label %9
67: ; preds = %19
store i32 0, i32* %3
br label %68
68: ; preds = %67, %30
%69 = load i32, i32* %3
ret i32 %69
}

LLVM IR (-O2):
@decBase64.map = internal unnamed_addr constant [256 x i32] [i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 62, i32 -1, i32 -1, i32 -1, i32 63, i32 52, i32 53, i32 54, i32 55, i32 56, i32 57, i32 58, i32 59, i32 60, i32 61, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15, i32 16, i32 17, i32 18, i32 19, i32 20, i32 21, i32 22, i32 23, i32 24, i32 25, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 26, i32 27, i32 28, i32 29, i32 30, i32 31, i32 32, i32 33, i32 34, i32 35, i32 36, i32 37, i32 38, i32 39, i32 40, i32 41, i32 42, i32 43, i32 44, i32 45, i32 46, i32 47, i32 48, i32 49, i32 50, i32 51, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1]
define i32 @decBase64(i8* nocapture writeonly %0, i8* nocapture %1) {
br label %3
3: ; preds = %26, %2
%4 = phi i8* [ %0, %2 ], [ %27, %26 ]
%5 = phi i8* [ %1, %2 ], [ %10, %26 ]
%6 = phi i32 [ 0, %2 ], [ %29, %26 ]
%7 = phi i32 [ 0, %2 ], [ %17, %26 ]
%8 = load i8, i8* %5
switch i8 %8, label %9 [
i8 0, label %30
i8 61, label %30
]
9: ; preds = %3
%10 = getelementptr inbounds i8, i8* %5, i64 1
%11 = zext i8 %8 to i64
%12 = getelementptr inbounds [256 x i32], [256 x i32]* @decBase64.map, i64 0, i64 %11
%13 = load i32, i32* %12
%14 = icmp slt i32 %13, 0
br i1 %14, label %30, label %15
15: ; preds = %9
%16 = shl i32 %7, 6
%17 = or i32 %13, %16
switch i32 %6, label %26 [
i32 1, label %18
i32 2, label %20
i32 3, label %22
]
18: ; preds = %15
%19 = lshr i32 %17, 4
br label %22
20: ; preds = %15
%21 = lshr i32 %17, 2
br label %22
22: ; preds = %15, %18, %20
%23 = phi i32 [ %21, %20 ], [ %19, %18 ], [ %17, %15 ]
%24 = trunc i32 %23 to i8
%25 = getelementptr inbounds i8, i8* %4, i64 1
store i8 %24, i8* %4
br label %26
26: ; preds = %22, %15
%27 = phi i8* [ %4, %15 ], [ %25, %22 ]
%28 = add nuw nsw i32 %6, 1
%29 = and i32 %28, 3
br label %3
30: ; preds = %3, %3, %9
%31 = phi i32 [ -1, %9 ], [ 0, %3 ], [ 0, %3 ]
ret i32 %31
}