#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 */
typedef char uint8_t;

/* Variables and functions */
size_t decode_qp(uint8_t *buf, size_t len) {
  uint8_t *rd, *wr;
  for (rd = buf, wr = buf; rd < buf + len; ++wr) {
    if (rd[0] == '=' && rd + 2 < buf + len &&
        ((rd[1] >= '0' && rd[1] <= '9') || (rd[1] >= 'A' && rd[1] <= 'F')) &&
        ((rd[2] >= '0' && rd[2] <= '9') || (rd[2] >= 'A' && rd[2] <= 'F'))) {
      *wr = (16 * (*(rd + 1) > '9' ? *(rd + 1) + 10 - 'A' : *(rd + 1) - '0') +
             (*((rd + 1) + 1) > '9' ? *((rd + 1) + 1) + 10 - 'A'
                                    : *((rd + 1) + 1) - '0'));
      rd += 3;
    } else
      *wr = *rd++;
  }
  return wr - buf;
}


x86 assembly (clang, -O0):
<decode_qp>:
push   %rbp
mov    %rsp,%rbp
mov    %rdi,-0x8(%rbp)
mov    %rsi,-0x10(%rbp)
mov    -0x8(%rbp),%rax
mov    %rax,-0x18(%rbp)
mov    -0x8(%rbp),%rax
mov    %rax,-0x20(%rbp)
mov    -0x18(%rbp),%rax
mov    -0x8(%rbp),%rcx
add    -0x10(%rbp),%rcx
cmp    %rcx,%rax
jae    12a3 <decode_qp+0x1a3>
mov    -0x18(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x3d,%eax
jne    1276 <decode_qp+0x176>
mov    -0x18(%rbp),%rax
add    $0x2,%rax
mov    -0x8(%rbp),%rcx
add    -0x10(%rbp),%rcx
cmp    %rcx,%rax
jae    1276 <decode_qp+0x176>
mov    -0x18(%rbp),%rax
movsbl 0x1(%rax),%eax
cmp    $0x30,%eax
jl     117c <decode_qp+0x7c>
mov    -0x18(%rbp),%rax
movsbl 0x1(%rax),%eax
cmp    $0x39,%eax
jle    119e <decode_qp+0x9e>
mov    -0x18(%rbp),%rax
movsbl 0x1(%rax),%eax
cmp    $0x41,%eax
jl     1276 <decode_qp+0x176>
mov    -0x18(%rbp),%rax
movsbl 0x1(%rax),%eax
cmp    $0x46,%eax
jg     1276 <decode_qp+0x176>
mov    -0x18(%rbp),%rax
movsbl 0x2(%rax),%eax
cmp    $0x30,%eax
jl     11c0 <decode_qp+0xc0>
mov    -0x18(%rbp),%rax
movsbl 0x2(%rax),%eax
cmp    $0x39,%eax
jle    11e2 <decode_qp+0xe2>
mov    -0x18(%rbp),%rax
movsbl 0x2(%rax),%eax
cmp    $0x41,%eax
jl     1276 <decode_qp+0x176>
mov    -0x18(%rbp),%rax
movsbl 0x2(%rax),%eax
cmp    $0x46,%eax
jg     1276 <decode_qp+0x176>
mov    -0x18(%rbp),%rax
movsbl 0x1(%rax),%eax
cmp    $0x39,%eax
jle    1209 <decode_qp+0x109>
mov    -0x18(%rbp),%rax
movsbl 0x1(%rax),%eax
add    $0xa,%eax
sub    $0x41,%eax
mov    %eax,-0x24(%rbp)
jmp    1217 <decode_qp+0x117>
mov    -0x18(%rbp),%rax
movsbl 0x1(%rax),%eax
sub    $0x30,%eax
mov    %eax,-0x24(%rbp)
mov    -0x24(%rbp),%eax
shl    $0x4,%eax
mov    %eax,-0x28(%rbp)
mov    -0x18(%rbp),%rax
movsbl 0x2(%rax),%eax
cmp    $0x39,%eax
jle    1247 <decode_qp+0x147>
mov    -0x18(%rbp),%rax
movsbl 0x2(%rax),%eax
add    $0xa,%eax
sub    $0x41,%eax
mov    %eax,-0x2c(%rbp)
jmp    1255 <decode_qp+0x155>
mov    -0x18(%rbp),%rax
movsbl 0x2(%rax),%eax
sub    $0x30,%eax
mov    %eax,-0x2c(%rbp)
mov    -0x28(%rbp),%eax
mov    -0x2c(%rbp),%ecx
add    %ecx,%eax
mov    %al,%cl
mov    -0x20(%rbp),%rax
mov    %cl,(%rax)
mov    -0x18(%rbp),%rax
add    $0x3,%rax
mov    %rax,-0x18(%rbp)
jmp    128d <decode_qp+0x18d>
mov    -0x18(%rbp),%rax
mov    %rax,%rcx
add    $0x1,%rcx
mov    %rcx,-0x18(%rbp)
mov    (%rax),%cl
mov    -0x20(%rbp),%rax
mov    %cl,(%rax)
jmp    1292 <decode_qp+0x192>
mov    -0x20(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x20(%rbp)
jmp    111c <decode_qp+0x1c>
mov    -0x20(%rbp),%rax
mov    -0x8(%rbp),%rcx
sub    %rcx,%rax
pop    %rbp
ret

x86 assembly (clang, -O2):
<decode_qp>:
mov    %rdi,%rax
test   %rsi,%rsi
jle    11a1 <decode_qp+0xa1>
add    %rdi,%rsi
mov    $0xc9,%r8d
mov    %rdi,%rax
mov    %rdi,%rdx
nopl   0x0(%rax,%rax,1)
movzbl (%rdx),%r11d
cmp    $0x3d,%r11b
jne    1160 <decode_qp+0x60>
lea    0x2(%rdx),%r10
cmp    %rsi,%r10
jae    1160 <decode_qp+0x60>
movzbl 0x1(%rdx),%r9d
lea    -0x30(%r9),%ecx
cmp    $0xa,%cl
jb     114a <decode_qp+0x4a>
lea    -0x41(%r9),%ecx
cmp    $0x5,%cl
ja     1160 <decode_qp+0x60>
movzbl (%r10),%r10d
lea    -0x30(%r10),%ecx
cmp    $0xa,%cl
jb     1172 <decode_qp+0x72>
lea    -0x41(%r10),%ecx
cmp    $0x5,%cl
jbe    1172 <decode_qp+0x72>
add    $0x1,%rdx
mov    %r11b,(%rax)
add    $0x1,%rax
cmp    %rsi,%rdx
jb     1120 <decode_qp+0x20>
jmp    11a1 <decode_qp+0xa1>
cmp    $0x3a,%r9b
mov    $0xd0,%ecx
cmovae %r8d,%ecx
add    %r9b,%cl
shl    $0x4,%cl
cmp    $0x3a,%r10b
mov    $0xd0,%r9d
cmovae %r8d,%r9d
add    %r10b,%cl
add    %r9b,%cl
mov    %cl,(%rax)
add    $0x3,%rdx
jmp    1167 <decode_qp+0x67>
sub    %rdi,%rax
ret

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

LLVM IR (-O2):
define i64 @decode_qp(i8* %0, i64 %1) {
%3 = getelementptr inbounds i8, i8* %0, i64 %1
%4 = icmp sgt i64 %1, 0
br i1 %4, label %5, label %44
5: ; preds = %2, %40
%6 = phi i8* [ %42, %40 ], [ %0, %2 ]
%7 = phi i8* [ %41, %40 ], [ %0, %2 ]
%8 = load i8, i8* %7
%9 = icmp eq i8 %8, 61
br i1 %9, label %10, label %38
10: ; preds = %5
%11 = getelementptr inbounds i8, i8* %7, i64 2
%12 = icmp ult i8* %11, %3
br i1 %12, label %13, label %38
13: ; preds = %10
%14 = getelementptr inbounds i8, i8* %7, i64 1
%15 = load i8, i8* %14
%16 = add i8 %15, -48
%17 = icmp ult i8 %16, 10
%18 = add i8 %15, -65
%19 = icmp ult i8 %18, 6
%20 = or i1 %17, %19
br i1 %20, label %21, label %38
21: ; preds = %13
%22 = load i8, i8* %11
%23 = add i8 %22, -48
%24 = icmp ult i8 %23, 10
%25 = add i8 %22, -65
%26 = icmp ult i8 %25, 6
%27 = or i1 %24, %26
br i1 %27, label %28, label %38
28: ; preds = %21
%29 = icmp ugt i8 %15, 57
%30 = select i1 %29, i8 -55, i8 -48
%31 = add nsw i8 %30, %15
%32 = shl nuw i8 %31, 4
%33 = icmp ugt i8 %22, 57
%34 = select i1 %33, i8 -55, i8 -48
%35 = add i8 %22, %32
%36 = add i8 %35, %34
store i8 %36, i8* %6
%37 = getelementptr inbounds i8, i8* %7, i64 3
br label %40
38: ; preds = %21, %13, %10, %5
%39 = getelementptr inbounds i8, i8* %7, i64 1
store i8 %8, i8* %6
br label %40
40: ; preds = %28, %38
%41 = phi i8* [ %37, %28 ], [ %39, %38 ]
%42 = getelementptr inbounds i8, i8* %6, i64 1
%43 = icmp ult i8* %41, %3
br i1 %43, label %5, label %44
44: ; preds = %40, %2
%45 = phi i8* [ %0, %2 ], [ %42, %40 ]
%46 = ptrtoint i8* %45 to i64
%47 = ptrtoint i8* %0 to i64
%48 = sub i64 %46, %47
ret i64 %48
}