#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 strlen(char const *);
int string_decode_base16(const char *from, char *to) {
  int length, to_length, i, pos;
  unsigned char *ptr_to, value;
  length = strlen(from) / 2;
  ptr_to = (unsigned char *)to;
  ptr_to[0] = '\0';
  to_length = 0;
  for (i = 0; i < length; i++) {
    pos = i * 2;
    value = 0;
    if ((from[pos] >= '0') && (from[pos] <= '9'))
      value |= (from[pos] - '0') << 4;
    else if ((from[pos] >= 'a') && (from[pos] <= 'f'))
      value |= (from[pos] - 'a' + 10) << 4;
    else if ((from[pos] >= 'A') && (from[pos] <= 'F'))
      value |= (from[pos] - 'A' + 10) << 4;
    pos++;
    if ((from[pos] >= '0') && (from[pos] <= '9'))
      value |= from[pos] - '0';
    else if ((from[pos] >= 'a') && (from[pos] <= 'f'))
      value |= from[pos] - 'a' + 10;
    else if ((from[pos] >= 'A') && (from[pos] <= 'F'))
      value |= from[pos] - 'A' + 10;
    ptr_to[0] = value;
    ptr_to++;
    to_length++;
  }
  ptr_to[0] = '\0';
  return to_length;
}


x86 assembly (clang, -O0):
<string_decode_base16>:
push   %rbp
mov    %rsp,%rbp
sub    $0x30,%rsp
mov    %rdi,-0x8(%rbp)
mov    %rsi,-0x10(%rbp)
mov    -0x8(%rbp),%rdi
call   1030 <strlen@plt>
mov    $0x2,%ecx
cltd
idiv   %ecx
mov    %eax,-0x14(%rbp)
mov    -0x10(%rbp),%rax
mov    %rax,-0x28(%rbp)
mov    -0x28(%rbp),%rax
movb   $0x0,(%rax)
movl   $0x0,-0x18(%rbp)
movl   $0x0,-0x1c(%rbp)
mov    -0x1c(%rbp),%eax
cmp    -0x14(%rbp),%eax
jge    1368 <string_decode_base16+0x258>
mov    -0x1c(%rbp),%eax
shl    $0x1,%eax
mov    %eax,-0x20(%rbp)
movb   $0x0,-0x29(%rbp)
mov    -0x8(%rbp),%rax
movslq -0x20(%rbp),%rcx
movsbl (%rax,%rcx,1),%eax
cmp    $0x30,%eax
jl     11b4 <string_decode_base16+0xa4>
mov    -0x8(%rbp),%rax
movslq -0x20(%rbp),%rcx
movsbl (%rax,%rcx,1),%eax
cmp    $0x39,%eax
jg     11b4 <string_decode_base16+0xa4>
mov    -0x8(%rbp),%rax
movslq -0x20(%rbp),%rcx
movsbl (%rax,%rcx,1),%ecx
sub    $0x30,%ecx
shl    $0x4,%ecx
movzbl -0x29(%rbp),%eax
or     %ecx,%eax
mov    %al,-0x29(%rbp)
jmp    1253 <string_decode_base16+0x143>
mov    -0x8(%rbp),%rax
movslq -0x20(%rbp),%rcx
movsbl (%rax,%rcx,1),%eax
cmp    $0x61,%eax
jl     1201 <string_decode_base16+0xf1>
mov    -0x8(%rbp),%rax
movslq -0x20(%rbp),%rcx
movsbl (%rax,%rcx,1),%eax
cmp    $0x66,%eax
jg     1201 <string_decode_base16+0xf1>
mov    -0x8(%rbp),%rax
movslq -0x20(%rbp),%rcx
movsbl (%rax,%rcx,1),%ecx
sub    $0x61,%ecx
add    $0xa,%ecx
shl    $0x4,%ecx
movzbl -0x29(%rbp),%eax
or     %ecx,%eax
mov    %al,-0x29(%rbp)
jmp    124e <string_decode_base16+0x13e>
mov    -0x8(%rbp),%rax
movslq -0x20(%rbp),%rcx
movsbl (%rax,%rcx,1),%eax
cmp    $0x41,%eax
jl     1249 <string_decode_base16+0x139>
mov    -0x8(%rbp),%rax
movslq -0x20(%rbp),%rcx
movsbl (%rax,%rcx,1),%eax
cmp    $0x46,%eax
jg     1249 <string_decode_base16+0x139>
mov    -0x8(%rbp),%rax
movslq -0x20(%rbp),%rcx
movsbl (%rax,%rcx,1),%ecx
sub    $0x41,%ecx
add    $0xa,%ecx
shl    $0x4,%ecx
movzbl -0x29(%rbp),%eax
or     %ecx,%eax
mov    %al,-0x29(%rbp)
jmp    124e <string_decode_base16+0x13e>
jmp    1253 <string_decode_base16+0x143>
mov    -0x20(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x20(%rbp)
mov    -0x8(%rbp),%rax
movslq -0x20(%rbp),%rcx
movsbl (%rax,%rcx,1),%eax
cmp    $0x30,%eax
jl     12a3 <string_decode_base16+0x193>
mov    -0x8(%rbp),%rax
movslq -0x20(%rbp),%rcx
movsbl (%rax,%rcx,1),%eax
cmp    $0x39,%eax
jg     12a3 <string_decode_base16+0x193>
mov    -0x8(%rbp),%rax
movslq -0x20(%rbp),%rcx
movsbl (%rax,%rcx,1),%ecx
sub    $0x30,%ecx
movzbl -0x29(%rbp),%eax
or     %ecx,%eax
mov    %al,-0x29(%rbp)
jmp    133c <string_decode_base16+0x22c>
mov    -0x8(%rbp),%rax
movslq -0x20(%rbp),%rcx
movsbl (%rax,%rcx,1),%eax
cmp    $0x61,%eax
jl     12ed <string_decode_base16+0x1dd>
mov    -0x8(%rbp),%rax
movslq -0x20(%rbp),%rcx
movsbl (%rax,%rcx,1),%eax
cmp    $0x66,%eax
jg     12ed <string_decode_base16+0x1dd>
mov    -0x8(%rbp),%rax
movslq -0x20(%rbp),%rcx
movsbl (%rax,%rcx,1),%ecx
sub    $0x61,%ecx
add    $0xa,%ecx
movzbl -0x29(%rbp),%eax
or     %ecx,%eax
mov    %al,-0x29(%rbp)
jmp    1337 <string_decode_base16+0x227>
mov    -0x8(%rbp),%rax
movslq -0x20(%rbp),%rcx
movsbl (%rax,%rcx,1),%eax
cmp    $0x41,%eax
jl     1332 <string_decode_base16+0x222>
mov    -0x8(%rbp),%rax
movslq -0x20(%rbp),%rcx
movsbl (%rax,%rcx,1),%eax
cmp    $0x46,%eax
jg     1332 <string_decode_base16+0x222>
mov    -0x8(%rbp),%rax
movslq -0x20(%rbp),%rcx
movsbl (%rax,%rcx,1),%ecx
sub    $0x41,%ecx
add    $0xa,%ecx
movzbl -0x29(%rbp),%eax
or     %ecx,%eax
mov    %al,-0x29(%rbp)
jmp    1337 <string_decode_base16+0x227>
jmp    133c <string_decode_base16+0x22c>
mov    -0x29(%rbp),%cl
mov    -0x28(%rbp),%rax
mov    %cl,(%rax)
mov    -0x28(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x28(%rbp)
mov    -0x18(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x18(%rbp)
mov    -0x1c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x1c(%rbp)
jmp    1151 <string_decode_base16+0x41>
mov    -0x28(%rbp),%rax
movb   $0x0,(%rax)
mov    -0x18(%rbp),%eax
add    $0x30,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<string_decode_base16>:
push   %r14
push   %rbx
push   %rax
mov    %rsi,%r14
mov    %rdi,%rbx
call   1030 <strlen@plt>
mov    %eax,%ecx
movb   $0x0,(%r14)
xor    %eax,%eax
cmp    $0x2,%ecx
jl     11f1 <string_decode_base16+0xe1>
mov    %ecx,%eax
shr    $0x1f,%eax
add    %ecx,%eax
sar    %eax
mov    %eax,%r8d
cmp    $0x10,%eax
jb     115b <string_decode_base16+0x4b>
lea    (%rbx,%r8,2),%rcx
cmp    %r14,%rcx
jbe    1205 <string_decode_base16+0xf5>
lea    (%r14,%r8,1),%rcx
cmp    %rbx,%rcx
jbe    1205 <string_decode_base16+0xf5>
xor    %esi,%esi
mov    %r14,%r9
lea    (%rbx,%rsi,2),%rdi
add    $0x1,%rdi
sub    %rsi,%r8
xor    %esi,%esi
jmp    1181 <string_decode_base16+0x71>
nop
or     %cl,%dl
mov    %edx,%ecx
mov    %cl,(%r9,%rsi,1)
add    $0x1,%rsi
cmp    %rsi,%r8
je     11f6 <string_decode_base16+0xe6>
movzbl -0x1(%rdi,%rsi,2),%ecx
lea    -0x30(%rcx),%edx
cmp    $0x9,%dl
ja     11a0 <string_decode_base16+0x90>
shl    $0x4,%cl
jmp    11c0 <string_decode_base16+0xb0>
cs nopw 0x0(%rax,%rax,1)
nopl   (%rax)
lea    -0x61(%rcx),%edx
cmp    $0x5,%dl
jbe    11b0 <string_decode_base16+0xa0>
lea    -0x41(%rcx),%edx
cmp    $0x5,%dl
ja     11b8 <string_decode_base16+0xa8>
shl    $0x4,%cl
add    $0x90,%cl
jmp    11c0 <string_decode_base16+0xb0>
xor    %ecx,%ecx
nopw   0x0(%rax,%rax,1)
movzbl (%rdi,%rsi,2),%ebx
lea    -0x30(%rbx),%edx
cmp    $0x9,%dl
jbe    1170 <string_decode_base16+0x60>
lea    -0x61(%rbx),%edx
cmp    $0x5,%dl
ja     11e0 <string_decode_base16+0xd0>
add    $0xa9,%bl
jmp    11eb <string_decode_base16+0xdb>
nopl   0x0(%rax)
lea    -0x41(%rbx),%edx
cmp    $0x5,%dl
ja     1174 <string_decode_base16+0x64>
add    $0xc9,%bl
or     %cl,%bl
mov    %ebx,%ecx
jmp    1174 <string_decode_base16+0x64>
mov    %r14,%r9
jmp    11f9 <string_decode_base16+0xe9>
add    %rsi,%r9
movb   $0x0,(%r9)
add    $0x8,%rsp
pop    %rbx
pop    %r14
ret
mov    %r8d,%esi
and    $0xfffffff0,%esi
lea    (%r14,%rsi,1),%r9
xor    %edi,%edi
movdqa 0xe37(%rip),%xmm0
nopl   0x0(%rax)
movdqu (%rbx,%rdi,2),%xmm12
movdqu 0x10(%rbx,%rdi,2),%xmm3
movdqa %xmm3,%xmm4
movdqa 0xdc8(%rip),%xmm2
pand   %xmm2,%xmm4
movdqa %xmm12,%xmm1
pand   %xmm2,%xmm1
packuswb %xmm4,%xmm1
psrlw  $0x8,%xmm3
psrlw  $0x8,%xmm12
packuswb %xmm3,%xmm12
movdqa %xmm1,%xmm3
movdqa 0xdab(%rip),%xmm2
paddb  %xmm2,%xmm3
movdqa %xmm3,%xmm8
pminub 0xda9(%rip),%xmm8
pcmpeqb %xmm3,%xmm8
movdqa %xmm3,%xmm9
movdqa 0xda7(%rip),%xmm7
pmaxub %xmm7,%xmm9
pcmpeqb %xmm3,%xmm9
movdqa %xmm1,%xmm3
movdqa 0xda1(%rip),%xmm5
paddb  %xmm5,%xmm3
movdqa %xmm3,%xmm10
pminub %xmm0,%xmm10
pcmpeqb %xmm3,%xmm10
movdqa %xmm1,%xmm3
movdqa 0xdb1(%rip),%xmm11
paddb  %xmm11,%xmm3
movdqa %xmm3,%xmm4
pminub %xmm0,%xmm4
pcmpeqb %xmm3,%xmm4
psllw  $0x4,%xmm1
pand   0xda3(%rip),%xmm1
pand   %xmm10,%xmm9
por    %xmm8,%xmm10
movdqa %xmm10,%xmm13
movdqa 0xdac(%rip),%xmm7
pxor   %xmm7,%xmm13
pand   %xmm4,%xmm13
movdqa %xmm13,%xmm6
psllw  $0x7,%xmm6
movdqa 0xda0(%rip),%xmm2
pand   %xmm2,%xmm6
pxor   %xmm3,%xmm3
pcmpgtb %xmm6,%xmm3
por    %xmm4,%xmm10
movdqa %xmm9,%xmm4
pandn  %xmm1,%xmm4
paddb  0xd5e(%rip),%xmm1
movdqa %xmm1,%xmm6
pand   %xmm9,%xmm6
por    %xmm4,%xmm6
pand   %xmm3,%xmm1
pandn  %xmm6,%xmm3
por    %xmm1,%xmm3
movdqa %xmm12,%xmm4
paddb  %xmm5,%xmm4
movdqa %xmm4,%xmm1
movdqa 0xd00(%rip),%xmm5
pmaxub %xmm5,%xmm1
pcmpeqb %xmm4,%xmm1
movdqa %xmm4,%xmm15
pminub %xmm0,%xmm15
pcmpeqb %xmm4,%xmm15
movdqa %xmm12,%xmm4
paddb  %xmm11,%xmm4
movdqa %xmm4,%xmm11
pmaxub %xmm5,%xmm11
pcmpeqb %xmm4,%xmm11
movdqa %xmm4,%xmm14
pminub %xmm0,%xmm14
pcmpeqb %xmm4,%xmm14
por    %xmm9,%xmm13
pand   %xmm10,%xmm3
pxor   %xmm7,%xmm10
por    %xmm8,%xmm10
movdqa %xmm12,%xmm4
paddb  0xc50(%rip),%xmm4
por    %xmm13,%xmm10
movdqa %xmm4,%xmm6
pmaxub 0xc5f(%rip),%xmm6
pcmpeqb %xmm4,%xmm6
pand   %xmm6,%xmm10
pand   %xmm10,%xmm15
psllw  $0x7,%xmm15
pand   %xmm2,%xmm15
pxor   %xmm6,%xmm6
pcmpgtb %xmm15,%xmm6
pand   %xmm1,%xmm10
pand   %xmm10,%xmm14
psllw  $0x7,%xmm14
pand   %xmm2,%xmm14
pxor   %xmm1,%xmm1
pcmpgtb %xmm14,%xmm1
pand   %xmm11,%xmm10
psllw  $0x7,%xmm10
pand   %xmm2,%xmm10
pxor   %xmm7,%xmm7
pcmpgtb %xmm10,%xmm7
movdqa %xmm12,%xmm2
paddb  0xc98(%rip),%xmm12
pand   %xmm6,%xmm12
pandn  %xmm4,%xmm6
por    %xmm12,%xmm6
paddb  0xc72(%rip),%xmm2
pand   %xmm1,%xmm2
pandn  %xmm6,%xmm1
por    %xmm2,%xmm1
pandn  %xmm1,%xmm7
por    %xmm3,%xmm7
movdqu %xmm7,(%r14,%rdi,1)
add    $0x10,%rdi
cmp    %rdi,%rsi
jne    1220 <string_decode_base16+0x110>
cmp    %r8,%rsi
jne    1160 <string_decode_base16+0x50>
jmp    11f9 <string_decode_base16+0xe9>

LLVM IR (-O0):
define i32 @string_decode_base16(i8* %0, i8* %1) {
%3 = alloca i8*
%4 = alloca i8*
%5 = alloca i32
%6 = alloca i32
%7 = alloca i32
%8 = alloca i32
%9 = alloca i8*
%10 = alloca i8
store i8* %0, i8** %3
store i8* %1, i8** %4
%11 = load i8*, i8** %3
%12 = call i32 @strlen(i8* %11)
%13 = sdiv i32 %12, 2
store i32 %13, i32* %5
%14 = load i8*, i8** %4
store i8* %14, i8** %9
%15 = load i8*, i8** %9
%16 = getelementptr inbounds i8, i8* %15, i64 0
store i8 0, i8* %16
store i32 0, i32* %6
store i32 0, i32* %7
br label %17
17: ; preds = %212, %2
%18 = load i32, i32* %7
%19 = load i32, i32* %5
%20 = icmp slt i32 %18, %19
br i1 %20, label %21, label %215
21: ; preds = %17
%22 = load i32, i32* %7
%23 = mul nsw i32 %22, 2
store i32 %23, i32* %8
store i8 0, i8* %10
%24 = load i8*, i8** %3
%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 = sext i8 %28 to i32
%30 = icmp sge i32 %29, 48
br i1 %30, label %31, label %52
31: ; preds = %21
%32 = load i8*, i8** %3
%33 = load i32, i32* %8
%34 = sext i32 %33 to i64
%35 = getelementptr inbounds i8, i8* %32, i64 %34
%36 = load i8, i8* %35
%37 = sext i8 %36 to i32
%38 = icmp sle i32 %37, 57
br i1 %38, label %39, label %52
39: ; preds = %31
%40 = load i8*, i8** %3
%41 = load i32, i32* %8
%42 = sext i32 %41 to i64
%43 = getelementptr inbounds i8, i8* %40, i64 %42
%44 = load i8, i8* %43
%45 = sext i8 %44 to i32
%46 = sub nsw i32 %45, 48
%47 = shl i32 %46, 4
%48 = load i8, i8* %10
%49 = zext i8 %48 to i32
%50 = or i32 %49, %47
%51 = trunc i32 %50 to i8
store i8 %51, i8* %10
br label %114
52: ; preds = %31, %21
%53 = load i8*, i8** %3
%54 = load i32, i32* %8
%55 = sext i32 %54 to i64
%56 = getelementptr inbounds i8, i8* %53, i64 %55
%57 = load i8, i8* %56
%58 = sext i8 %57 to i32
%59 = icmp sge i32 %58, 97
br i1 %59, label %60, label %82
60: ; preds = %52
%61 = load i8*, i8** %3
%62 = load i32, i32* %8
%63 = sext i32 %62 to i64
%64 = getelementptr inbounds i8, i8* %61, i64 %63
%65 = load i8, i8* %64
%66 = sext i8 %65 to i32
%67 = icmp sle i32 %66, 102
br i1 %67, label %68, label %82
68: ; preds = %60
%69 = load i8*, i8** %3
%70 = load i32, i32* %8
%71 = sext i32 %70 to i64
%72 = getelementptr inbounds i8, i8* %69, i64 %71
%73 = load i8, i8* %72
%74 = sext i8 %73 to i32
%75 = sub nsw i32 %74, 97
%76 = add nsw i32 %75, 10
%77 = shl i32 %76, 4
%78 = load i8, i8* %10
%79 = zext i8 %78 to i32
%80 = or i32 %79, %77
%81 = trunc i32 %80 to i8
store i8 %81, i8* %10
br label %113
82: ; preds = %60, %52
%83 = load i8*, i8** %3
%84 = load i32, i32* %8
%85 = sext i32 %84 to i64
%86 = getelementptr inbounds i8, i8* %83, i64 %85
%87 = load i8, i8* %86
%88 = sext i8 %87 to i32
%89 = icmp sge i32 %88, 65
br i1 %89, label %90, label %112
90: ; preds = %82
%91 = load i8*, i8** %3
%92 = load i32, i32* %8
%93 = sext i32 %92 to i64
%94 = getelementptr inbounds i8, i8* %91, i64 %93
%95 = load i8, i8* %94
%96 = sext i8 %95 to i32
%97 = icmp sle i32 %96, 70
br i1 %97, label %98, label %112
98: ; preds = %90
%99 = load i8*, i8** %3
%100 = load i32, i32* %8
%101 = sext i32 %100 to i64
%102 = getelementptr inbounds i8, i8* %99, i64 %101
%103 = load i8, i8* %102
%104 = sext i8 %103 to i32
%105 = sub nsw i32 %104, 65
%106 = add nsw i32 %105, 10
%107 = shl i32 %106, 4
%108 = load i8, i8* %10
%109 = zext i8 %108 to i32
%110 = or i32 %109, %107
%111 = trunc i32 %110 to i8
store i8 %111, i8* %10
br label %112
112: ; preds = %98, %90, %82
br label %113
113: ; preds = %112, %68
br label %114
114: ; preds = %113, %39
%115 = load i32, i32* %8
%116 = add nsw i32 %115, 1
store i32 %116, i32* %8
%117 = load i8*, i8** %3
%118 = load i32, i32* %8
%119 = sext i32 %118 to i64
%120 = getelementptr inbounds i8, i8* %117, i64 %119
%121 = load i8, i8* %120
%122 = sext i8 %121 to i32
%123 = icmp sge i32 %122, 48
br i1 %123, label %124, label %144
124: ; preds = %114
%125 = load i8*, i8** %3
%126 = load i32, i32* %8
%127 = sext i32 %126 to i64
%128 = getelementptr inbounds i8, i8* %125, i64 %127
%129 = load i8, i8* %128
%130 = sext i8 %129 to i32
%131 = icmp sle i32 %130, 57
br i1 %131, label %132, label %144
132: ; preds = %124
%133 = load i8*, i8** %3
%134 = load i32, i32* %8
%135 = sext i32 %134 to i64
%136 = getelementptr inbounds i8, i8* %133, i64 %135
%137 = load i8, i8* %136
%138 = sext i8 %137 to i32
%139 = sub nsw i32 %138, 48
%140 = load i8, i8* %10
%141 = zext i8 %140 to i32
%142 = or i32 %141, %139
%143 = trunc i32 %142 to i8
store i8 %143, i8* %10
br label %204
144: ; preds = %124, %114
%145 = load i8*, i8** %3
%146 = load i32, i32* %8
%147 = sext i32 %146 to i64
%148 = getelementptr inbounds i8, i8* %145, i64 %147
%149 = load i8, i8* %148
%150 = sext i8 %149 to i32
%151 = icmp sge i32 %150, 97
br i1 %151, label %152, label %173
152: ; preds = %144
%153 = load i8*, i8** %3
%154 = load i32, i32* %8
%155 = sext i32 %154 to i64
%156 = getelementptr inbounds i8, i8* %153, i64 %155
%157 = load i8, i8* %156
%158 = sext i8 %157 to i32
%159 = icmp sle i32 %158, 102
br i1 %159, label %160, label %173
160: ; preds = %152
%161 = load i8*, i8** %3
%162 = load i32, i32* %8
%163 = sext i32 %162 to i64
%164 = getelementptr inbounds i8, i8* %161, i64 %163
%165 = load i8, i8* %164
%166 = sext i8 %165 to i32
%167 = sub nsw i32 %166, 97
%168 = add nsw i32 %167, 10
%169 = load i8, i8* %10
%170 = zext i8 %169 to i32
%171 = or i32 %170, %168
%172 = trunc i32 %171 to i8
store i8 %172, i8* %10
br label %203
173: ; preds = %152, %144
%174 = load i8*, i8** %3
%175 = load i32, i32* %8
%176 = sext i32 %175 to i64
%177 = getelementptr inbounds i8, i8* %174, i64 %176
%178 = load i8, i8* %177
%179 = sext i8 %178 to i32
%180 = icmp sge i32 %179, 65
br i1 %180, label %181, label %202
181: ; preds = %173
%182 = load i8*, i8** %3
%183 = load i32, i32* %8
%184 = sext i32 %183 to i64
%185 = getelementptr inbounds i8, i8* %182, i64 %184
%186 = load i8, i8* %185
%187 = sext i8 %186 to i32
%188 = icmp sle i32 %187, 70
br i1 %188, label %189, label %202
189: ; preds = %181
%190 = load i8*, i8** %3
%191 = load i32, i32* %8
%192 = sext i32 %191 to i64
%193 = getelementptr inbounds i8, i8* %190, i64 %192
%194 = load i8, i8* %193
%195 = sext i8 %194 to i32
%196 = sub nsw i32 %195, 65
%197 = add nsw i32 %196, 10
%198 = load i8, i8* %10
%199 = zext i8 %198 to i32
%200 = or i32 %199, %197
%201 = trunc i32 %200 to i8
store i8 %201, i8* %10
br label %202
202: ; preds = %189, %181, %173
br label %203
203: ; preds = %202, %160
br label %204
204: ; preds = %203, %132
%205 = load i8, i8* %10
%206 = load i8*, i8** %9
%207 = getelementptr inbounds i8, i8* %206, i64 0
store i8 %205, i8* %207
%208 = load i8*, i8** %9
%209 = getelementptr inbounds i8, i8* %208, i32 1
store i8* %209, i8** %9
%210 = load i32, i32* %6
%211 = add nsw i32 %210, 1
store i32 %211, i32* %6
br label %212
212: ; preds = %204
%213 = load i32, i32* %7
%214 = add nsw i32 %213, 1
store i32 %214, i32* %7
br label %17
215: ; preds = %17
%216 = load i8*, i8** %9
%217 = getelementptr inbounds i8, i8* %216, i64 0
store i8 0, i8* %217
%218 = load i32, i32* %6
ret i32 %218
}

LLVM IR (-O2):
define i32 @string_decode_base16(i8* %0, i8* nocapture writeonly %1) {
%3 = tail call i32 @strlen(i8* %0)
%4 = sdiv i32 %3, 2
store i8 0, i8* %1
%5 = icmp sgt i32 %3, 1
br i1 %5, label %6, label %127
6: ; preds = %2
%7 = zext i32 %4 to i64
%8 = icmp ult i32 %4, 16
br i1 %8, label %76, label %9
9: ; preds = %6
%10 = getelementptr i8, i8* %1, i64 %7
%11 = shl nuw nsw i64 %7, 1
%12 = getelementptr i8, i8* %0, i64 %11
%13 = icmp ugt i8* %12, %1
%14 = icmp ugt i8* %10, %0
%15 = and i1 %13, %14
br i1 %15, label %76, label %16
16: ; preds = %9
%17 = and i64 %7, 4294967280
%18 = getelementptr i8, i8* %1, i64 %17
br label %19
19: ; preds = %19, %16
%20 = phi i64 [ 0, %16 ], [ %72, %19 ]
%21 = getelementptr i8, i8* %1, i64 %20
%22 = shl nuw nsw i64 %20, 1
%23 = getelementptr inbounds i8, i8* %0, i64 %22
%24 = bitcast i8* %23 to <32 x i8>*
%25 = load <32 x i8>, <32 x i8>* %24
%26 = shufflevector <32 x i8> %25, <32 x i8> poison, <16 x i32> <i32 0, i32 2, i32 4, i32 6, i32 8, i32 10, i32 12, i32 14, i32 16, i32 18, i32 20, i32 22, i32 24, i32 26, i32 28, i32 30>
%27 = shufflevector <32 x i8> %25, <32 x i8> poison, <16 x i32> <i32 1, i32 3, i32 5, i32 7, i32 9, i32 11, i32 13, i32 15, i32 17, i32 19, i32 21, i32 23, i32 25, i32 27, i32 29, i32 31>
%28 = add <16 x i8> %26, <i8 -48, i8 -48, i8 -48, i8 -48, i8 -48, i8 -48, i8 -48, i8 -48, i8 -48, i8 -48, i8 -48, i8 -48, i8 -48, i8 -48, i8 -48, i8 -48>
%29 = icmp ult <16 x i8> %28, <i8 10, i8 10, i8 10, i8 10, i8 10, i8 10, i8 10, i8 10, i8 10, i8 10, i8 10, i8 10, i8 10, i8 10, i8 10, i8 10>
%30 = add <16 x i8> %26, <i8 -97, i8 -97, i8 -97, i8 -97, i8 -97, i8 -97, i8 -97, i8 -97, i8 -97, i8 -97, i8 -97, i8 -97, i8 -97, i8 -97, i8 -97, i8 -97>
%31 = icmp ult <16 x i8> %30, <i8 6, i8 6, i8 6, i8 6, i8 6, i8 6, i8 6, i8 6, i8 6, i8 6, i8 6, i8 6, i8 6, i8 6, i8 6, i8 6>
%32 = add <16 x i8> %26, <i8 -65, i8 -65, i8 -65, i8 -65, i8 -65, i8 -65, i8 -65, i8 -65, i8 -65, i8 -65, i8 -65, i8 -65, i8 -65, i8 -65, i8 -65, i8 -65>
%33 = icmp ult <16 x i8> %32, <i8 6, i8 6, i8 6, i8 6, i8 6, i8 6, i8 6, i8 6, i8 6, i8 6, i8 6, i8 6, i8 6, i8 6, i8 6, i8 6>
%34 = shl <16 x i8> %26, <i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4>
%35 = add nuw nsw <16 x i8> %34, <i8 -112, i8 -112, i8 -112, i8 -112, i8 -112, i8 -112, i8 -112, i8 -112, i8 -112, i8 -112, i8 -112, i8 -112, i8 -112, i8 -112, i8 -112, i8 -112>
%36 = shl <16 x i8> %26, <i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4>
%37 = add nuw nsw <16 x i8> %36, <i8 -112, i8 -112, i8 -112, i8 -112, i8 -112, i8 -112, i8 -112, i8 -112, i8 -112, i8 -112, i8 -112, i8 -112, i8 -112, i8 -112, i8 -112, i8 -112>
%38 = shl <16 x i8> %26, <i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4>
%39 = xor <16 x i1> %29, <i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true>
%40 = select <16 x i1> %39, <16 x i1> %31, <16 x i1> zeroinitializer
%41 = or <16 x i1> %29, %31
%42 = xor <16 x i1> %41, <i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true>
%43 = select <16 x i1> %42, <16 x i1> %33, <16 x i1> zeroinitializer
%44 = select <16 x i1> %41, <16 x i1> <i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true>, <16 x i1> %33
%45 = xor <16 x i1> %44, <i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true>
%46 = select <16 x i1> %40, <16 x i8> %37, <16 x i8> %38
%47 = select <16 x i1> %43, <16 x i8> %35, <16 x i8> %46
%48 = select <16 x i1> %44, <16 x i8> %47, <16 x i8> zeroinitializer
%49 = add <16 x i8> %27, <i8 -48, i8 -48, i8 -48, i8 -48, i8 -48, i8 -48, i8 -48, i8 -48, i8 -48, i8 -48, i8 -48, i8 -48, i8 -48, i8 -48, i8 -48, i8 -48>
%50 = icmp ugt <16 x i8> %49, <i8 9, i8 9, i8 9, i8 9, i8 9, i8 9, i8 9, i8 9, i8 9, i8 9, i8 9, i8 9, i8 9, i8 9, i8 9, i8 9>
%51 = add <16 x i8> %27, <i8 -97, i8 -97, i8 -97, i8 -97, i8 -97, i8 -97, i8 -97, i8 -97, i8 -97, i8 -97, i8 -97, i8 -97, i8 -97, i8 -97, i8 -97, i8 -97>
%52 = icmp ult <16 x i8> %51, <i8 6, i8 6, i8 6, i8 6, i8 6, i8 6, i8 6, i8 6, i8 6, i8 6, i8 6, i8 6, i8 6, i8 6, i8 6, i8 6>
%53 = add <16 x i8> %27, <i8 -65, i8 -65, i8 -65, i8 -65, i8 -65, i8 -65, i8 -65, i8 -65, i8 -65, i8 -65, i8 -65, i8 -65, i8 -65, i8 -65, i8 -65, i8 -65>
%54 = icmp ult <16 x i8> %53, <i8 6, i8 6, i8 6, i8 6, i8 6, i8 6, i8 6, i8 6, i8 6, i8 6, i8 6, i8 6, i8 6, i8 6, i8 6, i8 6>
%55 = add nsw <16 x i8> %27, <i8 -55, i8 -55, i8 -55, i8 -55, i8 -55, i8 -55, i8 -55, i8 -55, i8 -55, i8 -55, i8 -55, i8 -55, i8 -55, i8 -55, i8 -55, i8 -55>
%56 = add nsw <16 x i8> %27, <i8 -87, i8 -87, i8 -87, i8 -87, i8 -87, i8 -87, i8 -87, i8 -87, i8 -87, i8 -87, i8 -87, i8 -87, i8 -87, i8 -87, i8 -87, i8 -87>
%57 = or <16 x i1> %40, %43
%58 = or <16 x i1> %57, %45
%59 = or <16 x i1> %58, %29
%60 = select <16 x i1> %59, <16 x i1> %50, <16 x i1> zeroinitializer
%61 = select <16 x i1> %60, <16 x i1> %52, <16 x i1> zeroinitializer
%62 = xor <16 x i1> %52, <i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true>
%63 = select <16 x i1> %60, <16 x i1> %62, <16 x i1> zeroinitializer
%64 = select <16 x i1> %63, <16 x i1> %54, <16 x i1> zeroinitializer
%65 = xor <16 x i1> %54, <i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true>
%66 = select <16 x i1> %63, <16 x i1> %65, <16 x i1> zeroinitializer
%67 = select <16 x i1> %61, <16 x i8> %56, <16 x i8> %49
%68 = select <16 x i1> %64, <16 x i8> %55, <16 x i8> %67
%69 = select <16 x i1> %66, <16 x i8> zeroinitializer, <16 x i8> %68
%70 = or <16 x i8> %48, %69
%71 = bitcast i8* %21 to <16 x i8>*
store <16 x i8> %70, <16 x i8>* %71
%72 = add nuw i64 %20, 16
%73 = icmp eq i64 %72, %17
br i1 %73, label %74, label %19
74: ; preds = %19
%75 = icmp eq i64 %17, %7
br i1 %75, label %127, label %76
76: ; preds = %9, %6, %74
%77 = phi i64 [ 0, %9 ], [ 0, %6 ], [ %17, %74 ]
%78 = phi i8* [ %1, %9 ], [ %1, %6 ], [ %18, %74 ]
br label %79
79: ; preds = %76, %122
%80 = phi i64 [ %125, %122 ], [ %77, %76 ]
%81 = phi i8* [ %124, %122 ], [ %78, %76 ]
%82 = shl nuw nsw i64 %80, 1
%83 = getelementptr inbounds i8, i8* %0, i64 %82
%84 = load i8, i8* %83
%85 = add i8 %84, -48
%86 = icmp ult i8 %85, 10
br i1 %86, label %87, label %89
87: ; preds = %79
%88 = shl i8 %84, 4
br label %101
89: ; preds = %79
%90 = add i8 %84, -97
%91 = icmp ult i8 %90, 6
br i1 %91, label %92, label %95
92: ; preds = %89
%93 = shl i8 %84, 4
%94 = add nuw nsw i8 %93, -112
br label %101
95: ; preds = %89
%96 = add i8 %84, -65
%97 = icmp ult i8 %96, 6
br i1 %97, label %98, label %101
98: ; preds = %95
%99 = shl i8 %84, 4
%100 = add nuw nsw i8 %99, -112
br label %101
101: ; preds = %92, %98, %95, %87
%102 = phi i8 [ %88, %87 ], [ %94, %92 ], [ %100, %98 ], [ 0, %95 ]
%103 = or i64 %82, 1
%104 = getelementptr inbounds i8, i8* %0, i64 %103
%105 = load i8, i8* %104
%106 = add i8 %105, -48
%107 = icmp ult i8 %106, 10
br i1 %107, label %108, label %110
108: ; preds = %101
%109 = or i8 %106, %102
br label %122
110: ; preds = %101
%111 = add i8 %105, -97
%112 = icmp ult i8 %111, 6
br i1 %112, label %113, label %116
113: ; preds = %110
%114 = add nsw i8 %105, -87
%115 = or i8 %114, %102
br label %122
116: ; preds = %110
%117 = add i8 %105, -65
%118 = icmp ult i8 %117, 6
br i1 %118, label %119, label %122
119: ; preds = %116
%120 = add nsw i8 %105, -55
%121 = or i8 %120, %102
br label %122
122: ; preds = %113, %119, %116, %108
%123 = phi i8 [ %109, %108 ], [ %115, %113 ], [ %121, %119 ], [ %102, %116 ]
store i8 %123, i8* %81
%124 = getelementptr inbounds i8, i8* %81, i64 1
%125 = add nuw nsw i64 %80, 1
%126 = icmp eq i64 %125, %7
br i1 %126, label %127, label %79
127: ; preds = %122, %74, %2
%128 = phi i32 [ 0, %2 ], [ %4, %74 ], [ %4, %122 ]
%129 = phi i8* [ %1, %2 ], [ %18, %74 ], [ %124, %122 ]
store i8 0, i8* %129
ret i32 %128
}