int decode_block(unsigned char *in, unsigned char *out) {
  unsigned char *c = in;
  int i = 0, j = 0;
  char temp[4] = {0, 0, 0, 0};
  while (i < 4 && c && *c) {
    if (*c != ' ') {
      if (*c == '+') {
        temp[i] = 62;
      } else if (*c == '/') {
        temp[i] = 63;
      } else if (*c == '=') {
        temp[i] = 0;
      } else if (*c >= '0' && *c <= '9') {
        temp[i] = *c + 4;
      } else if (*c >= 'A' && *c <= 'Z') {
        temp[i] = *c - 65;
      } else if (*c >= 'a' && *c <= 'z') {
        temp[i] = *c - 71;
      } else if (*c == ' ') {
        j++;
      } else {
        break;
      }
      i++;
    }
    j++;
    c++;
  }
  out[0] = (temp[0] << 2) + (temp[1] >> 4);
  out[1] = (temp[1] << 4) + (temp[2] >> 2);
  out[2] = (temp[2] << 6) + (temp[3] >> 0);
  return j;
}


x86 assembly (clang, -O0):
<decode_block>:
push   %rbp
mov    %rsp,%rbp
sub    $0x30,%rsp
mov    %rdi,-0x8(%rbp)
mov    %rsi,-0x10(%rbp)
mov    -0x8(%rbp),%rax
mov    %rax,-0x18(%rbp)
movl   $0x0,-0x1c(%rbp)
movl   $0x0,-0x20(%rbp)
lea    -0x24(%rbp),%rdi
xor    %esi,%esi
mov    $0x4,%edx
call   1030 <memset@plt>
xor    %eax,%eax
cmpl   $0x4,-0x1c(%rbp)
mov    %al,-0x25(%rbp)
jge    1175 <decode_block+0x65>
xor    %eax,%eax
cmpq   $0x0,-0x18(%rbp)
mov    %al,-0x25(%rbp)
je     1175 <decode_block+0x65>
mov    -0x18(%rbp),%rax
movzbl (%rax),%eax
cmp    $0x0,%eax
setne  %al
mov    %al,-0x25(%rbp)
mov    -0x25(%rbp),%al
test   $0x1,%al
jne    1185 <decode_block+0x75>
jmp    12fe <decode_block+0x1ee>
mov    -0x18(%rbp),%rax
movzbl (%rax),%eax
cmp    $0x20,%eax
je     12e4 <decode_block+0x1d4>
mov    -0x18(%rbp),%rax
movzbl (%rax),%eax
cmp    $0x2b,%eax
jne    11b3 <decode_block+0xa3>
movslq -0x1c(%rbp),%rax
movb   $0x3e,-0x24(%rbp,%rax,1)
jmp    12db <decode_block+0x1cb>
mov    -0x18(%rbp),%rax
movzbl (%rax),%eax
cmp    $0x2f,%eax
jne    11d1 <decode_block+0xc1>
movslq -0x1c(%rbp),%rax
movb   $0x3f,-0x24(%rbp,%rax,1)
jmp    12d6 <decode_block+0x1c6>
mov    -0x18(%rbp),%rax
movzbl (%rax),%eax
cmp    $0x3d,%eax
jne    11ef <decode_block+0xdf>
movslq -0x1c(%rbp),%rax
movb   $0x0,-0x24(%rbp,%rax,1)
jmp    12d1 <decode_block+0x1c1>
mov    -0x18(%rbp),%rax
movzbl (%rax),%eax
cmp    $0x30,%eax
jl     1228 <decode_block+0x118>
mov    -0x18(%rbp),%rax
movzbl (%rax),%eax
cmp    $0x39,%eax
jg     1228 <decode_block+0x118>
mov    -0x18(%rbp),%rax
movzbl (%rax),%eax
add    $0x4,%eax
mov    %al,%cl
movslq -0x1c(%rbp),%rax
mov    %cl,-0x24(%rbp,%rax,1)
jmp    12cc <decode_block+0x1bc>
mov    -0x18(%rbp),%rax
movzbl (%rax),%eax
cmp    $0x41,%eax
jl     1261 <decode_block+0x151>
mov    -0x18(%rbp),%rax
movzbl (%rax),%eax
cmp    $0x5a,%eax
jg     1261 <decode_block+0x151>
mov    -0x18(%rbp),%rax
movzbl (%rax),%eax
sub    $0x41,%eax
mov    %al,%cl
movslq -0x1c(%rbp),%rax
mov    %cl,-0x24(%rbp,%rax,1)
jmp    12c7 <decode_block+0x1b7>
mov    -0x18(%rbp),%rax
movzbl (%rax),%eax
cmp    $0x61,%eax
jl     129a <decode_block+0x18a>
mov    -0x18(%rbp),%rax
movzbl (%rax),%eax
cmp    $0x7a,%eax
jg     129a <decode_block+0x18a>
mov    -0x18(%rbp),%rax
movzbl (%rax),%eax
sub    $0x47,%eax
mov    %al,%cl
movslq -0x1c(%rbp),%rax
mov    %cl,-0x24(%rbp,%rax,1)
jmp    12c2 <decode_block+0x1b2>
mov    -0x18(%rbp),%rax
movzbl (%rax),%eax
cmp    $0x20,%eax
jne    12b8 <decode_block+0x1a8>
mov    -0x20(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x20(%rbp)
jmp    12bd <decode_block+0x1ad>
jmp    12fe <decode_block+0x1ee>
jmp    12c2 <decode_block+0x1b2>
jmp    12c7 <decode_block+0x1b7>
jmp    12cc <decode_block+0x1bc>
jmp    12d1 <decode_block+0x1c1>
jmp    12d6 <decode_block+0x1c6>
jmp    12db <decode_block+0x1cb>
mov    -0x1c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x1c(%rbp)
mov    -0x20(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x20(%rbp)
mov    -0x18(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x18(%rbp)
jmp    1146 <decode_block+0x36>
movsbl -0x24(%rbp),%eax
shl    $0x2,%eax
movsbl -0x23(%rbp),%ecx
sar    $0x4,%ecx
add    %ecx,%eax
mov    %al,%cl
mov    -0x10(%rbp),%rax
mov    %cl,(%rax)
movsbl -0x23(%rbp),%eax
shl    $0x4,%eax
movsbl -0x22(%rbp),%ecx
sar    $0x2,%ecx
add    %ecx,%eax
mov    %al,%cl
mov    -0x10(%rbp),%rax
mov    %cl,0x1(%rax)
movsbl -0x22(%rbp),%eax
shl    $0x6,%eax
movsbl -0x21(%rbp),%ecx
sar    $0x0,%ecx
add    %ecx,%eax
mov    %al,%cl
mov    -0x10(%rbp),%rax
mov    %cl,0x2(%rax)
mov    -0x20(%rbp),%eax
add    $0x30,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<decode_block>:
movl   $0x0,-0x4(%rsp)
test   %rdi,%rdi
je     11c9 <decode_block+0xc9>
xor    %eax,%eax
lea    0xee6(%rip),%r8
xor    %r10d,%r10d
jmp    1139 <decode_block+0x39>
nop
movslq %r10d,%rcx
movb   $0x0,-0x4(%rsp,%rcx,1)
add    $0x1,%r10d
add    $0x1,%eax
add    $0x1,%rdi
cmp    $0x4,%r10d
jge    11b0 <decode_block+0xb0>
movzbl (%rdi),%ecx
lea    -0x20(%rcx),%edx
cmp    $0x1d,%dl
ja     116a <decode_block+0x6a>
movzbl %dl,%edx
movslq (%r8,%rdx,4),%rdx
add    %r8,%rdx
jmp    *%rdx
movslq %r10d,%rcx
movb   $0x3e,-0x4(%rsp,%rcx,1)
jmp    1128 <decode_block+0x28>
nopw   0x0(%rax,%rax,1)
movslq %r10d,%rcx
movb   $0x3f,-0x4(%rsp,%rcx,1)
jmp    1128 <decode_block+0x28>
test   %cl,%cl
je     11b0 <decode_block+0xb0>
lea    -0x30(%rcx),%edx
cmp    $0x9,%dl
ja     117b <decode_block+0x7b>
add    $0x4,%cl
jmp    119a <decode_block+0x9a>
lea    -0x41(%rcx),%r9d
cmp    $0x19,%r9b
ja     118f <decode_block+0x8f>
movslq %r10d,%rcx
mov    %r9b,-0x4(%rsp,%rcx,1)
jmp    1128 <decode_block+0x28>
lea    -0x61(%rcx),%edx
cmp    $0x19,%dl
ja     11a3 <decode_block+0xa3>
add    $0xb9,%cl
movslq %r10d,%rdx
mov    %cl,-0x4(%rsp,%rdx,1)
jmp    1128 <decode_block+0x28>
cmp    $0x20,%cl
jne    11b0 <decode_block+0xb0>
add    $0x1,%eax
jmp    1128 <decode_block+0x28>
mov    -0x4(%rsp),%r9b
mov    -0x3(%rsp),%dil
mov    -0x2(%rsp),%dl
mov    -0x1(%rsp),%r8b
shl    $0x2,%r9b
jmp    11d5 <decode_block+0xd5>
xor    %r8d,%r8d
xor    %edx,%edx
xor    %edi,%edi
xor    %r9d,%r9d
xor    %eax,%eax
mov    %edi,%ecx
sar    $0x4,%cl
add    %r9b,%cl
mov    %cl,(%rsi)
shl    $0x4,%dil
mov    %edx,%ecx
sar    $0x2,%cl
add    %dil,%cl
mov    %cl,0x1(%rsi)
shl    $0x6,%dl
add    %r8b,%dl
mov    %dl,0x2(%rsi)
ret

LLVM IR (-O0):
define i32 @decode_block(i8* %0, i8* %1) {
%3 = alloca i8*
%4 = alloca i8*
%5 = alloca i8*
%6 = alloca i32
%7 = alloca i32
%8 = alloca [4 x i8]
store i8* %0, i8** %3
store i8* %1, i8** %4
%9 = load i8*, i8** %3
store i8* %9, i8** %5
store i32 0, i32* %6
store i32 0, i32* %7
%10 = bitcast [4 x i8]* %8 to i8*
br label %11
11: ; preds = %131, %2
%12 = load i32, i32* %6
%13 = icmp slt i32 %12, 4
br i1 %13, label %14, label %22
14: ; preds = %11
%15 = load i8*, i8** %5
%16 = icmp ne i8* %15, null
br i1 %16, label %17, label %22
17: ; preds = %14
%18 = load i8*, i8** %5
%19 = load i8, i8* %18
%20 = zext i8 %19 to i32
%21 = icmp ne i32 %20, 0
br label %22
22: ; preds = %17, %14, %11
%23 = phi i1 [ false, %14 ], [ false, %11 ], [ %21, %17 ]
br i1 %23, label %24, label %136
24: ; preds = %22
%25 = load i8*, i8** %5
%26 = load i8, i8* %25
%27 = zext i8 %26 to i32
%28 = icmp ne i32 %27, 32
br i1 %28, label %29, label %131
29: ; preds = %24
%30 = load i8*, i8** %5
%31 = load i8, i8* %30
%32 = zext i8 %31 to i32
%33 = icmp eq i32 %32, 43
br i1 %33, label %34, label %38
34: ; preds = %29
%35 = load i32, i32* %6
%36 = sext i32 %35 to i64
%37 = getelementptr inbounds [4 x i8], [4 x i8]* %8, i64 0, i64 %36
store i8 62, i8* %37
br label %128
38: ; preds = %29
%39 = load i8*, i8** %5
%40 = load i8, i8* %39
%41 = zext i8 %40 to i32
%42 = icmp eq i32 %41, 47
br i1 %42, label %43, label %47
43: ; preds = %38
%44 = load i32, i32* %6
%45 = sext i32 %44 to i64
%46 = getelementptr inbounds [4 x i8], [4 x i8]* %8, i64 0, i64 %45
store i8 63, i8* %46
br label %127
47: ; preds = %38
%48 = load i8*, i8** %5
%49 = load i8, i8* %48
%50 = zext i8 %49 to i32
%51 = icmp eq i32 %50, 61
br i1 %51, label %52, label %56
52: ; preds = %47
%53 = load i32, i32* %6
%54 = sext i32 %53 to i64
%55 = getelementptr inbounds [4 x i8], [4 x i8]* %8, i64 0, i64 %54
store i8 0, i8* %55
br label %126
56: ; preds = %47
%57 = load i8*, i8** %5
%58 = load i8, i8* %57
%59 = zext i8 %58 to i32
%60 = icmp sge i32 %59, 48
br i1 %60, label %61, label %75
61: ; preds = %56
%62 = load i8*, i8** %5
%63 = load i8, i8* %62
%64 = zext i8 %63 to i32
%65 = icmp sle i32 %64, 57
br i1 %65, label %66, label %75
66: ; preds = %61
%67 = load i8*, i8** %5
%68 = load i8, i8* %67
%69 = zext i8 %68 to i32
%70 = add nsw i32 %69, 4
%71 = trunc i32 %70 to i8
%72 = load i32, i32* %6
%73 = sext i32 %72 to i64
%74 = getelementptr inbounds [4 x i8], [4 x i8]* %8, i64 0, i64 %73
store i8 %71, i8* %74
br label %125
75: ; preds = %61, %56
%76 = load i8*, i8** %5
%77 = load i8, i8* %76
%78 = zext i8 %77 to i32
%79 = icmp sge i32 %78, 65
br i1 %79, label %80, label %94
80: ; preds = %75
%81 = load i8*, i8** %5
%82 = load i8, i8* %81
%83 = zext i8 %82 to i32
%84 = icmp sle i32 %83, 90
br i1 %84, label %85, label %94
85: ; preds = %80
%86 = load i8*, i8** %5
%87 = load i8, i8* %86
%88 = zext i8 %87 to i32
%89 = sub nsw i32 %88, 65
%90 = trunc i32 %89 to i8
%91 = load i32, i32* %6
%92 = sext i32 %91 to i64
%93 = getelementptr inbounds [4 x i8], [4 x i8]* %8, i64 0, i64 %92
store i8 %90, i8* %93
br label %124
94: ; preds = %80, %75
%95 = load i8*, i8** %5
%96 = load i8, i8* %95
%97 = zext i8 %96 to i32
%98 = icmp sge i32 %97, 97
br i1 %98, label %99, label %113
99: ; preds = %94
%100 = load i8*, i8** %5
%101 = load i8, i8* %100
%102 = zext i8 %101 to i32
%103 = icmp sle i32 %102, 122
br i1 %103, label %104, label %113
104: ; preds = %99
%105 = load i8*, i8** %5
%106 = load i8, i8* %105
%107 = zext i8 %106 to i32
%108 = sub nsw i32 %107, 71
%109 = trunc i32 %108 to i8
%110 = load i32, i32* %6
%111 = sext i32 %110 to i64
%112 = getelementptr inbounds [4 x i8], [4 x i8]* %8, i64 0, i64 %111
store i8 %109, i8* %112
br label %123
113: ; preds = %99, %94
%114 = load i8*, i8** %5
%115 = load i8, i8* %114
%116 = zext i8 %115 to i32
%117 = icmp eq i32 %116, 32
br i1 %117, label %118, label %121
118: ; preds = %113
%119 = load i32, i32* %7
%120 = add nsw i32 %119, 1
store i32 %120, i32* %7
br label %122
121: ; preds = %113
br label %136
122: ; preds = %118
br label %123
123: ; preds = %122, %104
br label %124
124: ; preds = %123, %85
br label %125
125: ; preds = %124, %66
br label %126
126: ; preds = %125, %52
br label %127
127: ; preds = %126, %43
br label %128
128: ; preds = %127, %34
%129 = load i32, i32* %6
%130 = add nsw i32 %129, 1
store i32 %130, i32* %6
br label %131
131: ; preds = %128, %24
%132 = load i32, i32* %7
%133 = add nsw i32 %132, 1
store i32 %133, i32* %7
%134 = load i8*, i8** %5
%135 = getelementptr inbounds i8, i8* %134, i32 1
store i8* %135, i8** %5
br label %11
136: ; preds = %121, %22
%137 = getelementptr inbounds [4 x i8], [4 x i8]* %8, i64 0, i64 0
%138 = load i8, i8* %137
%139 = sext i8 %138 to i32
%140 = shl i32 %139, 2
%141 = getelementptr inbounds [4 x i8], [4 x i8]* %8, i64 0, i64 1
%142 = load i8, i8* %141
%143 = sext i8 %142 to i32
%144 = ashr i32 %143, 4
%145 = add nsw i32 %140, %144
%146 = trunc i32 %145 to i8
%147 = load i8*, i8** %4
%148 = getelementptr inbounds i8, i8* %147, i64 0
store i8 %146, i8* %148
%149 = getelementptr inbounds [4 x i8], [4 x i8]* %8, i64 0, i64 1
%150 = load i8, i8* %149
%151 = sext i8 %150 to i32
%152 = shl i32 %151, 4
%153 = getelementptr inbounds [4 x i8], [4 x i8]* %8, i64 0, i64 2
%154 = load i8, i8* %153
%155 = sext i8 %154 to i32
%156 = ashr i32 %155, 2
%157 = add nsw i32 %152, %156
%158 = trunc i32 %157 to i8
%159 = load i8*, i8** %4
%160 = getelementptr inbounds i8, i8* %159, i64 1
store i8 %158, i8* %160
%161 = getelementptr inbounds [4 x i8], [4 x i8]* %8, i64 0, i64 2
%162 = load i8, i8* %161
%163 = sext i8 %162 to i32
%164 = shl i32 %163, 6
%165 = getelementptr inbounds [4 x i8], [4 x i8]* %8, i64 0, i64 3
%166 = load i8, i8* %165
%167 = sext i8 %166 to i32
%168 = ashr i32 %167, 0
%169 = add nsw i32 %164, %168
%170 = trunc i32 %169 to i8
%171 = load i8*, i8** %4
%172 = getelementptr inbounds i8, i8* %171, i64 2
store i8 %170, i8* %172
%173 = load i32, i32* %7
ret i32 %173
}

LLVM IR (-O2):
define i32 @decode_block(i8* %0, i8* nocapture writeonly %1) {
%3 = alloca i32
%4 = bitcast i32* %3 to [4 x i8]*
%5 = bitcast i32* %3 to i8*
store i32 0, i32* %3
%6 = icmp eq i8* %0, null
br i1 %6, label %64, label %7
7: ; preds = %2, %48
%8 = phi i32 [ %51, %48 ], [ 0, %2 ]
%9 = phi i32 [ %49, %48 ], [ 0, %2 ]
%10 = phi i8* [ %52, %48 ], [ %0, %2 ]
%11 = load i8, i8* %10
switch i8 %11, label %21 [
i8 0, label %54
i8 32, label %48
i8 43, label %12
i8 47, label %15
i8 61, label %18
]
12: ; preds = %7
%13 = sext i32 %9 to i64
%14 = getelementptr inbounds [4 x i8], [4 x i8]* %4, i64 0, i64 %13
store i8 62, i8* %14
br label %45
15: ; preds = %7
%16 = sext i32 %9 to i64
%17 = getelementptr inbounds [4 x i8], [4 x i8]* %4, i64 0, i64 %16
store i8 63, i8* %17
br label %45
18: ; preds = %7
%19 = sext i32 %9 to i64
%20 = getelementptr inbounds [4 x i8], [4 x i8]* %4, i64 0, i64 %19
store i8 0, i8* %20
br label %45
21: ; preds = %7
%22 = add i8 %11, -48
%23 = icmp ult i8 %22, 10
br i1 %23, label %24, label %28
24: ; preds = %21
%25 = add nuw nsw i8 %11, 4
%26 = sext i32 %9 to i64
%27 = getelementptr inbounds [4 x i8], [4 x i8]* %4, i64 0, i64 %26
store i8 %25, i8* %27
br label %45
28: ; preds = %21
%29 = add i8 %11, -65
%30 = icmp ult i8 %29, 26
br i1 %30, label %31, label %34
31: ; preds = %28
%32 = sext i32 %9 to i64
%33 = getelementptr inbounds [4 x i8], [4 x i8]* %4, i64 0, i64 %32
store i8 %29, i8* %33
br label %45
34: ; preds = %28
%35 = add i8 %11, -97
%36 = icmp ult i8 %35, 26
br i1 %36, label %37, label %41
37: ; preds = %34
%38 = add nsw i8 %11, -71
%39 = sext i32 %9 to i64
%40 = getelementptr inbounds [4 x i8], [4 x i8]* %4, i64 0, i64 %39
store i8 %38, i8* %40
br label %45
41: ; preds = %34
%42 = icmp eq i8 %11, 32
br i1 %42, label %43, label %54
43: ; preds = %41
%44 = add nsw i32 %8, 1
br label %45
45: ; preds = %15, %24, %37, %43, %31, %18, %12
%46 = phi i32 [ %8, %12 ], [ %8, %15 ], [ %8, %18 ], [ %8, %24 ], [ %8, %31 ], [ %8, %37 ], [ %44, %43 ]
%47 = add nsw i32 %9, 1
br label %48
48: ; preds = %7, %45
%49 = phi i32 [ %47, %45 ], [ %9, %7 ]
%50 = phi i32 [ %46, %45 ], [ %8, %7 ]
%51 = add nsw i32 %50, 1
%52 = getelementptr inbounds i8, i8* %10, i64 1
%53 = icmp slt i32 %49, 4
br i1 %53, label %7, label %54
54: ; preds = %7, %48, %41
%55 = phi i32 [ %8, %41 ], [ %51, %48 ], [ %8, %7 ]
%56 = load i8, i8* %5
%57 = getelementptr inbounds [4 x i8], [4 x i8]* %4, i64 0, i64 1
%58 = load i8, i8* %57
%59 = getelementptr inbounds [4 x i8], [4 x i8]* %4, i64 0, i64 2
%60 = load i8, i8* %59
%61 = getelementptr inbounds [4 x i8], [4 x i8]* %4, i64 0, i64 3
%62 = load i8, i8* %61
%63 = shl i8 %56, 2
br label %64
64: ; preds = %54, %2
%65 = phi i8 [ 0, %2 ], [ %62, %54 ]
%66 = phi i8 [ 0, %2 ], [ %60, %54 ]
%67 = phi i8 [ 0, %2 ], [ %58, %54 ]
%68 = phi i8 [ 0, %2 ], [ %63, %54 ]
%69 = phi i32 [ 0, %2 ], [ %55, %54 ]
%70 = ashr i8 %67, 4
%71 = add i8 %70, %68
store i8 %71, i8* %1
%72 = shl i8 %67, 4
%73 = ashr i8 %66, 2
%74 = add i8 %73, %72
%75 = getelementptr inbounds i8, i8* %1, i64 1
store i8 %74, i8* %75
%76 = shl i8 %66, 6
%77 = add i8 %65, %76
%78 = getelementptr inbounds i8, i8* %1, i64 2
store i8 %77, i8* %78
ret i32 %69
}