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

/* Variables and functions */
void aes_addRoundKey_cpy(uint8_t *buf, uint8_t *key, uint8_t *cpk) {
  register uint8_t i = 16;
  while (i--)
    buf[i] ^= (cpk[i] = key[i]), cpk[16 + i] = key[16 + i];
}


x86 assembly (clang, -O0):
<aes_addRoundKey_cpy>:
push   %rbp
mov    %rsp,%rbp
mov    %rdi,-0x8(%rbp)
mov    %rsi,-0x10(%rbp)
mov    %rdx,-0x18(%rbp)
movq   $0x10,-0x20(%rbp)
mov    -0x20(%rbp),%rax
mov    %rax,%rcx
add    $0xffffffffffffffff,%rcx
mov    %rcx,-0x20(%rbp)
cmp    $0x0,%rax
je     117e <aes_addRoundKey_cpy+0x7e>
mov    -0x10(%rbp),%rax
mov    -0x20(%rbp),%rcx
mov    (%rax,%rcx,8),%rdx
mov    -0x18(%rbp),%rax
mov    -0x20(%rbp),%rcx
mov    %rdx,(%rax,%rcx,8)
mov    -0x8(%rbp),%rax
mov    -0x20(%rbp),%rcx
xor    (%rax,%rcx,8),%rdx
mov    %rdx,(%rax,%rcx,8)
mov    -0x10(%rbp),%rax
mov    -0x20(%rbp),%rcx
add    $0x10,%rcx
mov    (%rax,%rcx,8),%rdx
mov    -0x18(%rbp),%rax
mov    -0x20(%rbp),%rcx
add    $0x10,%rcx
mov    %rdx,(%rax,%rcx,8)
jmp    1118 <aes_addRoundKey_cpy+0x18>
pop    %rbp
ret

x86 assembly (clang, -O2):
<aes_addRoundKey_cpy>:
push   %rbp
push   %r14
push   %rbx
lea    0x80(%rdi),%rax
cmp    %rdx,%rax
seta   %r11b
lea    0x100(%rdx),%rcx
cmp    %rdi,%rcx
seta   %r14b
lea    0x100(%rsi),%rbp
cmp    %rdx,%rbp
seta   %bl
cmp    %rsi,%rcx
seta   %r9b
cmp    %rdi,%rbp
seta   %r10b
cmp    %rsi,%rax
seta   %r8b
test   %r14b,%r11b
jne    1263 <aes_addRoundKey_cpy+0x163>
and    %r9b,%bl
jne    1263 <aes_addRoundKey_cpy+0x163>
and    %r8b,%r10b
jne    1263 <aes_addRoundKey_cpy+0x163>
movups 0x70(%rsi),%xmm0
movups %xmm0,0x70(%rdx)
movups 0x70(%rdi),%xmm1
xorps  %xmm0,%xmm1
movups %xmm1,0x70(%rdi)
movups 0xf0(%rsi),%xmm0
movups %xmm0,0xf0(%rdx)
movups 0x60(%rsi),%xmm0
movups %xmm0,0x60(%rdx)
movups 0x60(%rdi),%xmm1
xorps  %xmm0,%xmm1
movups %xmm1,0x60(%rdi)
movups 0xe0(%rsi),%xmm0
movups %xmm0,0xe0(%rdx)
movups 0x50(%rsi),%xmm0
movups %xmm0,0x50(%rdx)
movups 0x50(%rdi),%xmm1
xorps  %xmm0,%xmm1
movups %xmm1,0x50(%rdi)
movups 0xd0(%rsi),%xmm0
movups %xmm0,0xd0(%rdx)
movups 0x40(%rsi),%xmm0
movups %xmm0,0x40(%rdx)
movups 0x40(%rdi),%xmm1
xorps  %xmm0,%xmm1
movups %xmm1,0x40(%rdi)
movups 0xc0(%rsi),%xmm0
movups %xmm0,0xc0(%rdx)
movups 0x30(%rsi),%xmm0
movups %xmm0,0x30(%rdx)
movups 0x30(%rdi),%xmm1
xorps  %xmm0,%xmm1
movups %xmm1,0x30(%rdi)
movups 0xb0(%rsi),%xmm0
movups %xmm0,0xb0(%rdx)
movups 0x20(%rsi),%xmm0
movups %xmm0,0x20(%rdx)
movups 0x20(%rdi),%xmm1
xorps  %xmm0,%xmm1
movups %xmm1,0x20(%rdi)
movups 0xa0(%rsi),%xmm0
movups %xmm0,0xa0(%rdx)
movups 0x10(%rsi),%xmm0
movups %xmm0,0x10(%rdx)
movups 0x10(%rdi),%xmm1
xorps  %xmm0,%xmm1
movups %xmm1,0x10(%rdi)
movups 0x90(%rsi),%xmm0
movups %xmm0,0x90(%rdx)
movups (%rsi),%xmm0
movups %xmm0,(%rdx)
movups (%rdi),%xmm1
xorps  %xmm0,%xmm1
movups %xmm1,(%rdi)
movups 0x80(%rsi),%xmm0
movups %xmm0,0x80(%rdx)
jmp    12af <aes_addRoundKey_cpy+0x1af>
mov    $0xf,%eax
nopl   0x0(%rax,%rax,1)
mov    (%rsi,%rax,8),%rcx
mov    %rcx,(%rdx,%rax,8)
xor    %rcx,(%rdi,%rax,8)
mov    0x80(%rsi,%rax,8),%rcx
mov    %rcx,0x80(%rdx,%rax,8)
mov    -0x8(%rsi,%rax,8),%rcx
mov    %rcx,-0x8(%rdx,%rax,8)
xor    %rcx,-0x8(%rdi,%rax,8)
mov    0x78(%rsi,%rax,8),%rcx
mov    %rcx,0x78(%rdx,%rax,8)
add    $0xfffffffffffffffe,%rax
cmp    $0xffffffffffffffff,%rax
jne    1270 <aes_addRoundKey_cpy+0x170>
pop    %rbx
pop    %r14
pop    %rbp
ret

LLVM IR (-O0):
define void @aes_addRoundKey_cpy(i64* %0, i64* %1, i64* %2) {
%4 = alloca i64*
%5 = alloca i64*
%6 = alloca i64*
%7 = alloca i64
store i64* %0, i64** %4
store i64* %1, i64** %5
store i64* %2, i64** %6
store i64 16, i64* %7
br label %8
8: ; preds = %12, %3
%9 = load i64, i64* %7
%10 = add i64 %9, -1
store i64 %10, i64* %7
%11 = icmp ne i64 %9, 0
br i1 %11, label %12, label %34
12: ; preds = %8
%13 = load i64*, i64** %5
%14 = load i64, i64* %7
%15 = getelementptr inbounds i64, i64* %13, i64 %14
%16 = load i64, i64* %15
%17 = load i64*, i64** %6
%18 = load i64, i64* %7
%19 = getelementptr inbounds i64, i64* %17, i64 %18
store i64 %16, i64* %19
%20 = load i64*, i64** %4
%21 = load i64, i64* %7
%22 = getelementptr inbounds i64, i64* %20, i64 %21
%23 = load i64, i64* %22
%24 = xor i64 %23, %16
store i64 %24, i64* %22
%25 = load i64*, i64** %5
%26 = load i64, i64* %7
%27 = add i64 16, %26
%28 = getelementptr inbounds i64, i64* %25, i64 %27
%29 = load i64, i64* %28
%30 = load i64*, i64** %6
%31 = load i64, i64* %7
%32 = add i64 16, %31
%33 = getelementptr inbounds i64, i64* %30, i64 %32
store i64 %29, i64* %33
br label %8
34: ; preds = %8
ret void
}

LLVM IR (-O2):
define void @aes_addRoundKey_cpy(i64* nocapture %0, i64* nocapture %1, i64* nocapture writeonly %2) {
%4 = getelementptr i64, i64* %2, i64 32
%5 = getelementptr i64, i64* %0, i64 16
%6 = getelementptr i64, i64* %1, i64 32
%7 = icmp ugt i64* %5, %2
%8 = icmp ugt i64* %4, %0
%9 = and i1 %7, %8
%10 = icmp ugt i64* %6, %2
%11 = icmp ugt i64* %4, %1
%12 = and i1 %10, %11
%13 = or i1 %9, %12
%14 = icmp ugt i64* %6, %0
%15 = icmp ugt i64* %5, %1
%16 = and i1 %14, %15
%17 = or i1 %13, %16
br i1 %17, label %136, label %18
18: ; preds = %3
%19 = getelementptr inbounds i64, i64* %1, i64 14
%20 = bitcast i64* %19 to <2 x i64>*
%21 = load <2 x i64>, <2 x i64>* %20
%22 = getelementptr inbounds i64, i64* %2, i64 14
%23 = bitcast i64* %22 to <2 x i64>*
store <2 x i64> %21, <2 x i64>* %23
%24 = getelementptr inbounds i64, i64* %0, i64 14
%25 = bitcast i64* %24 to <2 x i64>*
%26 = load <2 x i64>, <2 x i64>* %25
%27 = xor <2 x i64> %26, %21
%28 = bitcast i64* %24 to <2 x i64>*
store <2 x i64> %27, <2 x i64>* %28
%29 = getelementptr inbounds i64, i64* %1, i64 30
%30 = bitcast i64* %29 to <2 x i64>*
%31 = load <2 x i64>, <2 x i64>* %30
%32 = getelementptr inbounds i64, i64* %2, i64 30
%33 = bitcast i64* %32 to <2 x i64>*
store <2 x i64> %31, <2 x i64>* %33
%34 = getelementptr inbounds i64, i64* %1, i64 12
%35 = bitcast i64* %34 to <2 x i64>*
%36 = load <2 x i64>, <2 x i64>* %35
%37 = getelementptr inbounds i64, i64* %2, i64 12
%38 = bitcast i64* %37 to <2 x i64>*
store <2 x i64> %36, <2 x i64>* %38
%39 = getelementptr inbounds i64, i64* %0, i64 12
%40 = bitcast i64* %39 to <2 x i64>*
%41 = load <2 x i64>, <2 x i64>* %40
%42 = xor <2 x i64> %41, %36
%43 = bitcast i64* %39 to <2 x i64>*
store <2 x i64> %42, <2 x i64>* %43
%44 = getelementptr inbounds i64, i64* %1, i64 28
%45 = bitcast i64* %44 to <2 x i64>*
%46 = load <2 x i64>, <2 x i64>* %45
%47 = getelementptr inbounds i64, i64* %2, i64 28
%48 = bitcast i64* %47 to <2 x i64>*
store <2 x i64> %46, <2 x i64>* %48
%49 = getelementptr inbounds i64, i64* %1, i64 10
%50 = bitcast i64* %49 to <2 x i64>*
%51 = load <2 x i64>, <2 x i64>* %50
%52 = getelementptr inbounds i64, i64* %2, i64 10
%53 = bitcast i64* %52 to <2 x i64>*
store <2 x i64> %51, <2 x i64>* %53
%54 = getelementptr inbounds i64, i64* %0, i64 10
%55 = bitcast i64* %54 to <2 x i64>*
%56 = load <2 x i64>, <2 x i64>* %55
%57 = xor <2 x i64> %56, %51
%58 = bitcast i64* %54 to <2 x i64>*
store <2 x i64> %57, <2 x i64>* %58
%59 = getelementptr inbounds i64, i64* %1, i64 26
%60 = bitcast i64* %59 to <2 x i64>*
%61 = load <2 x i64>, <2 x i64>* %60
%62 = getelementptr inbounds i64, i64* %2, i64 26
%63 = bitcast i64* %62 to <2 x i64>*
store <2 x i64> %61, <2 x i64>* %63
%64 = getelementptr inbounds i64, i64* %1, i64 8
%65 = bitcast i64* %64 to <2 x i64>*
%66 = load <2 x i64>, <2 x i64>* %65
%67 = getelementptr inbounds i64, i64* %2, i64 8
%68 = bitcast i64* %67 to <2 x i64>*
store <2 x i64> %66, <2 x i64>* %68
%69 = getelementptr inbounds i64, i64* %0, i64 8
%70 = bitcast i64* %69 to <2 x i64>*
%71 = load <2 x i64>, <2 x i64>* %70
%72 = xor <2 x i64> %71, %66
%73 = bitcast i64* %69 to <2 x i64>*
store <2 x i64> %72, <2 x i64>* %73
%74 = getelementptr inbounds i64, i64* %1, i64 24
%75 = bitcast i64* %74 to <2 x i64>*
%76 = load <2 x i64>, <2 x i64>* %75
%77 = getelementptr inbounds i64, i64* %2, i64 24
%78 = bitcast i64* %77 to <2 x i64>*
store <2 x i64> %76, <2 x i64>* %78
%79 = getelementptr inbounds i64, i64* %1, i64 6
%80 = bitcast i64* %79 to <2 x i64>*
%81 = load <2 x i64>, <2 x i64>* %80
%82 = getelementptr inbounds i64, i64* %2, i64 6
%83 = bitcast i64* %82 to <2 x i64>*
store <2 x i64> %81, <2 x i64>* %83
%84 = getelementptr inbounds i64, i64* %0, i64 6
%85 = bitcast i64* %84 to <2 x i64>*
%86 = load <2 x i64>, <2 x i64>* %85
%87 = xor <2 x i64> %86, %81
%88 = bitcast i64* %84 to <2 x i64>*
store <2 x i64> %87, <2 x i64>* %88
%89 = getelementptr inbounds i64, i64* %1, i64 22
%90 = bitcast i64* %89 to <2 x i64>*
%91 = load <2 x i64>, <2 x i64>* %90
%92 = getelementptr inbounds i64, i64* %2, i64 22
%93 = bitcast i64* %92 to <2 x i64>*
store <2 x i64> %91, <2 x i64>* %93
%94 = getelementptr inbounds i64, i64* %1, i64 4
%95 = bitcast i64* %94 to <2 x i64>*
%96 = load <2 x i64>, <2 x i64>* %95
%97 = getelementptr inbounds i64, i64* %2, i64 4
%98 = bitcast i64* %97 to <2 x i64>*
store <2 x i64> %96, <2 x i64>* %98
%99 = getelementptr inbounds i64, i64* %0, i64 4
%100 = bitcast i64* %99 to <2 x i64>*
%101 = load <2 x i64>, <2 x i64>* %100
%102 = xor <2 x i64> %101, %96
%103 = bitcast i64* %99 to <2 x i64>*
store <2 x i64> %102, <2 x i64>* %103
%104 = getelementptr inbounds i64, i64* %1, i64 20
%105 = bitcast i64* %104 to <2 x i64>*
%106 = load <2 x i64>, <2 x i64>* %105
%107 = getelementptr inbounds i64, i64* %2, i64 20
%108 = bitcast i64* %107 to <2 x i64>*
store <2 x i64> %106, <2 x i64>* %108
%109 = getelementptr inbounds i64, i64* %1, i64 2
%110 = bitcast i64* %109 to <2 x i64>*
%111 = load <2 x i64>, <2 x i64>* %110
%112 = getelementptr inbounds i64, i64* %2, i64 2
%113 = bitcast i64* %112 to <2 x i64>*
store <2 x i64> %111, <2 x i64>* %113
%114 = getelementptr inbounds i64, i64* %0, i64 2
%115 = bitcast i64* %114 to <2 x i64>*
%116 = load <2 x i64>, <2 x i64>* %115
%117 = xor <2 x i64> %116, %111
%118 = bitcast i64* %114 to <2 x i64>*
store <2 x i64> %117, <2 x i64>* %118
%119 = getelementptr inbounds i64, i64* %1, i64 18
%120 = bitcast i64* %119 to <2 x i64>*
%121 = load <2 x i64>, <2 x i64>* %120
%122 = getelementptr inbounds i64, i64* %2, i64 18
%123 = bitcast i64* %122 to <2 x i64>*
store <2 x i64> %121, <2 x i64>* %123
%124 = bitcast i64* %1 to <2 x i64>*
%125 = load <2 x i64>, <2 x i64>* %124
%126 = bitcast i64* %2 to <2 x i64>*
store <2 x i64> %125, <2 x i64>* %126
%127 = bitcast i64* %0 to <2 x i64>*
%128 = load <2 x i64>, <2 x i64>* %127
%129 = xor <2 x i64> %128, %125
%130 = bitcast i64* %0 to <2 x i64>*
store <2 x i64> %129, <2 x i64>* %130
%131 = getelementptr inbounds i64, i64* %1, i64 16
%132 = bitcast i64* %131 to <2 x i64>*
%133 = load <2 x i64>, <2 x i64>* %132
%134 = getelementptr inbounds i64, i64* %2, i64 16
%135 = bitcast i64* %134 to <2 x i64>*
store <2 x i64> %133, <2 x i64>* %135
br label %162
136: ; preds = %3, %136
%137 = phi i64 [ %160, %136 ], [ 15, %3 ]
%138 = phi i64 [ %149, %136 ], [ 16, %3 ]
%139 = getelementptr inbounds i64, i64* %1, i64 %137
%140 = load i64, i64* %139
%141 = getelementptr inbounds i64, i64* %2, i64 %137
store i64 %140, i64* %141
%142 = getelementptr inbounds i64, i64* %0, i64 %137
%143 = load i64, i64* %142
%144 = xor i64 %143, %140
store i64 %144, i64* %142
%145 = add nuw nsw i64 %138, 15
%146 = getelementptr inbounds i64, i64* %1, i64 %145
%147 = load i64, i64* %146
%148 = getelementptr inbounds i64, i64* %2, i64 %145
store i64 %147, i64* %148
%149 = add nsw i64 %137, -1
%150 = getelementptr inbounds i64, i64* %1, i64 %149
%151 = load i64, i64* %150
%152 = getelementptr inbounds i64, i64* %2, i64 %149
store i64 %151, i64* %152
%153 = getelementptr inbounds i64, i64* %0, i64 %149
%154 = load i64, i64* %153
%155 = xor i64 %154, %151
store i64 %155, i64* %153
%156 = add nuw nsw i64 %137, 15
%157 = getelementptr inbounds i64, i64* %1, i64 %156
%158 = load i64, i64* %157
%159 = getelementptr inbounds i64, i64* %2, i64 %156
store i64 %158, i64* %159
%160 = add nsw i64 %137, -2
%161 = icmp eq i64 %149, 0
br i1 %161, label %162, label %136
162: ; preds = %136, %18
ret void
}