void copy(unsigned long long *block, unsigned long long *save) {
  register int i = 64;
  while (i--) {
    save[i] = block[i];
  }
}


x86 assembly (clang, -O0):
<copy>:
push   %rbp
mov    %rsp,%rbp
mov    %rdi,-0x8(%rbp)
mov    %rsi,-0x10(%rbp)
movl   $0x40,-0x14(%rbp)
mov    -0x14(%rbp),%eax
mov    %eax,%ecx
add    $0xffffffff,%ecx
mov    %ecx,-0x14(%rbp)
cmp    $0x0,%eax
je     1144 <copy+0x44>
mov    -0x8(%rbp),%rax
movslq -0x14(%rbp),%rcx
mov    (%rax,%rcx,8),%rdx
mov    -0x10(%rbp),%rax
movslq -0x14(%rbp),%rcx
mov    %rdx,(%rax,%rcx,8)
jmp    1113 <copy+0x13>
pop    %rbp
ret

x86 assembly (clang, -O2):
<copy>:
lea    0x200(%rdi),%rax
cmp    %rsi,%rax
jbe    1151 <copy+0x51>
lea    0x200(%rsi),%rax
cmp    %rdi,%rax
jbe    1151 <copy+0x51>
mov    $0x3c,%eax
nopl   (%rax)
mov    0x18(%rdi,%rax,8),%rcx
mov    %rcx,0x18(%rsi,%rax,8)
mov    0x10(%rdi,%rax,8),%rcx
mov    %rcx,0x10(%rsi,%rax,8)
mov    0x8(%rdi,%rax,8),%rcx
mov    %rcx,0x8(%rsi,%rax,8)
mov    (%rdi,%rax,8),%rcx
mov    %rcx,(%rsi,%rax,8)
add    $0xfffffffffffffffc,%rax
cmp    $0xfffffffffffffffc,%rax
jne    1120 <copy+0x20>
ret
movups 0x1f0(%rdi),%xmm0
movups %xmm0,0x1f0(%rsi)
movups 0x1e0(%rdi),%xmm0
movups %xmm0,0x1e0(%rsi)
movups 0x1d0(%rdi),%xmm0
movups %xmm0,0x1d0(%rsi)
movups 0x1c0(%rdi),%xmm0
movups %xmm0,0x1c0(%rsi)
movups 0x1b0(%rdi),%xmm0
movups %xmm0,0x1b0(%rsi)
movups 0x1a0(%rdi),%xmm0
movups %xmm0,0x1a0(%rsi)
movups 0x190(%rdi),%xmm0
movups %xmm0,0x190(%rsi)
movups 0x180(%rdi),%xmm0
movups %xmm0,0x180(%rsi)
movups 0x170(%rdi),%xmm0
movups %xmm0,0x170(%rsi)
movups 0x160(%rdi),%xmm0
movups %xmm0,0x160(%rsi)
movups 0x150(%rdi),%xmm0
movups %xmm0,0x150(%rsi)
movups 0x140(%rdi),%xmm0
movups %xmm0,0x140(%rsi)
movups 0x130(%rdi),%xmm0
movups %xmm0,0x130(%rsi)
movups 0x120(%rdi),%xmm0
movups %xmm0,0x120(%rsi)
movups 0x110(%rdi),%xmm0
movups %xmm0,0x110(%rsi)
movups 0x100(%rdi),%xmm0
movups %xmm0,0x100(%rsi)
movups 0xf0(%rdi),%xmm0
movups %xmm0,0xf0(%rsi)
movups 0xe0(%rdi),%xmm0
movups %xmm0,0xe0(%rsi)
movups 0xd0(%rdi),%xmm0
movups %xmm0,0xd0(%rsi)
movups 0xc0(%rdi),%xmm0
movups %xmm0,0xc0(%rsi)
movups 0xb0(%rdi),%xmm0
movups %xmm0,0xb0(%rsi)
movups 0xa0(%rdi),%xmm0
movups %xmm0,0xa0(%rsi)
movups 0x90(%rdi),%xmm0
movups %xmm0,0x90(%rsi)
movups 0x80(%rdi),%xmm0
movups %xmm0,0x80(%rsi)
movups 0x70(%rdi),%xmm0
movups %xmm0,0x70(%rsi)
movups 0x60(%rdi),%xmm0
movups %xmm0,0x60(%rsi)
movups 0x50(%rdi),%xmm0
movups %xmm0,0x50(%rsi)
movups 0x40(%rdi),%xmm0
movups %xmm0,0x40(%rsi)
movups 0x30(%rdi),%xmm0
movups %xmm0,0x30(%rsi)
movups 0x20(%rdi),%xmm0
movups %xmm0,0x20(%rsi)
movups 0x10(%rdi),%xmm0
movups %xmm0,0x10(%rsi)
movups (%rdi),%xmm0
movups %xmm0,(%rsi)
ret

LLVM IR (-O0):
define void @copy(i64* %0, i64* %1) {
%3 = alloca i64*
%4 = alloca i64*
%5 = alloca i32
store i64* %0, i64** %3
store i64* %1, i64** %4
store i32 64, i32* %5
br label %6
6: ; preds = %10, %2
%7 = load i32, i32* %5
%8 = add nsw i32 %7, -1
store i32 %8, i32* %5
%9 = icmp ne i32 %7, 0
br i1 %9, label %10, label %20
10: ; preds = %6
%11 = load i64*, i64** %3
%12 = load i32, i32* %5
%13 = sext i32 %12 to i64
%14 = getelementptr inbounds i64, i64* %11, i64 %13
%15 = load i64, i64* %14
%16 = load i64*, i64** %4
%17 = load i32, i32* %5
%18 = sext i32 %17 to i64
%19 = getelementptr inbounds i64, i64* %16, i64 %18
store i64 %15, i64* %19
br label %6
20: ; preds = %6
ret void
}

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