void _memwcpy(long *s, long *s0, int n) {
  if (n != 0) {
    register long *s1 = s;
    register long *s2 = s0;
    if (s1 <= s2) {
      do {
        *s1++ = *s2++;
      } while (--n != 0);
    } else {
      s2 += n;
      s1 += n;
      do {
        *--s1 = *--s2;
      } while (--n != 0);
    }
  }
  return;
}


x86 assembly (clang, -O0):
<_memwcpy>:
push   %rbp
mov    %rsp,%rbp
mov    %rdi,-0x8(%rbp)
mov    %rsi,-0x10(%rbp)
mov    %edx,-0x14(%rbp)
cmpl   $0x0,-0x14(%rbp)
je     11e3 <_memwcpy+0xe3>
mov    -0x8(%rbp),%rax
mov    %rax,-0x20(%rbp)
mov    -0x10(%rbp),%rax
mov    %rax,-0x28(%rbp)
mov    -0x20(%rbp),%rax
cmp    -0x28(%rbp),%rax
ja     1177 <_memwcpy+0x77>
jmp    113c <_memwcpy+0x3c>
mov    -0x28(%rbp),%rax
mov    %rax,%rcx
add    $0x8,%rcx
mov    %rcx,-0x28(%rbp)
mov    (%rax),%rcx
mov    -0x20(%rbp),%rax
mov    %rax,%rdx
add    $0x8,%rdx
mov    %rdx,-0x20(%rbp)
mov    %rcx,(%rax)
mov    -0x14(%rbp),%eax
add    $0xffffffff,%eax
mov    %eax,-0x14(%rbp)
cmp    $0x0,%eax
jne    113c <_memwcpy+0x3c>
jmp    11de <_memwcpy+0xde>
mov    -0x14(%rbp),%ecx
mov    -0x28(%rbp),%rax
movslq %ecx,%rcx
shl    $0x3,%rcx
add    %rcx,%rax
mov    %rax,-0x28(%rbp)
mov    -0x14(%rbp),%ecx
mov    -0x20(%rbp),%rax
movslq %ecx,%rcx
shl    $0x3,%rcx
add    %rcx,%rax
mov    %rax,-0x20(%rbp)
mov    -0x28(%rbp),%rax
mov    %rax,%rcx
add    $0xfffffffffffffff8,%rcx
mov    %rcx,-0x28(%rbp)
mov    -0x8(%rax),%rcx
mov    -0x20(%rbp),%rax
mov    %rax,%rdx
add    $0xfffffffffffffff8,%rdx
mov    %rdx,-0x20(%rbp)
mov    %rcx,-0x8(%rax)
mov    -0x14(%rbp),%eax
add    $0xffffffff,%eax
mov    %eax,-0x14(%rbp)
cmp    $0x0,%eax
jne    11a1 <_memwcpy+0xa1>
jmp    11de <_memwcpy+0xde>
jmp    11e3 <_memwcpy+0xe3>
pop    %rbp
ret

x86 assembly (clang, -O2):
<_memwcpy>:
push   %r14
push   %rbx
test   %edx,%edx
je     1466 <_memwcpy+0x366>
cmp    %rsi,%rdi
jbe    12bd <_memwcpy+0x1bd>
movslq %edx,%r11
lea    (%rsi,%r11,8),%rax
lea    (%rdi,%r11,8),%rcx
lea    -0x1(%rdx),%r8d
cmp    $0x3,%r8d
jb     1216 <_memwcpy+0x116>
mov    %r8,%r9
not    %r9
add    %r11,%r9
lea    (%rdi,%r9,8),%rbx
cmp    %rax,%rbx
jae    114c <_memwcpy+0x4c>
lea    (%rsi,%r9,8),%rbx
cmp    %rcx,%rbx
jb     1216 <_memwcpy+0x116>
add    $0x1,%r8
mov    %r8,%r9
and    $0xfffffffffffffffc,%r9
lea    -0x4(%r9),%rbx
mov    %rbx,%r10
shr    $0x2,%r10
add    $0x1,%r10
test   %rbx,%rbx
je     146a <_memwcpy+0x36a>
movabs $0x7ffffffffffffffc,%rbx
ff ff 7f
or     $0x2,%rbx
and    %r10,%rbx
lea    (%rsi,%r11,8),%r14
add    $0xfffffffffffffff0,%r14
lea    (%rdi,%r11,8),%rdi
add    $0xfffffffffffffff0,%rdi
xor    %esi,%esi
cs nopw 0x0(%rax,%rax,1)
nopl   0x0(%rax)
movups -0x10(%r14,%rsi,8),%xmm0
movups (%r14,%rsi,8),%xmm1
movups %xmm1,(%rdi,%rsi,8)
movups %xmm0,-0x10(%rdi,%rsi,8)
movups -0x30(%r14,%rsi,8),%xmm0
movups -0x20(%r14,%rsi,8),%xmm1
movups %xmm1,-0x20(%rdi,%rsi,8)
movups %xmm0,-0x30(%rdi,%rsi,8)
add    $0xfffffffffffffff8,%rsi
add    $0xfffffffffffffffe,%rbx
jne    11a0 <_memwcpy+0xa0>
neg    %rsi
test   $0x1,%r10b
je     11fd <_memwcpy+0xfd>
shl    $0x3,%rsi
mov    %rcx,%rdi
sub    %rsi,%rdi
mov    %rax,%rbx
sub    %rsi,%rbx
movups -0x20(%rbx),%xmm0
movups -0x10(%rbx),%xmm1
movups %xmm1,-0x10(%rdi)
movups %xmm0,-0x20(%rdi)
cmp    %r9,%r8
je     1466 <_memwcpy+0x366>
mov    %r9,%rsi
shl    $0x3,%rsi
sub    %r9d,%edx
sub    %rsi,%rcx
sub    %rsi,%rax
lea    -0x1(%rdx),%r8d
mov    %edx,%edi
and    $0x7,%edi
je     1249 <_memwcpy+0x149>
xor    %ebx,%ebx
cs nopw 0x0(%rax,%rax,1)
nopl   (%rax)
mov    -0x8(%rax),%rsi
add    $0xfffffffffffffff8,%rax
mov    %rsi,-0x8(%rcx)
add    $0xfffffffffffffff8,%rcx
add    $0x1,%ebx
cmp    %ebx,%edi
jne    1230 <_memwcpy+0x130>
sub    %ebx,%edx
cmp    $0x7,%r8d
jb     1466 <_memwcpy+0x366>
neg    %edx
xor    %esi,%esi
nopw   0x0(%rax,%rax,1)
mov    -0x8(%rax,%rsi,8),%rdi
mov    %rdi,-0x8(%rcx,%rsi,8)
mov    -0x10(%rax,%rsi,8),%rdi
mov    %rdi,-0x10(%rcx,%rsi,8)
mov    -0x18(%rax,%rsi,8),%rdi
mov    %rdi,-0x18(%rcx,%rsi,8)
mov    -0x20(%rax,%rsi,8),%rdi
mov    %rdi,-0x20(%rcx,%rsi,8)
mov    -0x28(%rax,%rsi,8),%rdi
mov    %rdi,-0x28(%rcx,%rsi,8)
mov    -0x30(%rax,%rsi,8),%rdi
mov    %rdi,-0x30(%rcx,%rsi,8)
mov    -0x38(%rax,%rsi,8),%rdi
mov    %rdi,-0x38(%rcx,%rsi,8)
mov    -0x40(%rax,%rsi,8),%rdi
mov    %rdi,-0x40(%rcx,%rsi,8)
add    $0xfffffffffffffff8,%rsi
cmp    %esi,%edx
jne    1260 <_memwcpy+0x160>
jmp    1466 <_memwcpy+0x366>
lea    -0x1(%rdx),%r9d
cmp    $0x3,%r9d
jb     13cf <_memwcpy+0x2cf>
lea    (%rsi,%r9,8),%rax
add    $0x8,%rax
cmp    %rdi,%rax
jbe    12e9 <_memwcpy+0x1e9>
lea    (%rdi,%r9,8),%rax
add    $0x8,%rax
cmp    %rsi,%rax
ja     13cf <_memwcpy+0x2cf>
add    $0x1,%r9
mov    %r9,%r8
and    $0xfffffffffffffffc,%r8
lea    -0x4(%r8),%rax
mov    %rax,%rcx
shr    $0x2,%rcx
add    $0x1,%rcx
mov    %ecx,%r10d
and    $0x3,%r10d
cmp    $0xc,%rax
jae    1314 <_memwcpy+0x214>
xor    %eax,%eax
jmp    1378 <_memwcpy+0x278>
and    $0xfffffffffffffffc,%rcx
xor    %eax,%eax
nopw   0x0(%rax,%rax,1)
movups (%rsi,%rax,8),%xmm0
movups 0x10(%rsi,%rax,8),%xmm1
movups %xmm0,(%rdi,%rax,8)
movups %xmm1,0x10(%rdi,%rax,8)
movups 0x20(%rsi,%rax,8),%xmm0
movups 0x30(%rsi,%rax,8),%xmm1
movups %xmm0,0x20(%rdi,%rax,8)
movups %xmm1,0x30(%rdi,%rax,8)
movups 0x40(%rsi,%rax,8),%xmm0
movups 0x50(%rsi,%rax,8),%xmm1
movups %xmm0,0x40(%rdi,%rax,8)
movups %xmm1,0x50(%rdi,%rax,8)
movups 0x60(%rsi,%rax,8),%xmm0
movups 0x70(%rsi,%rax,8),%xmm1
movups %xmm0,0x60(%rdi,%rax,8)
movups %xmm1,0x70(%rdi,%rax,8)
add    $0x10,%rax
add    $0xfffffffffffffffc,%rcx
jne    1320 <_memwcpy+0x220>
test   %r10,%r10
je     13bb <_memwcpy+0x2bb>
lea    (%rsi,%rax,8),%rcx
add    $0x10,%rcx
lea    (%rdi,%rax,8),%rax
add    $0x10,%rax
shl    $0x5,%r10
xor    %ebx,%ebx
cs nopw 0x0(%rax,%rax,1)
nopl   (%rax)
movups -0x10(%rcx,%rbx,1),%xmm0
movups (%rcx,%rbx,1),%xmm1
movups %xmm0,-0x10(%rax,%rbx,1)
movups %xmm1,(%rax,%rbx,1)
add    $0x20,%rbx
cmp    %rbx,%r10
jne    13a0 <_memwcpy+0x2a0>
cmp    %r8,%r9
je     1466 <_memwcpy+0x366>
sub    %r8d,%edx
lea    (%rdi,%r8,8),%rdi
lea    (%rsi,%r8,8),%rsi
lea    -0x1(%rdx),%r8d
mov    %edx,%ecx
and    $0x7,%ecx
je     13f7 <_memwcpy+0x2f7>
xor    %ebx,%ebx
nopl   0x0(%rax)
mov    (%rsi),%rax
add    $0x8,%rsi
mov    %rax,(%rdi)
add    $0x8,%rdi
add    $0x1,%ebx
cmp    %ebx,%ecx
jne    13e0 <_memwcpy+0x2e0>
sub    %ebx,%edx
cmp    $0x7,%r8d
jb     1466 <_memwcpy+0x366>
mov    %edx,%eax
xor    %ecx,%ecx
cs nopw 0x0(%rax,%rax,1)
nopl   0x0(%rax,%rax,1)
mov    (%rsi,%rcx,8),%rdx
mov    %rdx,(%rdi,%rcx,8)
mov    0x8(%rsi,%rcx,8),%rdx
mov    %rdx,0x8(%rdi,%rcx,8)
mov    0x10(%rsi,%rcx,8),%rdx
mov    %rdx,0x10(%rdi,%rcx,8)
mov    0x18(%rsi,%rcx,8),%rdx
mov    %rdx,0x18(%rdi,%rcx,8)
mov    0x20(%rsi,%rcx,8),%rdx
mov    %rdx,0x20(%rdi,%rcx,8)
mov    0x28(%rsi,%rcx,8),%rdx
mov    %rdx,0x28(%rdi,%rcx,8)
mov    0x30(%rsi,%rcx,8),%rdx
mov    %rdx,0x30(%rdi,%rcx,8)
mov    0x38(%rsi,%rcx,8),%rdx
mov    %rdx,0x38(%rdi,%rcx,8)
add    $0x8,%rcx
cmp    %ecx,%eax
jne    1410 <_memwcpy+0x310>
pop    %rbx
pop    %r14
ret
xor    %esi,%esi
test   $0x1,%r10b
jne    11dd <_memwcpy+0xdd>
jmp    11fd <_memwcpy+0xfd>

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

LLVM IR (-O2):
define void @_memwcpy(i64* writeonly %0, i64* %1, i32 %2) {
%4 = icmp eq i32 %2, 0
br i1 %4, label %309, label %5
5: ; preds = %3
%6 = icmp ugt i64* %0, %1
br i1 %6, label %157, label %7
7: ; preds = %5
%8 = add i32 %2, -1
%9 = zext i32 %8 to i64
%10 = add nuw nsw i64 %9, 1
%11 = icmp ult i32 %8, 3
br i1 %11, label %104, label %12
12: ; preds = %7
%13 = add i32 %2, -1
%14 = zext i32 %13 to i64
%15 = add nuw nsw i64 %14, 1
%16 = getelementptr i64, i64* %0, i64 %15
%17 = getelementptr i64, i64* %1, i64 %15
%18 = icmp ugt i64* %17, %0
%19 = icmp ugt i64* %16, %1
%20 = and i1 %18, %19
br i1 %20, label %104, label %21
21: ; preds = %12
%22 = and i64 %10, 8589934588
%23 = trunc i64 %22 to i32
%24 = sub i32 %2, %23
%25 = getelementptr i64, i64* %0, i64 %22
%26 = getelementptr i64, i64* %1, i64 %22
%27 = add nsw i64 %22, -4
%28 = lshr exact i64 %27, 2
%29 = add nuw nsw i64 %28, 1
%30 = and i64 %29, 3
%31 = icmp ult i64 %27, 12
br i1 %31, label %83, label %32
32: ; preds = %21
%33 = and i64 %29, 9223372036854775804
br label %34
34: ; preds = %34, %32
%35 = phi i64 [ 0, %32 ], [ %80, %34 ]
%36 = phi i64 [ 0, %32 ], [ %81, %34 ]
%37 = getelementptr i64, i64* %0, i64 %35
%38 = getelementptr i64, i64* %1, i64 %35
%39 = bitcast i64* %38 to <2 x i64>*
%40 = load <2 x i64>, <2 x i64>* %39
%41 = getelementptr i64, i64* %38, i64 2
%42 = bitcast i64* %41 to <2 x i64>*
%43 = load <2 x i64>, <2 x i64>* %42
%44 = bitcast i64* %37 to <2 x i64>*
store <2 x i64> %40, <2 x i64>* %44
%45 = getelementptr i64, i64* %37, i64 2
%46 = bitcast i64* %45 to <2 x i64>*
store <2 x i64> %43, <2 x i64>* %46
%47 = or i64 %35, 4
%48 = getelementptr i64, i64* %0, i64 %47
%49 = getelementptr i64, i64* %1, i64 %47
%50 = bitcast i64* %49 to <2 x i64>*
%51 = load <2 x i64>, <2 x i64>* %50
%52 = getelementptr i64, i64* %49, i64 2
%53 = bitcast i64* %52 to <2 x i64>*
%54 = load <2 x i64>, <2 x i64>* %53
%55 = bitcast i64* %48 to <2 x i64>*
store <2 x i64> %51, <2 x i64>* %55
%56 = getelementptr i64, i64* %48, i64 2
%57 = bitcast i64* %56 to <2 x i64>*
store <2 x i64> %54, <2 x i64>* %57
%58 = or i64 %35, 8
%59 = getelementptr i64, i64* %0, i64 %58
%60 = getelementptr i64, i64* %1, i64 %58
%61 = bitcast i64* %60 to <2 x i64>*
%62 = load <2 x i64>, <2 x i64>* %61
%63 = getelementptr i64, i64* %60, i64 2
%64 = bitcast i64* %63 to <2 x i64>*
%65 = load <2 x i64>, <2 x i64>* %64
%66 = bitcast i64* %59 to <2 x i64>*
store <2 x i64> %62, <2 x i64>* %66
%67 = getelementptr i64, i64* %59, i64 2
%68 = bitcast i64* %67 to <2 x i64>*
store <2 x i64> %65, <2 x i64>* %68
%69 = or i64 %35, 12
%70 = getelementptr i64, i64* %0, i64 %69
%71 = getelementptr i64, i64* %1, i64 %69
%72 = bitcast i64* %71 to <2 x i64>*
%73 = load <2 x i64>, <2 x i64>* %72
%74 = getelementptr i64, i64* %71, i64 2
%75 = bitcast i64* %74 to <2 x i64>*
%76 = load <2 x i64>, <2 x i64>* %75
%77 = bitcast i64* %70 to <2 x i64>*
store <2 x i64> %73, <2 x i64>* %77
%78 = getelementptr i64, i64* %70, i64 2
%79 = bitcast i64* %78 to <2 x i64>*
store <2 x i64> %76, <2 x i64>* %79
%80 = add nuw i64 %35, 16
%81 = add nuw i64 %36, 4
%82 = icmp eq i64 %81, %33
br i1 %82, label %83, label %34
83: ; preds = %34, %21
%84 = phi i64 [ 0, %21 ], [ %80, %34 ]
%85 = icmp eq i64 %30, 0
br i1 %85, label %102, label %86
86: ; preds = %83, %86
%87 = phi i64 [ %99, %86 ], [ %84, %83 ]
%88 = phi i64 [ %100, %86 ], [ 0, %83 ]
%89 = getelementptr i64, i64* %0, i64 %87
%90 = getelementptr i64, i64* %1, i64 %87
%91 = bitcast i64* %90 to <2 x i64>*
%92 = load <2 x i64>, <2 x i64>* %91
%93 = getelementptr i64, i64* %90, i64 2
%94 = bitcast i64* %93 to <2 x i64>*
%95 = load <2 x i64>, <2 x i64>* %94
%96 = bitcast i64* %89 to <2 x i64>*
store <2 x i64> %92, <2 x i64>* %96
%97 = getelementptr i64, i64* %89, i64 2
%98 = bitcast i64* %97 to <2 x i64>*
store <2 x i64> %95, <2 x i64>* %98
%99 = add nuw i64 %87, 4
%100 = add i64 %88, 1
%101 = icmp eq i64 %100, %30
br i1 %101, label %102, label %86
102: ; preds = %86, %83
%103 = icmp eq i64 %10, %22
br i1 %103, label %309, label %104
104: ; preds = %12, %7, %102
%105 = phi i32 [ %2, %12 ], [ %2, %7 ], [ %24, %102 ]
%106 = phi i64* [ %0, %12 ], [ %0, %7 ], [ %25, %102 ]
%107 = phi i64* [ %1, %12 ], [ %1, %7 ], [ %26, %102 ]
%108 = add i32 %105, -1
%109 = and i32 %105, 7
%110 = icmp eq i32 %109, 0
br i1 %110, label %122, label %111
111: ; preds = %104, %111
%112 = phi i32 [ %119, %111 ], [ %105, %104 ]
%113 = phi i64* [ %118, %111 ], [ %106, %104 ]
%114 = phi i64* [ %116, %111 ], [ %107, %104 ]
%115 = phi i32 [ %120, %111 ], [ 0, %104 ]
%116 = getelementptr inbounds i64, i64* %114, i64 1
%117 = load i64, i64* %114
%118 = getelementptr inbounds i64, i64* %113, i64 1
store i64 %117, i64* %113
%119 = add nsw i32 %112, -1
%120 = add i32 %115, 1
%121 = icmp eq i32 %120, %109
br i1 %121, label %122, label %111
122: ; preds = %111, %104
%123 = phi i32 [ %105, %104 ], [ %119, %111 ]
%124 = phi i64* [ %106, %104 ], [ %118, %111 ]
%125 = phi i64* [ %107, %104 ], [ %116, %111 ]
%126 = icmp ult i32 %108, 7
br i1 %126, label %309, label %127
127: ; preds = %122, %127
%128 = phi i32 [ %155, %127 ], [ %123, %122 ]
%129 = phi i64* [ %154, %127 ], [ %124, %122 ]
%130 = phi i64* [ %152, %127 ], [ %125, %122 ]
%131 = getelementptr inbounds i64, i64* %130, i64 1
%132 = load i64, i64* %130
%133 = getelementptr inbounds i64, i64* %129, i64 1
store i64 %132, i64* %129
%134 = getelementptr inbounds i64, i64* %130, i64 2
%135 = load i64, i64* %131
%136 = getelementptr inbounds i64, i64* %129, i64 2
store i64 %135, i64* %133
%137 = getelementptr inbounds i64, i64* %130, i64 3
%138 = load i64, i64* %134
%139 = getelementptr inbounds i64, i64* %129, i64 3
store i64 %138, i64* %136
%140 = getelementptr inbounds i64, i64* %130, i64 4
%141 = load i64, i64* %137
%142 = getelementptr inbounds i64, i64* %129, i64 4
store i64 %141, i64* %139
%143 = getelementptr inbounds i64, i64* %130, i64 5
%144 = load i64, i64* %140
%145 = getelementptr inbounds i64, i64* %129, i64 5
store i64 %144, i64* %142
%146 = getelementptr inbounds i64, i64* %130, i64 6
%147 = load i64, i64* %143
%148 = getelementptr inbounds i64, i64* %129, i64 6
store i64 %147, i64* %145
%149 = getelementptr inbounds i64, i64* %130, i64 7
%150 = load i64, i64* %146
%151 = getelementptr inbounds i64, i64* %129, i64 7
store i64 %150, i64* %148
%152 = getelementptr inbounds i64, i64* %130, i64 8
%153 = load i64, i64* %149
%154 = getelementptr inbounds i64, i64* %129, i64 8
store i64 %153, i64* %151
%155 = add nsw i32 %128, -8
%156 = icmp eq i32 %155, 0
br i1 %156, label %309, label %127
157: ; preds = %5
%158 = sext i32 %2 to i64
%159 = getelementptr i64, i64* %1, i64 %158
%160 = getelementptr i64, i64* %0, i64 %158
%161 = add i32 %2, -1
%162 = zext i32 %161 to i64
%163 = add nuw nsw i64 %162, 1
%164 = icmp ult i32 %161, 3
br i1 %164, label %256, label %165
165: ; preds = %157
%166 = add i32 %2, -1
%167 = zext i32 %166 to i64
%168 = xor i64 %167, -1
%169 = add nsw i64 %168, %158
%170 = getelementptr i64, i64* %0, i64 %169
%171 = getelementptr i64, i64* %1, i64 %169
%172 = icmp ult i64* %170, %159
%173 = icmp ult i64* %171, %160
%174 = and i1 %172, %173
br i1 %174, label %256, label %175
175: ; preds = %165
%176 = and i64 %163, 8589934588
%177 = trunc i64 %176 to i32
%178 = sub i32 %2, %177
%179 = sub nsw i64 0, %176
%180 = getelementptr i64, i64* %160, i64 %179
%181 = sub nsw i64 0, %176
%182 = getelementptr i64, i64* %159, i64 %181
%183 = add nsw i64 %176, -4
%184 = lshr exact i64 %183, 2
%185 = add nuw nsw i64 %184, 1
%186 = and i64 %185, 1
%187 = icmp eq i64 %183, 0
br i1 %187, label %232, label %188
188: ; preds = %175
%189 = and i64 %185, 9223372036854775806
%190 = getelementptr i64, i64* %160, i64 -1
%191 = getelementptr i64, i64* %159, i64 -1
%192 = getelementptr i64, i64* %160, i64 -1
%193 = getelementptr i64, i64* %159, i64 -1
br label %194
194: ; preds = %194, %188
%195 = phi i64 [ 0, %188 ], [ %229, %194 ]
%196 = phi i64 [ 0, %188 ], [ %230, %194 ]
%197 = sub i64 0, %195
%198 = sub i64 0, %195
%199 = getelementptr inbounds i64, i64* %191, i64 %198
%200 = getelementptr inbounds i64, i64* %199, i64 -1
%201 = bitcast i64* %200 to <2 x i64>*
%202 = load <2 x i64>, <2 x i64>* %201
%203 = getelementptr inbounds i64, i64* %199, i64 -2
%204 = getelementptr inbounds i64, i64* %203, i64 -1
%205 = bitcast i64* %204 to <2 x i64>*
%206 = load <2 x i64>, <2 x i64>* %205
%207 = getelementptr inbounds i64, i64* %190, i64 %197
%208 = getelementptr inbounds i64, i64* %207, i64 -1
%209 = bitcast i64* %208 to <2 x i64>*
store <2 x i64> %202, <2 x i64>* %209
%210 = getelementptr inbounds i64, i64* %207, i64 -2
%211 = getelementptr inbounds i64, i64* %210, i64 -1
%212 = bitcast i64* %211 to <2 x i64>*
store <2 x i64> %206, <2 x i64>* %212
%213 = sub nuw nsw i64 -4, %195
%214 = sub nuw nsw i64 -4, %195
%215 = getelementptr inbounds i64, i64* %193, i64 %214
%216 = getelementptr inbounds i64, i64* %215, i64 -1
%217 = bitcast i64* %216 to <2 x i64>*
%218 = load <2 x i64>, <2 x i64>* %217
%219 = getelementptr inbounds i64, i64* %215, i64 -2
%220 = getelementptr inbounds i64, i64* %219, i64 -1
%221 = bitcast i64* %220 to <2 x i64>*
%222 = load <2 x i64>, <2 x i64>* %221
%223 = getelementptr inbounds i64, i64* %192, i64 %213
%224 = getelementptr inbounds i64, i64* %223, i64 -1
%225 = bitcast i64* %224 to <2 x i64>*
store <2 x i64> %218, <2 x i64>* %225
%226 = getelementptr inbounds i64, i64* %223, i64 -2
%227 = getelementptr inbounds i64, i64* %226, i64 -1
%228 = bitcast i64* %227 to <2 x i64>*
store <2 x i64> %222, <2 x i64>* %228
%229 = add nuw i64 %195, 8
%230 = add i64 %196, 2
%231 = icmp eq i64 %230, %189
br i1 %231, label %232, label %194
232: ; preds = %194, %175
%233 = phi i64 [ 0, %175 ], [ %229, %194 ]
%234 = icmp eq i64 %186, 0
br i1 %234, label %254, label %235
235: ; preds = %232
%236 = sub i64 0, %233
%237 = getelementptr i64, i64* %160, i64 -1
%238 = sub i64 0, %233
%239 = getelementptr i64, i64* %159, i64 -1
%240 = getelementptr inbounds i64, i64* %239, i64 %238
%241 = getelementptr inbounds i64, i64* %240, i64 -1
%242 = bitcast i64* %241 to <2 x i64>*
%243 = load <2 x i64>, <2 x i64>* %242
%244 = getelementptr inbounds i64, i64* %240, i64 -2
%245 = getelementptr inbounds i64, i64* %244, i64 -1
%246 = bitcast i64* %245 to <2 x i64>*
%247 = load <2 x i64>, <2 x i64>* %246
%248 = getelementptr inbounds i64, i64* %237, i64 %236
%249 = getelementptr inbounds i64, i64* %248, i64 -1
%250 = bitcast i64* %249 to <2 x i64>*
store <2 x i64> %243, <2 x i64>* %250
%251 = getelementptr inbounds i64, i64* %248, i64 -2
%252 = getelementptr inbounds i64, i64* %251, i64 -1
%253 = bitcast i64* %252 to <2 x i64>*
store <2 x i64> %247, <2 x i64>* %253
br label %254
254: ; preds = %232, %235
%255 = icmp eq i64 %163, %176
br i1 %255, label %309, label %256
256: ; preds = %165, %157, %254
%257 = phi i32 [ %2, %165 ], [ %2, %157 ], [ %178, %254 ]
%258 = phi i64* [ %160, %165 ], [ %160, %157 ], [ %180, %254 ]
%259 = phi i64* [ %159, %165 ], [ %159, %157 ], [ %182, %254 ]
%260 = add i32 %257, -1
%261 = and i32 %257, 7
%262 = icmp eq i32 %261, 0
br i1 %262, label %274, label %263
263: ; preds = %256, %263
%264 = phi i32 [ %271, %263 ], [ %257, %256 ]
%265 = phi i64* [ %270, %263 ], [ %258, %256 ]
%266 = phi i64* [ %268, %263 ], [ %259, %256 ]
%267 = phi i32 [ %272, %263 ], [ 0, %256 ]
%268 = getelementptr inbounds i64, i64* %266, i64 -1
%269 = load i64, i64* %268
%270 = getelementptr inbounds i64, i64* %265, i64 -1
store i64 %269, i64* %270
%271 = add nsw i32 %264, -1
%272 = add i32 %267, 1
%273 = icmp eq i32 %272, %261
br i1 %273, label %274, label %263
274: ; preds = %263, %256
%275 = phi i32 [ %257, %256 ], [ %271, %263 ]
%276 = phi i64* [ %258, %256 ], [ %270, %263 ]
%277 = phi i64* [ %259, %256 ], [ %268, %263 ]
%278 = icmp ult i32 %260, 7
br i1 %278, label %309, label %279
279: ; preds = %274, %279
%280 = phi i32 [ %307, %279 ], [ %275, %274 ]
%281 = phi i64* [ %306, %279 ], [ %276, %274 ]
%282 = phi i64* [ %304, %279 ], [ %277, %274 ]
%283 = getelementptr inbounds i64, i64* %282, i64 -1
%284 = load i64, i64* %283
%285 = getelementptr inbounds i64, i64* %281, i64 -1
store i64 %284, i64* %285
%286 = getelementptr inbounds i64, i64* %282, i64 -2
%287 = load i64, i64* %286
%288 = getelementptr inbounds i64, i64* %281, i64 -2
store i64 %287, i64* %288
%289 = getelementptr inbounds i64, i64* %282, i64 -3
%290 = load i64, i64* %289
%291 = getelementptr inbounds i64, i64* %281, i64 -3
store i64 %290, i64* %291
%292 = getelementptr inbounds i64, i64* %282, i64 -4
%293 = load i64, i64* %292
%294 = getelementptr inbounds i64, i64* %281, i64 -4
store i64 %293, i64* %294
%295 = getelementptr inbounds i64, i64* %282, i64 -5
%296 = load i64, i64* %295
%297 = getelementptr inbounds i64, i64* %281, i64 -5
store i64 %296, i64* %297
%298 = getelementptr inbounds i64, i64* %282, i64 -6
%299 = load i64, i64* %298
%300 = getelementptr inbounds i64, i64* %281, i64 -6
store i64 %299, i64* %300
%301 = getelementptr inbounds i64, i64* %282, i64 -7
%302 = load i64, i64* %301
%303 = getelementptr inbounds i64, i64* %281, i64 -7
store i64 %302, i64* %303
%304 = getelementptr inbounds i64, i64* %282, i64 -8
%305 = load i64, i64* %304
%306 = getelementptr inbounds i64, i64* %281, i64 -8
store i64 %305, i64* %306
%307 = add nsw i32 %280, -8
%308 = icmp eq i32 %307, 0
br i1 %308, label %309, label %279
309: ; preds = %122, %127, %274, %279, %102, %254, %3
ret void
}