void ft_bcopy(char *src, char *dst, int len) {
  char *last_src;
  char *last_dst;
  last_src = src + (len - 1);
  last_dst = dst + (len - 1);
  if (dst < src) {
    while (len--)
      *dst++ = *src++;
  } else {
    while (len--)
      *(char *)last_dst-- = *(char *)last_src--;
  }
}


x86 assembly (clang, -O0):
<ft_bcopy>:
push   %rbp
mov    %rsp,%rbp
mov    %rdi,-0x8(%rbp)
mov    %rsi,-0x10(%rbp)
mov    %edx,-0x14(%rbp)
mov    -0x8(%rbp),%rax
mov    -0x14(%rbp),%ecx
sub    $0x1,%ecx
movslq %ecx,%rcx
add    %rcx,%rax
mov    %rax,-0x20(%rbp)
mov    -0x10(%rbp),%rax
mov    -0x14(%rbp),%ecx
sub    $0x1,%ecx
movslq %ecx,%rcx
add    %rcx,%rax
mov    %rax,-0x28(%rbp)
mov    -0x10(%rbp),%rax
cmp    -0x8(%rbp),%rax
jae    118a <ft_bcopy+0x8a>
jmp    114a <ft_bcopy+0x4a>
mov    -0x14(%rbp),%eax
mov    %eax,%ecx
add    $0xffffffff,%ecx
mov    %ecx,-0x14(%rbp)
cmp    $0x0,%eax
je     1185 <ft_bcopy+0x85>
mov    -0x8(%rbp),%rax
mov    %rax,%rcx
add    $0x1,%rcx
mov    %rcx,-0x8(%rbp)
mov    (%rax),%cl
mov    -0x10(%rbp),%rax
mov    %rax,%rdx
add    $0x1,%rdx
mov    %rdx,-0x10(%rbp)
mov    %cl,(%rax)
jmp    114a <ft_bcopy+0x4a>
jmp    11cf <ft_bcopy+0xcf>
jmp    118f <ft_bcopy+0x8f>
mov    -0x14(%rbp),%eax
mov    %eax,%ecx
add    $0xffffffff,%ecx
mov    %ecx,-0x14(%rbp)
cmp    $0x0,%eax
je     11ca <ft_bcopy+0xca>
mov    -0x20(%rbp),%rax
mov    %rax,%rcx
add    $0xffffffffffffffff,%rcx
mov    %rcx,-0x20(%rbp)
mov    (%rax),%cl
mov    -0x28(%rbp),%rax
mov    %rax,%rdx
add    $0xffffffffffffffff,%rdx
mov    %rdx,-0x28(%rbp)
mov    %cl,(%rax)
jmp    118f <ft_bcopy+0x8f>
jmp    11cf <ft_bcopy+0xcf>
pop    %rbp
ret

x86 assembly (clang, -O2):
<ft_bcopy>:
push   %rbp
push   %r15
push   %r14
push   %r13
push   %r12
push   %rbx
lea    -0x1(%rdx),%eax
cmp    %rdi,%rsi
jae    11e3 <ft_bcopy+0xe3>
test   %edx,%edx
je     12be <ft_bcopy+0x1be>
cmp    $0x7,%eax
jb     1148 <ft_bcopy+0x48>
mov    %eax,%r8d
lea    (%rdi,%r8,1),%rcx
add    $0x1,%rcx
cmp    %rsi,%rcx
jbe    12c9 <ft_bcopy+0x1c9>
lea    (%rsi,%r8,1),%rcx
add    $0x1,%rcx
cmp    %rdi,%rcx
jbe    12c9 <ft_bcopy+0x1c9>
mov    %rsi,%rcx
mov    %rdi,%rax
lea    -0x1(%rdx),%esi
test   $0x7,%dl
je     1177 <ft_bcopy+0x77>
mov    %edx,%ebp
and    $0x7,%ebp
xor    %edi,%edi
nopl   (%rax)
movzbl (%rax,%rdi,1),%ebx
mov    %bl,(%rcx,%rdi,1)
add    $0x1,%rdi
cmp    %edi,%ebp
jne    1160 <ft_bcopy+0x60>
sub    %edi,%edx
add    %rdi,%rcx
add    %rdi,%rax
cmp    $0x7,%esi
jb     12be <ft_bcopy+0x1be>
mov    %edx,%edx
xor    %esi,%esi
cs nopw 0x0(%rax,%rax,1)
xchg   %ax,%ax
movzbl (%rax,%rsi,1),%ebx
mov    %bl,(%rcx,%rsi,1)
movzbl 0x1(%rax,%rsi,1),%ebx
mov    %bl,0x1(%rcx,%rsi,1)
movzbl 0x2(%rax,%rsi,1),%ebx
mov    %bl,0x2(%rcx,%rsi,1)
movzbl 0x3(%rax,%rsi,1),%ebx
mov    %bl,0x3(%rcx,%rsi,1)
movzbl 0x4(%rax,%rsi,1),%ebx
mov    %bl,0x4(%rcx,%rsi,1)
movzbl 0x5(%rax,%rsi,1),%ebx
mov    %bl,0x5(%rcx,%rsi,1)
movzbl 0x6(%rax,%rsi,1),%ebx
mov    %bl,0x6(%rcx,%rsi,1)
movzbl 0x7(%rax,%rsi,1),%ebx
mov    %bl,0x7(%rcx,%rsi,1)
add    $0x8,%rsi
cmp    %esi,%edx
jne    1190 <ft_bcopy+0x90>
jmp    12be <ft_bcopy+0x1be>
test   %edx,%edx
je     12be <ft_bcopy+0x1be>
movslq %eax,%r15
lea    (%rdi,%r15,1),%r9
lea    (%rsi,%r15,1),%r11
cmp    $0x3,%eax
jb     1231 <ft_bcopy+0x131>
movabs $0xffffffff00000000,%rcx
ff ff ff
and    %r15,%rcx
lea    (%rsi,%rcx,1),%rbp
lea    (%rdi,%r15,1),%rbx
add    $0x1,%rbx
cmp    %rbx,%rbp
jae    12e0 <ft_bcopy+0x1e0>
lea    (%rsi,%r15,1),%rbp
add    $0x1,%rbp
add    %rdi,%rcx
cmp    %rbp,%rcx
jae    12e0 <ft_bcopy+0x1e0>
mov    %r11,%rsi
mov    %r9,%rdi
lea    -0x1(%rdx),%ebp
test   $0x7,%dl
je     1267 <ft_bcopy+0x167>
mov    %edx,%ebx
and    $0x7,%ebx
xor    %ecx,%ecx
cs nopw 0x0(%rax,%rax,1)
movzbl (%rdi),%eax
add    $0xffffffffffffffff,%rdi
mov    %al,(%rsi)
add    $0xffffffffffffffff,%rsi
add    $0x1,%rcx
cmp    %ecx,%ebx
jne    1250 <ft_bcopy+0x150>
sub    %ecx,%edx
cmp    $0x7,%ebp
jb     12be <ft_bcopy+0x1be>
neg    %edx
xor    %eax,%eax
movzbl (%rdi,%rax,1),%ecx
mov    %cl,(%rsi,%rax,1)
movzbl -0x1(%rdi,%rax,1),%ecx
mov    %cl,-0x1(%rsi,%rax,1)
movzbl -0x2(%rdi,%rax,1),%ecx
mov    %cl,-0x2(%rsi,%rax,1)
movzbl -0x3(%rdi,%rax,1),%ecx
mov    %cl,-0x3(%rsi,%rax,1)
movzbl -0x4(%rdi,%rax,1),%ecx
mov    %cl,-0x4(%rsi,%rax,1)
movzbl -0x5(%rdi,%rax,1),%ecx
mov    %cl,-0x5(%rsi,%rax,1)
movzbl -0x6(%rdi,%rax,1),%ecx
mov    %cl,-0x6(%rsi,%rax,1)
movzbl -0x7(%rdi,%rax,1),%ecx
mov    %cl,-0x7(%rsi,%rax,1)
add    $0xfffffffffffffff8,%rax
cmp    %eax,%edx
jne    1270 <ft_bcopy+0x170>
pop    %rbx
pop    %r12
pop    %r13
pop    %r14
pop    %r15
pop    %rbp
ret
movabs $0x1ffffffe0,%r9
cmp    $0x1f,%eax
jae    12fd <ft_bcopy+0x1fd>
xor    %r10d,%r10d
jmp    140e <ft_bcopy+0x30e>
mov    %eax,%r8d
lea    0x1(%r8),%r12
movabs $0x1ffffffe0,%r10
cmp    $0xf,%eax
jae    1328 <ft_bcopy+0x228>
xor    %eax,%eax
jmp    14e3 <ft_bcopy+0x3e3>
lea    0x1(%r8),%r11
mov    %r11,%r10
and    %r9,%r10
lea    -0x20(%r10),%rax
mov    %rax,%rcx
shr    $0x5,%rcx
add    $0x1,%rcx
mov    %ecx,%ebx
and    $0x3,%ebx
cmp    $0x60,%rax
jae    1356 <ft_bcopy+0x256>
xor    %eax,%eax
jmp    13b8 <ft_bcopy+0x2b8>
lea    0x10(%r10),%rax
and    %r12,%rax
lea    -0x10(%rax),%rcx
mov    %rcx,%rbx
shr    $0x4,%rbx
add    $0x1,%rbx
mov    %ebx,%r14d
and    $0x3,%r14d
cmp    $0x30,%rcx
jae    144f <ft_bcopy+0x34f>
xor    %ecx,%ecx
jmp    1499 <ft_bcopy+0x399>
and    $0xfffffffffffffffc,%rcx
xor    %eax,%eax
nopl   0x0(%rax)
movups (%rdi,%rax,1),%xmm0
movups 0x10(%rdi,%rax,1),%xmm1
movups %xmm0,(%rsi,%rax,1)
movups %xmm1,0x10(%rsi,%rax,1)
movups 0x20(%rdi,%rax,1),%xmm0
movups 0x30(%rdi,%rax,1),%xmm1
movups %xmm0,0x20(%rsi,%rax,1)
movups %xmm1,0x30(%rsi,%rax,1)
movups 0x40(%rdi,%rax,1),%xmm0
movups 0x50(%rdi,%rax,1),%xmm1
movups %xmm0,0x40(%rsi,%rax,1)
movups %xmm1,0x50(%rsi,%rax,1)
movups 0x60(%rdi,%rax,1),%xmm0
movups 0x70(%rdi,%rax,1),%xmm1
movups %xmm0,0x60(%rsi,%rax,1)
movups %xmm1,0x70(%rsi,%rax,1)
sub    $0xffffffffffffff80,%rax
add    $0xfffffffffffffffc,%rcx
jne    1360 <ft_bcopy+0x260>
test   %rbx,%rbx
je     13fb <ft_bcopy+0x2fb>
lea    (%rdi,%rax,1),%rcx
add    $0x10,%rcx
add    %rsi,%rax
add    $0x10,%rax
shl    $0x5,%rbx
xor    %ebp,%ebp
cs nopw 0x0(%rax,%rax,1)
nopl   0x0(%rax)
movups -0x10(%rcx,%rbp,1),%xmm0
movups (%rcx,%rbp,1),%xmm1
movups %xmm0,-0x10(%rax,%rbp,1)
movups %xmm1,(%rax,%rbp,1)
add    $0x20,%rbp
cmp    %rbp,%rbx
jne    13e0 <ft_bcopy+0x2e0>
cmp    %r10,%r11
je     12be <ft_bcopy+0x1be>
test   $0x18,%r11b
je     1531 <ft_bcopy+0x431>
add    $0x1,%r8
add    $0x18,%r9
and    %r8,%r9
sub    %r9d,%edx
lea    (%rsi,%r9,1),%rcx
lea    (%rdi,%r9,1),%rax
cs nopw 0x0(%rax,%rax,1)
xchg   %ax,%ax
mov    (%rdi,%r10,1),%rbp
mov    %rbp,(%rsi,%r10,1)
add    $0x8,%r10
cmp    %r10,%r9
jne    1430 <ft_bcopy+0x330>
cmp    %r9,%r8
jne    114e <ft_bcopy+0x4e>
jmp    12be <ft_bcopy+0x1be>
and    $0xfffffffffffffffc,%rbx
lea    -0xf(%r11),%r13
lea    -0xf(%r9),%rbp
xor    %ecx,%ecx
nopl   (%rax)
movups 0x0(%rbp,%rcx,1),%xmm0
movups %xmm0,0x0(%r13,%rcx,1)
movups -0x10(%rbp,%rcx,1),%xmm0
movups %xmm0,-0x10(%r13,%rcx,1)
movups -0x20(%rbp,%rcx,1),%xmm0
movups %xmm0,-0x20(%r13,%rcx,1)
movups -0x30(%rbp,%rcx,1),%xmm0
movups %xmm0,-0x30(%r13,%rcx,1)
add    $0xffffffffffffffc0,%rcx
add    $0xfffffffffffffffc,%rbx
jne    1460 <ft_bcopy+0x360>
neg    %rcx
test   %r14,%r14
je     14d4 <ft_bcopy+0x3d4>
sub    %rcx,%r15
lea    (%rdi,%r15,1),%rcx
add    $0xfffffffffffffff1,%rcx
add    %r15,%rsi
add    $0xfffffffffffffff1,%rsi
shl    $0x4,%r14
xor    %edi,%edi
cs nopw 0x0(%rax,%rax,1)
movups (%rcx,%rdi,1),%xmm0
movups %xmm0,(%rsi,%rdi,1)
add    $0xfffffffffffffff0,%rdi
mov    %r14,%rbx
add    %rdi,%rbx
jne    14c0 <ft_bcopy+0x3c0>
cmp    %rax,%r12
je     12be <ft_bcopy+0x1be>
test   $0xc,%r12b
je     153f <ft_bcopy+0x43f>
add    $0x1,%r8
add    $0x1c,%r10
and    %r8,%r10
mov    %r11,%rsi
sub    %r10,%rsi
mov    %r9,%rdi
sub    %r10,%rdi
sub    %r10d,%edx
neg    %rax
and    $0xfffffffffffffffc,%r12
neg    %r12
nopw   0x0(%rax,%rax,1)
mov    -0x3(%r9,%rax,1),%ecx
mov    %ecx,-0x3(%r11,%rax,1)
add    $0xfffffffffffffffc,%rax
cmp    %rax,%r12
jne    1510 <ft_bcopy+0x410>
cmp    %r10,%r8
jne    1237 <ft_bcopy+0x137>
jmp    12be <ft_bcopy+0x1be>
add    %r10,%rdi
add    %r10,%rsi
sub    %r10d,%edx
jmp    1148 <ft_bcopy+0x48>
sub    %eax,%edx
sub    %rax,%r9
sub    %rax,%r11
jmp    1231 <ft_bcopy+0x131>

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

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