#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 int uint8_t;

/* Variables and functions */
void deser(uint8_t *a, const char *buf) {
  int i;
  for (i = 0; i < 4 * 4; i++) {
    uint8_t v1, v2;
    v1 = buf[i * 2] - '0';
    v2 = buf[i * 2 + 1] - '0';
    if (v1 > 9)
      v1 -= 'a' - '0' - 10;
    if (v2 > 9)
      v2 -= 'a' - '0' - 10;
    a[i] = v1 << 4 | v2;
  }
}


x86 assembly (clang, -O0):
<deser>:
push   %rbp
mov    %rsp,%rbp
mov    %rdi,-0x8(%rbp)
mov    %rsi,-0x10(%rbp)
movl   $0x0,-0x14(%rbp)
cmpl   $0x10,-0x14(%rbp)
jge    1196 <deser+0x96>
mov    -0x10(%rbp),%rax
mov    -0x14(%rbp),%ecx
shl    $0x1,%ecx
movslq %ecx,%rcx
movsbl (%rax,%rcx,1),%eax
sub    $0x30,%eax
mov    %eax,-0x18(%rbp)
mov    -0x10(%rbp),%rax
mov    -0x14(%rbp),%ecx
shl    $0x1,%ecx
add    $0x1,%ecx
movslq %ecx,%rcx
movsbl (%rax,%rcx,1),%eax
sub    $0x30,%eax
mov    %eax,-0x1c(%rbp)
cmpl   $0x9,-0x18(%rbp)
jle    1161 <deser+0x61>
mov    -0x18(%rbp),%eax
sub    $0x27,%eax
mov    %eax,-0x18(%rbp)
cmpl   $0x9,-0x1c(%rbp)
jle    1174 <deser+0x74>
mov    -0x1c(%rbp),%eax
sub    $0x27,%eax
mov    %eax,-0x1c(%rbp)
mov    -0x18(%rbp),%edx
shl    $0x4,%edx
or     -0x1c(%rbp),%edx
mov    -0x8(%rbp),%rax
movslq -0x14(%rbp),%rcx
mov    %edx,(%rax,%rcx,4)
mov    -0x14(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x14(%rbp)
jmp    1113 <deser+0x13>
pop    %rbp
ret

x86 assembly (clang, -O2):
<deser>:
lea    0x20(%rsi),%rax
cmp    %rdi,%rax
jbe    115a <deser+0x5a>
lea    0x40(%rdi),%rax
cmp    %rsi,%rax
jbe    115a <deser+0x5a>
xor    %eax,%eax
cs nopw 0x0(%rax,%rax,1)
xchg   %ax,%ax
movsbl (%rsi,%rax,2),%ecx
lea    -0x30(%rcx),%r8d
lea    -0x57(%rcx),%edx
cmp    $0x3a,%ecx
movsbl 0x1(%rsi,%rax,2),%ecx
cmovl  %r8d,%edx
lea    -0x30(%rcx),%r8d
lea    -0x57(%rcx),%r9d
cmp    $0x3a,%ecx
cmovl  %r8d,%r9d
shl    $0x4,%edx
or     %r9d,%edx
mov    %edx,(%rdi,%rax,4)
add    $0x1,%rax
cmp    $0x10,%rax
jne    1120 <deser+0x20>
ret
movq   (%rsi),%xmm1
movdqa 0xe9a(%rip),%xmm0
movdqa %xmm1,%xmm2
pand   %xmm0,%xmm2
packuswb %xmm2,%xmm2
movdqa %xmm1,%xmm5
psrlw  $0x8,%xmm5
packuswb %xmm5,%xmm5
punpcklwd %xmm1,%xmm4
psllw  $0x8,%xmm1
punpcklwd %xmm1,%xmm6
psrad  $0x18,%xmm6
psrad  $0x18,%xmm4
movdqa 0xe71(%rip),%xmm8
pcmpgtb %xmm8,%xmm2
punpcklbw %xmm2,%xmm2
punpcklwd %xmm2,%xmm7
psrad  $0x18,%xmm7
movdqa 0xe67(%rip),%xmm2
movdqa %xmm7,%xmm1
pandn  %xmm2,%xmm1
movdqa 0xe67(%rip),%xmm3
pand   %xmm3,%xmm7
por    %xmm1,%xmm7
paddd  %xmm6,%xmm7
pcmpgtb %xmm8,%xmm5
punpcklbw %xmm5,%xmm1
punpcklwd %xmm1,%xmm1
psrad  $0x18,%xmm1
movdqa %xmm1,%xmm5
pandn  %xmm2,%xmm5
pand   %xmm3,%xmm1
por    %xmm5,%xmm1
paddd  %xmm4,%xmm1
pslld  $0x4,%xmm7
por    %xmm1,%xmm7
movdqu %xmm7,(%rdi)
movq   0x8(%rsi),%xmm1
movdqa %xmm1,%xmm5
pand   %xmm0,%xmm5
packuswb %xmm5,%xmm5
movdqa %xmm1,%xmm6
psrlw  $0x8,%xmm6
packuswb %xmm6,%xmm6
punpcklwd %xmm1,%xmm4
psllw  $0x8,%xmm1
punpcklwd %xmm1,%xmm1
psrad  $0x18,%xmm1
psrad  $0x18,%xmm4
pcmpgtb %xmm8,%xmm5
punpcklbw %xmm5,%xmm5
punpcklwd %xmm5,%xmm5
psrad  $0x18,%xmm5
movdqa %xmm5,%xmm7
pandn  %xmm2,%xmm7
pand   %xmm3,%xmm5
por    %xmm7,%xmm5
paddd  %xmm1,%xmm5
pcmpgtb %xmm8,%xmm6
punpcklbw %xmm6,%xmm1
punpcklwd %xmm1,%xmm1
psrad  $0x18,%xmm1
movdqa %xmm1,%xmm6
pandn  %xmm2,%xmm6
pand   %xmm3,%xmm1
por    %xmm6,%xmm1
paddd  %xmm4,%xmm1
pslld  $0x4,%xmm5
por    %xmm1,%xmm5
movdqu %xmm5,0x10(%rdi)
movq   0x10(%rsi),%xmm1
movdqa %xmm1,%xmm5
pand   %xmm0,%xmm5
packuswb %xmm5,%xmm5
movdqa %xmm1,%xmm6
psrlw  $0x8,%xmm6
packuswb %xmm6,%xmm6
punpcklwd %xmm1,%xmm4
psllw  $0x8,%xmm1
punpcklwd %xmm1,%xmm1
psrad  $0x18,%xmm1
psrad  $0x18,%xmm4
pcmpgtb %xmm8,%xmm5
punpcklbw %xmm5,%xmm5
punpcklwd %xmm5,%xmm5
psrad  $0x18,%xmm5
movdqa %xmm5,%xmm7
pandn  %xmm2,%xmm7
pand   %xmm3,%xmm5
por    %xmm7,%xmm5
paddd  %xmm1,%xmm5
pcmpgtb %xmm8,%xmm6
punpcklbw %xmm6,%xmm1
punpcklwd %xmm1,%xmm1
psrad  $0x18,%xmm1
movdqa %xmm1,%xmm6
pandn  %xmm2,%xmm6
pand   %xmm3,%xmm1
por    %xmm6,%xmm1
paddd  %xmm4,%xmm1
pslld  $0x4,%xmm5
por    %xmm1,%xmm5
movdqu %xmm5,0x20(%rdi)
movq   0x18(%rsi),%xmm1
pand   %xmm1,%xmm0
packuswb %xmm0,%xmm0
movdqa %xmm1,%xmm5
psrlw  $0x8,%xmm5
packuswb %xmm5,%xmm5
punpcklwd %xmm1,%xmm4
psllw  $0x8,%xmm1
punpcklwd %xmm1,%xmm1
psrad  $0x18,%xmm1
psrad  $0x18,%xmm4
pcmpgtb %xmm8,%xmm0
punpcklbw %xmm0,%xmm0
punpcklwd %xmm0,%xmm0
psrad  $0x18,%xmm0
movdqa %xmm0,%xmm6
pandn  %xmm2,%xmm6
pand   %xmm3,%xmm0
por    %xmm6,%xmm0
paddd  %xmm1,%xmm0
pcmpgtb %xmm8,%xmm5
punpcklbw %xmm5,%xmm1
punpcklwd %xmm1,%xmm1
psrad  $0x18,%xmm1
movdqa %xmm1,%xmm5
pandn  %xmm2,%xmm5
pand   %xmm3,%xmm1
por    %xmm5,%xmm1
paddd  %xmm4,%xmm1
pslld  $0x4,%xmm0
por    %xmm1,%xmm0
movdqu %xmm0,0x30(%rdi)
ret

LLVM IR (-O0):
define void @deser(i32* %0, i8* %1) {
%3 = alloca i32*
%4 = alloca i8*
%5 = alloca i32
%6 = alloca i32
%7 = alloca i32
store i32* %0, i32** %3
store i8* %1, i8** %4
store i32 0, i32* %5
br label %8
8: ; preds = %49, %2
%9 = load i32, i32* %5
%10 = icmp slt i32 %9, 16
br i1 %10, label %11, label %52
11: ; preds = %8
%12 = load i8*, i8** %4
%13 = load i32, i32* %5
%14 = mul nsw i32 %13, 2
%15 = sext i32 %14 to i64
%16 = getelementptr inbounds i8, i8* %12, i64 %15
%17 = load i8, i8* %16
%18 = sext i8 %17 to i32
%19 = sub nsw i32 %18, 48
store i32 %19, i32* %6
%20 = load i8*, i8** %4
%21 = load i32, i32* %5
%22 = mul nsw i32 %21, 2
%23 = add nsw i32 %22, 1
%24 = sext i32 %23 to i64
%25 = getelementptr inbounds i8, i8* %20, i64 %24
%26 = load i8, i8* %25
%27 = sext i8 %26 to i32
%28 = sub nsw i32 %27, 48
store i32 %28, i32* %7
%29 = load i32, i32* %6
%30 = icmp sgt i32 %29, 9
br i1 %30, label %31, label %34
31: ; preds = %11
%32 = load i32, i32* %6
%33 = sub nsw i32 %32, 39
store i32 %33, i32* %6
br label %34
34: ; preds = %31, %11
%35 = load i32, i32* %7
%36 = icmp sgt i32 %35, 9
br i1 %36, label %37, label %40
37: ; preds = %34
%38 = load i32, i32* %7
%39 = sub nsw i32 %38, 39
store i32 %39, i32* %7
br label %40
40: ; preds = %37, %34
%41 = load i32, i32* %6
%42 = shl i32 %41, 4
%43 = load i32, i32* %7
%44 = or i32 %42, %43
%45 = load i32*, i32** %3
%46 = load i32, i32* %5
%47 = sext i32 %46 to i64
%48 = getelementptr inbounds i32, i32* %45, i64 %47
store i32 %44, i32* %48
br label %49
49: ; preds = %40
%50 = load i32, i32* %5
%51 = add nsw i32 %50, 1
store i32 %51, i32* %5
br label %8
52: ; preds = %8
ret void
}

LLVM IR (-O2):
define void @deser(i32* nocapture writeonly %0, i8* nocapture %1) {
%3 = bitcast i32* %0 to i8*
%4 = getelementptr i32, i32* %0, i64 16
%5 = bitcast i32* %4 to i8*
%6 = getelementptr i8, i8* %1, i64 32
%7 = icmp ugt i8* %6, %3
%8 = icmp ugt i8* %5, %1
%9 = and i1 %7, %8
br i1 %9, label %77, label %10
10: ; preds = %2
%11 = bitcast i8* %1 to <8 x i8>*
%12 = load <8 x i8>, <8 x i8>* %11
%13 = shufflevector <8 x i8> %12, <8 x i8> poison, <4 x i32> <i32 0, i32 2, i32 4, i32 6>
%14 = shufflevector <8 x i8> %12, <8 x i8> poison, <4 x i32> <i32 1, i32 3, i32 5, i32 7>
%15 = sext <4 x i8> %13 to <4 x i32>
%16 = sext <4 x i8> %14 to <4 x i32>
%17 = icmp sgt <4 x i8> %13, <i8 57, i8 57, i8 57, i8 57>
%18 = select <4 x i1> %17, <4 x i32> <i32 -87, i32 -87, i32 -87, i32 -87>, <4 x i32> <i32 -48, i32 -48, i32 -48, i32 -48>
%19 = add nsw <4 x i32> %18, %15
%20 = icmp sgt <4 x i8> %14, <i8 57, i8 57, i8 57, i8 57>
%21 = select <4 x i1> %20, <4 x i32> <i32 -87, i32 -87, i32 -87, i32 -87>, <4 x i32> <i32 -48, i32 -48, i32 -48, i32 -48>
%22 = add nsw <4 x i32> %21, %16
%23 = shl nsw <4 x i32> %19, <i32 4, i32 4, i32 4, i32 4>
%24 = or <4 x i32> %23, %22
%25 = bitcast i32* %0 to <4 x i32>*
store <4 x i32> %24, <4 x i32>* %25
%26 = getelementptr inbounds i8, i8* %1, i64 8
%27 = bitcast i8* %26 to <8 x i8>*
%28 = load <8 x i8>, <8 x i8>* %27
%29 = shufflevector <8 x i8> %28, <8 x i8> poison, <4 x i32> <i32 0, i32 2, i32 4, i32 6>
%30 = shufflevector <8 x i8> %28, <8 x i8> poison, <4 x i32> <i32 1, i32 3, i32 5, i32 7>
%31 = sext <4 x i8> %29 to <4 x i32>
%32 = sext <4 x i8> %30 to <4 x i32>
%33 = icmp sgt <4 x i8> %29, <i8 57, i8 57, i8 57, i8 57>
%34 = select <4 x i1> %33, <4 x i32> <i32 -87, i32 -87, i32 -87, i32 -87>, <4 x i32> <i32 -48, i32 -48, i32 -48, i32 -48>
%35 = add nsw <4 x i32> %34, %31
%36 = icmp sgt <4 x i8> %30, <i8 57, i8 57, i8 57, i8 57>
%37 = select <4 x i1> %36, <4 x i32> <i32 -87, i32 -87, i32 -87, i32 -87>, <4 x i32> <i32 -48, i32 -48, i32 -48, i32 -48>
%38 = add nsw <4 x i32> %37, %32
%39 = shl nsw <4 x i32> %35, <i32 4, i32 4, i32 4, i32 4>
%40 = or <4 x i32> %39, %38
%41 = getelementptr inbounds i32, i32* %0, i64 4
%42 = bitcast i32* %41 to <4 x i32>*
store <4 x i32> %40, <4 x i32>* %42
%43 = getelementptr inbounds i8, i8* %1, i64 16
%44 = bitcast i8* %43 to <8 x i8>*
%45 = load <8 x i8>, <8 x i8>* %44
%46 = shufflevector <8 x i8> %45, <8 x i8> poison, <4 x i32> <i32 0, i32 2, i32 4, i32 6>
%47 = shufflevector <8 x i8> %45, <8 x i8> poison, <4 x i32> <i32 1, i32 3, i32 5, i32 7>
%48 = sext <4 x i8> %46 to <4 x i32>
%49 = sext <4 x i8> %47 to <4 x i32>
%50 = icmp sgt <4 x i8> %46, <i8 57, i8 57, i8 57, i8 57>
%51 = select <4 x i1> %50, <4 x i32> <i32 -87, i32 -87, i32 -87, i32 -87>, <4 x i32> <i32 -48, i32 -48, i32 -48, i32 -48>
%52 = add nsw <4 x i32> %51, %48
%53 = icmp sgt <4 x i8> %47, <i8 57, i8 57, i8 57, i8 57>
%54 = select <4 x i1> %53, <4 x i32> <i32 -87, i32 -87, i32 -87, i32 -87>, <4 x i32> <i32 -48, i32 -48, i32 -48, i32 -48>
%55 = add nsw <4 x i32> %54, %49
%56 = shl nsw <4 x i32> %52, <i32 4, i32 4, i32 4, i32 4>
%57 = or <4 x i32> %56, %55
%58 = getelementptr inbounds i32, i32* %0, i64 8
%59 = bitcast i32* %58 to <4 x i32>*
store <4 x i32> %57, <4 x i32>* %59
%60 = getelementptr inbounds i8, i8* %1, i64 24
%61 = bitcast i8* %60 to <8 x i8>*
%62 = load <8 x i8>, <8 x i8>* %61
%63 = shufflevector <8 x i8> %62, <8 x i8> poison, <4 x i32> <i32 0, i32 2, i32 4, i32 6>
%64 = shufflevector <8 x i8> %62, <8 x i8> poison, <4 x i32> <i32 1, i32 3, i32 5, i32 7>
%65 = sext <4 x i8> %63 to <4 x i32>
%66 = sext <4 x i8> %64 to <4 x i32>
%67 = icmp sgt <4 x i8> %63, <i8 57, i8 57, i8 57, i8 57>
%68 = select <4 x i1> %67, <4 x i32> <i32 -87, i32 -87, i32 -87, i32 -87>, <4 x i32> <i32 -48, i32 -48, i32 -48, i32 -48>
%69 = add nsw <4 x i32> %68, %65
%70 = icmp sgt <4 x i8> %64, <i8 57, i8 57, i8 57, i8 57>
%71 = select <4 x i1> %70, <4 x i32> <i32 -87, i32 -87, i32 -87, i32 -87>, <4 x i32> <i32 -48, i32 -48, i32 -48, i32 -48>
%72 = add nsw <4 x i32> %71, %66
%73 = shl nsw <4 x i32> %69, <i32 4, i32 4, i32 4, i32 4>
%74 = or <4 x i32> %73, %72
%75 = getelementptr inbounds i32, i32* %0, i64 12
%76 = bitcast i32* %75 to <4 x i32>*
store <4 x i32> %74, <4 x i32>* %76
br label %98
77: ; preds = %2, %77
%78 = phi i64 [ %96, %77 ], [ 0, %2 ]
%79 = shl nuw nsw i64 %78, 1
%80 = getelementptr inbounds i8, i8* %1, i64 %79
%81 = load i8, i8* %80
%82 = sext i8 %81 to i32
%83 = or i64 %79, 1
%84 = getelementptr inbounds i8, i8* %1, i64 %83
%85 = load i8, i8* %84
%86 = sext i8 %85 to i32
%87 = icmp sgt i8 %81, 57
%88 = select i1 %87, i32 -87, i32 -48
%89 = add nsw i32 %88, %82
%90 = icmp sgt i8 %85, 57
%91 = select i1 %90, i32 -87, i32 -48
%92 = add nsw i32 %91, %86
%93 = shl nsw i32 %89, 4
%94 = or i32 %93, %92
%95 = getelementptr inbounds i32, i32* %0, i64 %78
store i32 %94, i32* %95
%96 = add nuw nsw i64 %78, 1
%97 = icmp eq i64 %96, 16
br i1 %97, label %98, label %77
98: ; preds = %77, %10
ret void
}