#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 *);
void wep_copy(char *buf, char *key) {
  int i, len;
  len = strlen(key) / 2;
  for (i = 0; i < len; i++) {
    int h, l;
    h = key[i * 2];
    l = key[i * 2 + 1];
    if ((h >= '0') && (h <= '9')) {
      h = h - '0';
    } else {
      h = h - 'A' + 10;
    }
    if ((l >= '0') && (l <= '9')) {
      l = l - '0';
    } else {
      l = l - 'A' + 10;
    }
    buf[i] = (h << 4) | l;
  }
}


x86 assembly (clang, -O0):
<wep_copy>:
push   %rbp
mov    %rsp,%rbp
sub    $0x20,%rsp
mov    %rdi,-0x8(%rbp)
mov    %rsi,-0x10(%rbp)
mov    -0x10(%rbp),%rdi
call   1030 <strlen@plt>
mov    $0x2,%ecx
cltd
idiv   %ecx
mov    %eax,-0x18(%rbp)
movl   $0x0,-0x14(%rbp)
mov    -0x14(%rbp),%eax
cmp    -0x18(%rbp),%eax
jge    11f2 <wep_copy+0xe2>
mov    -0x10(%rbp),%rax
mov    -0x14(%rbp),%ecx
shl    $0x1,%ecx
movslq %ecx,%rcx
movsbl (%rax,%rcx,1),%eax
mov    %eax,-0x1c(%rbp)
mov    -0x10(%rbp),%rax
mov    -0x14(%rbp),%ecx
shl    $0x1,%ecx
add    $0x1,%ecx
movslq %ecx,%rcx
movsbl (%rax,%rcx,1),%eax
mov    %eax,-0x20(%rbp)
cmpl   $0x30,-0x1c(%rbp)
jl     1194 <wep_copy+0x84>
cmpl   $0x39,-0x1c(%rbp)
jg     1194 <wep_copy+0x84>
mov    -0x1c(%rbp),%eax
sub    $0x30,%eax
mov    %eax,-0x1c(%rbp)
jmp    11a0 <wep_copy+0x90>
mov    -0x1c(%rbp),%eax
sub    $0x41,%eax
add    $0xa,%eax
mov    %eax,-0x1c(%rbp)
cmpl   $0x30,-0x20(%rbp)
jl     11c2 <wep_copy+0xb2>
cmpl   $0x39,-0x20(%rbp)
jg     11c2 <wep_copy+0xb2>
mov    -0x20(%rbp),%eax
sub    $0x30,%eax
mov    %eax,-0x20(%rbp)
jmp    11ce <wep_copy+0xbe>
mov    -0x20(%rbp),%eax
sub    $0x41,%eax
add    $0xa,%eax
mov    %eax,-0x20(%rbp)
mov    -0x1c(%rbp),%eax
shl    $0x4,%eax
or     -0x20(%rbp),%eax
mov    %al,%dl
mov    -0x8(%rbp),%rax
movslq -0x14(%rbp),%rcx
mov    %dl,(%rax,%rcx,1)
mov    -0x14(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x14(%rbp)
jmp    113b <wep_copy+0x2b>
add    $0x20,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<wep_copy>:
push   %r14
push   %rbx
push   %rax
mov    %rsi,%rbx
mov    %rdi,%r14
mov    %rsi,%rdi
call   1030 <strlen@plt>
cmp    $0x2,%eax
jl     1356 <wep_copy+0x246>
mov    %eax,%ecx
shr    %ecx
cmp    $0x10,%eax
jae    113b <wep_copy+0x2b>
xor    %eax,%eax
jmp    1310 <wep_copy+0x200>
lea    (%rbx,%rcx,2),%rdx
cmp    %r14,%rdx
jbe    1154 <wep_copy+0x44>
lea    (%r14,%rcx,1),%rdx
cmp    %rbx,%rdx
jbe    1154 <wep_copy+0x44>
xor    %eax,%eax
jmp    1310 <wep_copy+0x200>
cmp    $0x20,%eax
jae    1160 <wep_copy+0x50>
xor    %eax,%eax
jmp    1238 <wep_copy+0x128>
mov    %ecx,%eax
and    $0xfffffff0,%eax
xor    %edx,%edx
movdqa 0xe91(%rip),%xmm0
movdqa 0xe99(%rip),%xmm1
movdqa 0xea1(%rip),%xmm2
movdqa 0xea8(%rip),%xmm8
movdqa 0xeb0(%rip),%xmm4
movdqu (%rbx,%rdx,2),%xmm3
movdqu 0x10(%rbx,%rdx,2),%xmm6
movdqa %xmm6,%xmm7
pand   %xmm0,%xmm7
movdqa %xmm3,%xmm5
pand   %xmm0,%xmm5
packuswb %xmm7,%xmm5
psrlw  $0x8,%xmm6
psrlw  $0x8,%xmm3
packuswb %xmm6,%xmm3
movdqa %xmm5,%xmm6
paddb  %xmm1,%xmm6
movdqa %xmm6,%xmm7
pminub %xmm2,%xmm7
pcmpeqb %xmm6,%xmm7
paddb  %xmm2,%xmm5
pand   %xmm7,%xmm6
pandn  %xmm5,%xmm7
por    %xmm6,%xmm7
movdqa %xmm3,%xmm5
paddb  %xmm1,%xmm5
movdqa %xmm5,%xmm6
pminub %xmm2,%xmm6
pcmpeqb %xmm5,%xmm6
paddb  %xmm8,%xmm3
pand   %xmm6,%xmm5
pandn  %xmm3,%xmm6
por    %xmm5,%xmm6
psllw  $0x4,%xmm7
pand   %xmm4,%xmm7
por    %xmm6,%xmm7
movdqu %xmm7,(%r14,%rdx,1)
add    $0x10,%rdx
cmp    %rdx,%rax
jne    1190 <wep_copy+0x80>
cmp    %rcx,%rax
je     1356 <wep_copy+0x246>
test   $0x8,%cl
je     1310 <wep_copy+0x200>
mov    %rax,%rdx
mov    %ecx,%eax
and    $0xfffffff8,%eax
movdqa 0xdb7(%rip),%xmm8
movdqa 0xdff(%rip),%xmm1
movdqa 0xe07(%rip),%xmm2
movdqa 0xe0e(%rip),%xmm9
movdqa 0xe16(%rip),%xmm4
movdqa 0xdce(%rip),%xmm5
cs nopw 0x0(%rax,%rax,1)
nopl   0x0(%rax)
movdqu (%rbx,%rdx,2),%xmm6
movdqa %xmm6,%xmm7
pand   %xmm8,%xmm7
packuswb %xmm7,%xmm7
psrlw  $0x8,%xmm6
packuswb %xmm6,%xmm6
movdqa %xmm7,%xmm3
paddb  %xmm1,%xmm3
movdqa %xmm3,%xmm0
pmaxub %xmm2,%xmm0
pcmpeqb %xmm3,%xmm0
paddb  %xmm9,%xmm7
pand   %xmm0,%xmm7
pandn  %xmm3,%xmm0
por    %xmm7,%xmm0
movdqa %xmm6,%xmm3
paddb  %xmm1,%xmm3
movdqa %xmm3,%xmm7
pmaxub %xmm2,%xmm7
pcmpeqb %xmm3,%xmm7
paddb  %xmm4,%xmm6
pand   %xmm7,%xmm6
pandn  %xmm3,%xmm7
por    %xmm6,%xmm7
psllw  $0x4,%xmm0
pand   %xmm5,%xmm0
por    %xmm7,%xmm0
movq   %xmm0,(%r14,%rdx,1)
add    $0x8,%rdx
cmp    %rdx,%rax
jne    1280 <wep_copy+0x170>
cmp    %rcx,%rax
je     1356 <wep_copy+0x246>
cs nopw 0x0(%rax,%rax,1)
nop
movzbl (%rbx,%rax,2),%edx
movzbl 0x1(%rbx,%rax,2),%esi
lea    -0x30(%rdx),%edi
add    $0x9,%dl
cmp    $0xa,%dil
movzbl %dil,%edi
movzbl %dl,%edx
cmovb  %edi,%edx
lea    -0x30(%rsi),%edi
add    $0xc9,%sil
cmp    $0xa,%dil
movzbl %dil,%edi
movzbl %sil,%esi
cmovb  %edi,%esi
shl    $0x4,%dl
or     %sil,%dl
mov    %dl,(%r14,%rax,1)
add    $0x1,%rax
cmp    %rax,%rcx
jne    1310 <wep_copy+0x200>
add    $0x8,%rsp
pop    %rbx
pop    %r14
ret

LLVM IR (-O0):
define void @wep_copy(i8* %0, i8* %1) {
%3 = alloca i8*
%4 = alloca i8*
%5 = alloca i32
%6 = alloca i32
%7 = alloca i32
%8 = alloca i32
store i8* %0, i8** %3
store i8* %1, i8** %4
%9 = load i8*, i8** %4
%10 = call i32 @strlen(i8* %9)
%11 = sdiv i32 %10, 2
store i32 %11, i32* %6
store i32 0, i32* %5
br label %12
12: ; preds = %67, %2
%13 = load i32, i32* %5
%14 = load i32, i32* %6
%15 = icmp slt i32 %13, %14
br i1 %15, label %16, label %70
16: ; preds = %12
%17 = load i8*, i8** %4
%18 = load i32, i32* %5
%19 = mul nsw i32 %18, 2
%20 = sext i32 %19 to i64
%21 = getelementptr inbounds i8, i8* %17, i64 %20
%22 = load i8, i8* %21
%23 = sext i8 %22 to i32
store i32 %23, i32* %7
%24 = load i8*, i8** %4
%25 = load i32, i32* %5
%26 = mul nsw i32 %25, 2
%27 = add nsw i32 %26, 1
%28 = sext i32 %27 to i64
%29 = getelementptr inbounds i8, i8* %24, i64 %28
%30 = load i8, i8* %29
%31 = sext i8 %30 to i32
store i32 %31, i32* %8
%32 = load i32, i32* %7
%33 = icmp sge i32 %32, 48
br i1 %33, label %34, label %40
34: ; preds = %16
%35 = load i32, i32* %7
%36 = icmp sle i32 %35, 57
br i1 %36, label %37, label %40
37: ; preds = %34
%38 = load i32, i32* %7
%39 = sub nsw i32 %38, 48
store i32 %39, i32* %7
br label %44
40: ; preds = %34, %16
%41 = load i32, i32* %7
%42 = sub nsw i32 %41, 65
%43 = add nsw i32 %42, 10
store i32 %43, i32* %7
br label %44
44: ; preds = %40, %37
%45 = load i32, i32* %8
%46 = icmp sge i32 %45, 48
br i1 %46, label %47, label %53
47: ; preds = %44
%48 = load i32, i32* %8
%49 = icmp sle i32 %48, 57
br i1 %49, label %50, label %53
50: ; preds = %47
%51 = load i32, i32* %8
%52 = sub nsw i32 %51, 48
store i32 %52, i32* %8
br label %57
53: ; preds = %47, %44
%54 = load i32, i32* %8
%55 = sub nsw i32 %54, 65
%56 = add nsw i32 %55, 10
store i32 %56, i32* %8
br label %57
57: ; preds = %53, %50
%58 = load i32, i32* %7
%59 = shl i32 %58, 4
%60 = load i32, i32* %8
%61 = or i32 %59, %60
%62 = trunc i32 %61 to i8
%63 = load i8*, i8** %3
%64 = load i32, i32* %5
%65 = sext i32 %64 to i64
%66 = getelementptr inbounds i8, i8* %63, i64 %65
store i8 %62, i8* %66
br label %67
67: ; preds = %57
%68 = load i32, i32* %5
%69 = add nsw i32 %68, 1
store i32 %69, i32* %5
br label %12
70: ; preds = %12
ret void
}

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