#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 /*<<< orphan*/ FILE;

/* Variables and functions */
int EOF;
scalar_t__ FindMarker(int /*<<< orphan*/ *, char *);
int fgetc(int /*<<< orphan*/ *);
int /*<<< orphan*/ isxdigit(int);
int /*<<< orphan*/ memset(unsigned char *, int, int);
int ReadHex(FILE *infile, unsigned char *A, int Length, char *str) {
  int i, ch, started;
  unsigned char ich;
  if (Length == 0) {
    A[0] = 0x00;
    return 1;
  }
  memset(A, 0x00, Length);
  started = 0;
  if (FindMarker(infile, str))
    while ((ch = fgetc(infile)) != EOF) {
      if (!isxdigit(ch)) {
        if (!started) {
          if (ch == '\n')
            break;
          else
            continue;
        } else
          break;
      }
      started = 1;
      if ((ch >= '0') && (ch <= '9'))
        ich = ch - '0';
      else if ((ch >= 'A') && (ch <= 'F'))
        ich = ch - 'A' + 10;
      else if ((ch >= 'a') && (ch <= 'f'))
        ich = ch - 'a' + 10;
      else
        ich = 0;
      for (i = 0; i < Length - 1; i++)
        A[i] = (A[i] << 4) | (A[i + 1] >> 4);
      A[Length - 1] = (A[Length - 1] << 4) | ich;
    }
  else
    return 0;
  return 1;
}


x86 assembly (clang, -O0):
<ReadHex>:
push   %rbp
mov    %rsp,%rbp
sub    $0x40,%rsp
mov    %rdi,-0x10(%rbp)
mov    %rsi,-0x18(%rbp)
mov    %edx,-0x1c(%rbp)
mov    %rcx,-0x28(%rbp)
cmpl   $0x0,-0x1c(%rbp)
jne    1174 <ReadHex+0x34>
mov    -0x18(%rbp),%rax
movb   $0x0,(%rax)
movl   $0x1,-0x4(%rbp)
jmp    1316 <ReadHex+0x1d6>
mov    -0x18(%rbp),%rdi
mov    -0x1c(%rbp),%edx
xor    %esi,%esi
call   1030 <memset@plt>
movl   $0x0,-0x34(%rbp)
mov    -0x10(%rbp),%rdi
mov    -0x28(%rbp),%rsi
call   1050 <FindMarker@plt>
cmp    $0x0,%rax
je     1303 <ReadHex+0x1c3>
jmp    11a5 <ReadHex+0x65>
mov    -0x10(%rbp),%rdi
call   1040 <fgetc@plt>
mov    %eax,-0x30(%rbp)
mov    0x2e30(%rip),%rcx
cmp    (%rcx),%eax
je     12fe <ReadHex+0x1be>
mov    -0x30(%rbp),%edi
call   1060 <isxdigit@plt>
cmp    $0x0,%eax
jne    11f4 <ReadHex+0xb4>
cmpl   $0x0,-0x34(%rbp)
jne    11ef <ReadHex+0xaf>
cmpl   $0xa,-0x30(%rbp)
jne    11ea <ReadHex+0xaa>
jmp    12fe <ReadHex+0x1be>
jmp    11a5 <ReadHex+0x65>
jmp    12fe <ReadHex+0x1be>
movl   $0x1,-0x34(%rbp)
cmpl   $0x30,-0x30(%rbp)
jl     121d <ReadHex+0xdd>
cmpl   $0x39,-0x30(%rbp)
jg     121d <ReadHex+0xdd>
mov    -0x30(%rbp),%eax
sub    $0x30,%eax
mov    %al,-0x35(%rbp)
jmp    1275 <ReadHex+0x135>
cmpl   $0x41,-0x30(%rbp)
jl     1242 <ReadHex+0x102>
cmpl   $0x46,-0x30(%rbp)
jg     1242 <ReadHex+0x102>
mov    -0x30(%rbp),%eax
sub    $0x41,%eax
add    $0xa,%eax
mov    %al,-0x35(%rbp)
jmp    1270 <ReadHex+0x130>
cmpl   $0x61,-0x30(%rbp)
jl     1267 <ReadHex+0x127>
cmpl   $0x66,-0x30(%rbp)
jg     1267 <ReadHex+0x127>
mov    -0x30(%rbp),%eax
sub    $0x61,%eax
add    $0xa,%eax
mov    %al,-0x35(%rbp)
jmp    126b <ReadHex+0x12b>
movb   $0x0,-0x35(%rbp)
jmp    1270 <ReadHex+0x130>
jmp    1275 <ReadHex+0x135>
movl   $0x0,-0x2c(%rbp)
mov    -0x2c(%rbp),%eax
mov    -0x1c(%rbp),%ecx
sub    $0x1,%ecx
cmp    %ecx,%eax
jge    12cd <ReadHex+0x18d>
mov    -0x18(%rbp),%rax
movslq -0x2c(%rbp),%rcx
movzbl (%rax,%rcx,1),%eax
shl    $0x4,%eax
mov    -0x18(%rbp),%rcx
mov    -0x2c(%rbp),%edx
add    $0x1,%edx
movslq %edx,%rdx
movzbl (%rcx,%rdx,1),%ecx
sar    $0x4,%ecx
or     %ecx,%eax
mov    %al,%dl
mov    -0x18(%rbp),%rax
movslq -0x2c(%rbp),%rcx
mov    %dl,(%rax,%rcx,1)
mov    -0x2c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x2c(%rbp)
jmp    127c <ReadHex+0x13c>
mov    -0x18(%rbp),%rax
mov    -0x1c(%rbp),%ecx
sub    $0x1,%ecx
movslq %ecx,%rcx
movzbl (%rax,%rcx,1),%eax
shl    $0x4,%eax
movzbl -0x35(%rbp),%ecx
or     %ecx,%eax
mov    %al,%dl
mov    -0x18(%rbp),%rax
mov    -0x1c(%rbp),%ecx
sub    $0x1,%ecx
movslq %ecx,%rcx
mov    %dl,(%rax,%rcx,1)
jmp    11a5 <ReadHex+0x65>
jmp    130f <ReadHex+0x1cf>
movl   $0x0,-0x4(%rbp)
jmp    1316 <ReadHex+0x1d6>
movl   $0x1,-0x4(%rbp)
mov    -0x4(%rbp),%eax
add    $0x40,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<ReadHex>:
push   %rbp
push   %r15
push   %r14
push   %r13
push   %r12
push   %rbx
sub    $0x18,%rsp
mov    %rsi,%r13
test   %edx,%edx
je     1368 <ReadHex+0x228>
mov    %rcx,%rbp
mov    %edx,%ebx
mov    %rdi,%r14
xor    %r15d,%r15d
mov    %r13,%rdi
xor    %esi,%esi
call   1030 <memset@plt>
mov    %r14,%rdi
mov    %rbp,%rsi
call   1050 <FindMarker@plt>
test   %rax,%rax
je     1373 <ReadHex+0x233>
mov    %r14,%rdi
call   1040 <fgetc@plt>
mov    %eax,%ebp
mov    0x2e55(%rip),%rax
mov    $0x1,%r15d
cmp    (%rax),%ebp
je     1373 <ReadHex+0x233>
mov    %r14,0x10(%rsp)
lea    -0x1(%rbx),%r12d
movslq %r12d,%rax
mov    %rax,0x8(%rsp)
mov    %r12d,%r14d
and    $0xffffffe0,%r14d
xor    %r15d,%r15d
jmp    11f9 <ReadHex+0xb9>
xchg   %ax,%ax
mov    0x8(%rsp),%rdx
movzbl 0x0(%r13,%rdx,1),%ecx
shl    $0x4,%ecx
or     %edi,%ecx
mov    %cl,0x0(%r13,%rdx,1)
mov    %rbp,%rbx
test   %eax,%eax
setne  %r15b
mov    0x10(%rsp),%rdi
call   1040 <fgetc@plt>
mov    %eax,%ebp
mov    0x2df7(%rip),%rax
cmp    (%rax),%ebp
je     136d <ReadHex+0x22d>
mov    %ebp,%edi
call   1060 <isxdigit@plt>
test   %eax,%eax
je     1230 <ReadHex+0xf0>
lea    -0x30(%rbp),%edi
cmp    $0xa,%edi
movdqa 0xdee(%rip),%xmm5
jb     1257 <ReadHex+0x117>
lea    -0x41(%rbp),%ecx
cmp    $0x5,%ecx
ja     1244 <ReadHex+0x104>
add    $0xffffffc9,%ebp
jmp    1255 <ReadHex+0x115>
cs nopw 0x0(%rax,%rax,1)
nopl   0x0(%rax,%rax,1)
cmp    $0xa,%ebp
sete   %cl
or     %cl,%r15b
test   $0x1,%r15b
je     11d8 <ReadHex+0x98>
jmp    136d <ReadHex+0x22d>
lea    -0x61(%rbp),%ecx
add    $0xffffffa9,%ebp
cmp    $0x6,%ecx
mov    $0x0,%ecx
cmovae %ecx,%ebp
mov    %ebp,%edi
mov    %rbx,%rbp
cmp    $0x2,%ebx
jl     11c0 <ReadHex+0x80>
mov    0x0(%r13),%dl
cmp    $0x20,%r12d
jae    1274 <ReadHex+0x134>
xor    %esi,%esi
jmp    1340 <ReadHex+0x200>
movzbl %dl,%edx
movd   %edx,%xmm0
pslldq $0xf,%xmm0
xor    %edx,%edx
cs nopw 0x0(%rax,%rax,1)
nopl   0x0(%rax)
movdqa %xmm0,%xmm1
movdqu 0x1(%r13,%rdx,1),%xmm2
movdqu 0x11(%r13,%rdx,1),%xmm0
movdqa %xmm2,%xmm3
pslldq $0x1,%xmm3
psrldq $0xf,%xmm1
por    %xmm3,%xmm1
movdqa %xmm2,%xmm3
psrldq $0xf,%xmm3
movdqa %xmm0,%xmm4
pslldq $0x1,%xmm4
por    %xmm3,%xmm4
psrlw  $0x4,%xmm2
movdqa %xmm5,%xmm3
pandn  %xmm2,%xmm3
psllw  $0x4,%xmm1
pand   %xmm5,%xmm1
por    %xmm3,%xmm1
psllw  $0x4,%xmm4
pand   %xmm5,%xmm4
movdqa %xmm0,%xmm2
psrlw  $0x4,%xmm2
movdqa %xmm5,%xmm3
pandn  %xmm2,%xmm3
por    %xmm4,%xmm3
movdqu %xmm1,0x0(%r13,%rdx,1)
movdqu %xmm3,0x10(%r13,%rdx,1)
add    $0x20,%rdx
cmp    %rdx,%r14
jne    1290 <ReadHex+0x150>
cmp    %r12,%r14
je     11c0 <ReadHex+0x80>
pextrw $0x7,%xmm0,%edx
shr    $0x8,%edx
mov    %r14,%rsi
cs nopw 0x0(%rax,%rax,1)
nopl   0x0(%rax,%rax,1)
movzbl 0x1(%r13,%rsi,1),%ebx
mov    %ebx,%ecx
shr    $0x4,%cl
shl    $0x4,%dl
or     %cl,%dl
mov    %dl,0x0(%r13,%rsi,1)
lea    0x1(%rsi),%rcx
mov    %ebx,%edx
mov    %rcx,%rsi
cmp    %rcx,%r12
jne    1340 <ReadHex+0x200>
jmp    11c0 <ReadHex+0x80>
movb   $0x0,0x0(%r13)
mov    $0x1,%r15d
mov    %r15d,%eax
add    $0x18,%rsp
pop    %rbx
pop    %r12
pop    %r13
pop    %r14
pop    %r15
pop    %rbp
ret

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

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