#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 */

/* Variables and functions */
int base32_decode(const unsigned char *encoded, unsigned char *result,
                  int bufSize) {
  int buffer = 0;
  int bitsLeft = 0;
  int count = 0;
  const unsigned char *ptr = encoded;
  char ch = 0;
  if ((encoded == NULL) || (result == NULL) || (bufSize == 0))
    return -1;
  for (ptr = encoded; count < bufSize && *ptr; ++ptr) {
    ch = *ptr;
    if (ch == ' ' || ch == '\t' || ch == '\r' || ch == '\n' || ch == '-')
      continue;
    buffer <<= 5;
    if (ch == '0') {
      ch = 'O';
    } else if (ch == '1') {
      ch = 'L';
    } else if (ch == '8') {
      ch = 'B';
    }
    if ((ch >= 'A' && ch <= 'Z') || (ch >= 'a' && ch <= 'z')) {
      ch = (ch & 0x1F) - 1;
    } else if (ch >= '2' && ch <= '7') {
      ch -= '2' - 26;
    } else {
      return -1;
    }
    buffer |= ch;
    bitsLeft += 5;
    if (bitsLeft >= 8) {
      result[count++] = (unsigned char)buffer >> (bitsLeft - 8);
      bitsLeft -= 8;
    }
  }
  if (count < bufSize)
    result[count] = '\000';
  return count;
}


x86 assembly (clang, -O0):
<base32_decode>:
push   %rbp
mov    %rsp,%rbp
mov    %rdi,-0x10(%rbp)
mov    %rsi,-0x18(%rbp)
mov    %edx,-0x1c(%rbp)
movl   $0x0,-0x20(%rbp)
movl   $0x0,-0x24(%rbp)
movl   $0x0,-0x28(%rbp)
mov    -0x10(%rbp),%rax
mov    %rax,-0x30(%rbp)
movb   $0x0,-0x31(%rbp)
cmpq   $0x0,-0x10(%rbp)
je     1150 <base32_decode+0x50>
cmpq   $0x0,-0x18(%rbp)
je     1150 <base32_decode+0x50>
cmpl   $0x0,-0x1c(%rbp)
jne    115c <base32_decode+0x5c>
movl   $0xffffffff,-0x4(%rbp)
jmp    1333 <base32_decode+0x233>
mov    -0x10(%rbp),%rax
mov    %rax,-0x30(%rbp)
mov    -0x28(%rbp),%ecx
xor    %eax,%eax
cmp    -0x1c(%rbp),%ecx
mov    %al,-0x32(%rbp)
jge    1185 <base32_decode+0x85>
mov    -0x30(%rbp),%rax
movzbl (%rax),%eax
cmp    $0x0,%eax
setne  %al
mov    %al,-0x32(%rbp)
mov    -0x32(%rbp),%al
test   $0x1,%al
jne    1195 <base32_decode+0x95>
jmp    1315 <base32_decode+0x215>
mov    -0x30(%rbp),%rax
mov    (%rax),%al
mov    %al,-0x31(%rbp)
movsbl -0x31(%rbp),%eax
cmp    $0x20,%eax
je     11df <base32_decode+0xdf>
movsbl -0x31(%rbp),%eax
cmp    $0x9,%eax
je     11df <base32_decode+0xdf>
movsbl -0x31(%rbp),%eax
cmp    $0xd,%eax
je     11df <base32_decode+0xdf>
movsbl -0x31(%rbp),%eax
cmp    $0xa,%eax
je     11df <base32_decode+0xdf>
movsbl -0x31(%rbp),%eax
cmp    $0x2d,%eax
jne    11e4 <base32_decode+0xe4>
jmp    1304 <base32_decode+0x204>
mov    -0x20(%rbp),%eax
shl    $0x5,%eax
mov    %eax,-0x20(%rbp)
movsbl -0x31(%rbp),%eax
cmp    $0x30,%eax
jne    1203 <base32_decode+0x103>
movb   $0x4f,-0x31(%rbp)
jmp    1234 <base32_decode+0x134>
movsbl -0x31(%rbp),%eax
cmp    $0x31,%eax
jne    1219 <base32_decode+0x119>
movb   $0x4c,-0x31(%rbp)
jmp    122f <base32_decode+0x12f>
movsbl -0x31(%rbp),%eax
cmp    $0x38,%eax
jne    122a <base32_decode+0x12a>
movb   $0x42,-0x31(%rbp)
jmp    122f <base32_decode+0x12f>
jmp    1234 <base32_decode+0x134>
movsbl -0x31(%rbp),%eax
cmp    $0x41,%eax
jl     124e <base32_decode+0x14e>
movsbl -0x31(%rbp),%eax
cmp    $0x5a,%eax
jle    1268 <base32_decode+0x168>
movsbl -0x31(%rbp),%eax
cmp    $0x61,%eax
jl     127a <base32_decode+0x17a>
movsbl -0x31(%rbp),%eax
cmp    $0x7a,%eax
jg     127a <base32_decode+0x17a>
movsbl -0x31(%rbp),%eax
and    $0x1f,%eax
sub    $0x1,%eax
mov    %al,-0x31(%rbp)
jmp    12b4 <base32_decode+0x1b4>
movsbl -0x31(%rbp),%eax
cmp    $0x32,%eax
jl     12a3 <base32_decode+0x1a3>
movsbl -0x31(%rbp),%eax
cmp    $0x37,%eax
jg     12a3 <base32_decode+0x1a3>
movsbl -0x31(%rbp),%eax
sub    $0x18,%eax
mov    %al,-0x31(%rbp)
jmp    12af <base32_decode+0x1af>
movl   $0xffffffff,-0x4(%rbp)
jmp    1333 <base32_decode+0x233>
jmp    12b4 <base32_decode+0x1b4>
movsbl -0x31(%rbp),%eax
or     -0x20(%rbp),%eax
mov    %eax,-0x20(%rbp)
mov    -0x24(%rbp),%eax
add    $0x5,%eax
mov    %eax,-0x24(%rbp)
cmpl   $0x8,-0x24(%rbp)
jl     12ff <base32_decode+0x1ff>
mov    -0x20(%rbp),%eax
movzbl %al,%eax
mov    -0x24(%rbp),%ecx
sub    $0x8,%ecx
sar    %cl,%eax
mov    %al,%dl
mov    -0x18(%rbp),%rax
mov    -0x28(%rbp),%ecx
mov    %ecx,%esi
add    $0x1,%esi
mov    %esi,-0x28(%rbp)
movslq %ecx,%rcx
mov    %dl,(%rax,%rcx,1)
mov    -0x24(%rbp),%eax
sub    $0x8,%eax
mov    %eax,-0x24(%rbp)
jmp    1304 <base32_decode+0x204>
mov    -0x30(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x30(%rbp)
jmp    1164 <base32_decode+0x64>
mov    -0x28(%rbp),%eax
cmp    -0x1c(%rbp),%eax
jge    132d <base32_decode+0x22d>
mov    -0x18(%rbp),%rax
movslq -0x28(%rbp),%rcx
movb   $0x0,(%rax,%rcx,1)
mov    -0x28(%rbp),%eax
mov    %eax,-0x4(%rbp)
mov    -0x4(%rbp),%eax
pop    %rbp
ret

x86 assembly (clang, -O2):
<base32_decode>:
test   %rdi,%rdi
je     11d7 <base32_decode+0xd7>
test   %rsi,%rsi
je     11d7 <base32_decode+0xd7>
test   %edx,%edx
je     11d7 <base32_decode+0xd7>
jle    11dd <base32_decode+0xdd>
xor    %eax,%eax
movabs $0x200100002600,%r8
xor    %ecx,%ecx
xor    %r9d,%r9d
jmp    115c <base32_decode+0x5c>
movzbl %r9b,%r10d
add    $0xfffffffd,%ecx
shr    %cl,%r10d
movslq %eax,%r11
add    $0x1,%eax
mov    %r10b,(%rsi,%r11,1)
nopw   0x0(%rax,%rax,1)
add    $0x1,%rdi
cmp    %edx,%eax
jge    11e7 <base32_decode+0xe7>
movzbl (%rdi),%r10d
cmp    $0x2d,%r10
ja     1171 <base32_decode+0x71>
bt     %r10,%r8
jb     1150 <base32_decode+0x50>
test   %r10,%r10
je     11e0 <base32_decode+0xe0>
cmp    $0x30,%r10b
je     1188 <base32_decode+0x88>
cmp    $0x38,%r10b
je     118d <base32_decode+0x8d>
cmp    $0x31,%r10b
jne    1192 <base32_decode+0x92>
mov    $0x4c,%r10b
jmp    11a3 <base32_decode+0xa3>
mov    $0x4f,%r10b
jmp    11a3 <base32_decode+0xa3>
mov    $0x42,%r10b
jmp    11a3 <base32_decode+0xa3>
mov    %r10d,%r11d
and    $0xdf,%r11b
add    $0xbf,%r11b
cmp    $0x19,%r11b
ja     11c7 <base32_decode+0xc7>
and    $0x1f,%r10b
add    $0xff,%r10b
mov    %r9d,%r11d
shl    $0x5,%r11d
movzbl %r10b,%r9d
or     %r11d,%r9d
cmp    $0x3,%ecx
jge    1133 <base32_decode+0x33>
add    $0x5,%ecx
jmp    1150 <base32_decode+0x50>
lea    -0x32(%r10),%r11d
cmp    $0x5,%r11b
ja     11d7 <base32_decode+0xd7>
add    $0xe8,%r10b
jmp    11ab <base32_decode+0xab>
mov    $0xffffffff,%eax
ret
xor    %eax,%eax
ret
movslq %eax,%rcx
movb   $0x0,(%rsi,%rcx,1)
ret

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

LLVM IR (-O2):
define i32 @base32_decode(i8* %0, i8* writeonly %1, i32 %2) {
%4 = icmp eq i8* %0, null
%5 = icmp eq i8* %1, null
%6 = or i1 %4, %5
%7 = icmp eq i32 %2, 0
%8 = or i1 %6, %7
br i1 %8, label %57, label %9
9: ; preds = %3
%10 = icmp sgt i32 %2, 0
br i1 %10, label %11, label %57
11: ; preds = %9, %48
%12 = phi i8* [ %52, %48 ], [ %0, %9 ]
%13 = phi i32 [ %51, %48 ], [ 0, %9 ]
%14 = phi i32 [ %50, %48 ], [ 0, %9 ]
%15 = phi i32 [ %49, %48 ], [ 0, %9 ]
%16 = load i8, i8* %12
switch i8 %16, label %17 [
i8 0, label %54
i8 45, label %48
i8 32, label %48
i8 13, label %48
i8 10, label %48
i8 9, label %48
]
17: ; preds = %11
%18 = shl i32 %15, 5
switch i8 %16, label %21 [
i8 48, label %25
i8 49, label %19
i8 56, label %20
]
19: ; preds = %17
br label %25
20: ; preds = %17
br label %25
21: ; preds = %17
%22 = and i8 %16, -33
%23 = add i8 %22, -65
%24 = icmp ult i8 %23, 26
br i1 %24, label %25, label %29
25: ; preds = %17, %20, %19, %21
%26 = phi i8 [ %16, %21 ], [ 79, %17 ], [ 66, %20 ], [ 76, %19 ]
%27 = and i8 %26, 31
%28 = add nsw i8 %27, -1
br label %34
29: ; preds = %21
%30 = add i8 %16, -50
%31 = icmp ult i8 %30, 6
br i1 %31, label %32, label %57
32: ; preds = %29
%33 = add nsw i8 %16, -24
br label %34
34: ; preds = %32, %25
%35 = phi i8 [ %28, %25 ], [ %33, %32 ]
%36 = zext i8 %35 to i32
%37 = or i32 %18, %36
%38 = add nsw i32 %14, 5
%39 = icmp sgt i32 %14, 2
br i1 %39, label %40, label %48
40: ; preds = %34
%41 = and i32 %37, 255
%42 = add nsw i32 %14, -3
%43 = lshr i32 %41, %42
%44 = trunc i32 %43 to i8
%45 = add nsw i32 %13, 1
%46 = sext i32 %13 to i64
%47 = getelementptr inbounds i8, i8* %1, i64 %46
store i8 %44, i8* %47
br label %48
48: ; preds = %11, %11, %11, %11, %11, %34, %40
%49 = phi i32 [ %37, %40 ], [ %37, %34 ], [ %15, %11 ], [ %15, %11 ], [ %15, %11 ], [ %15, %11 ], [ %15, %11 ]
%50 = phi i32 [ %42, %40 ], [ %38, %34 ], [ %14, %11 ], [ %14, %11 ], [ %14, %11 ], [ %14, %11 ], [ %14, %11 ]
%51 = phi i32 [ %45, %40 ], [ %13, %34 ], [ %13, %11 ], [ %13, %11 ], [ %13, %11 ], [ %13, %11 ], [ %13, %11 ]
%52 = getelementptr inbounds i8, i8* %12, i64 1
%53 = icmp slt i32 %51, %2
br i1 %53, label %11, label %57
54: ; preds = %11
%55 = sext i32 %13 to i64
%56 = getelementptr inbounds i8, i8* %1, i64 %55
store i8 0, i8* %56
br label %57
57: ; preds = %29, %48, %9, %54, %3
%58 = phi i32 [ -1, %3 ], [ %13, %54 ], [ 0, %9 ], [ -1, %29 ], [ %51, %48 ]
ret i32 %58
}