void moduloTwoDivision(char word[], int n, char divisor[], char remain[],
                       int k) {
  int i;
  for (i = 0; i < k; i++)
    remain[i] = word[i];
  int p = k;
  while (p <= n) {
    if (remain[0] == '1')
      for (i = 0; i < k; i++)
        remain[i] = ((remain[i] - '0') + (divisor[i] - '0')) % 2 + '0';
    for (i = 0; i < k - 1; i++)
      remain[i] = remain[i + 1];
    if (p == n)
      remain[k - 1] = '\0';
    else
      remain[k - 1] = word[p];
    p++;
  }
}


x86 assembly (clang, -O0):
<moduloTwoDivision>:
push   %rbp
mov    %rsp,%rbp
mov    %rdi,-0x8(%rbp)
mov    %esi,-0xc(%rbp)
mov    %rdx,-0x18(%rbp)
mov    %rcx,-0x20(%rbp)
mov    %r8d,-0x24(%rbp)
movl   $0x0,-0x28(%rbp)
mov    -0x28(%rbp),%eax
cmp    -0x24(%rbp),%eax
jge    114e <moduloTwoDivision+0x4e>
mov    -0x8(%rbp),%rax
movslq -0x28(%rbp),%rcx
mov    (%rax,%rcx,1),%dl
mov    -0x20(%rbp),%rax
movslq -0x28(%rbp),%rcx
mov    %dl,(%rax,%rcx,1)
mov    -0x28(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x28(%rbp)
jmp    111e <moduloTwoDivision+0x1e>
mov    -0x24(%rbp),%eax
mov    %eax,-0x2c(%rbp)
mov    -0x2c(%rbp),%eax
cmp    -0xc(%rbp),%eax
jg     1258 <moduloTwoDivision+0x158>
mov    -0x20(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x31,%eax
jne    11cc <moduloTwoDivision+0xcc>
movl   $0x0,-0x28(%rbp)
mov    -0x28(%rbp),%eax
cmp    -0x24(%rbp),%eax
jge    11c7 <moduloTwoDivision+0xc7>
mov    -0x20(%rbp),%rax
movslq -0x28(%rbp),%rcx
movsbl (%rax,%rcx,1),%eax
sub    $0x30,%eax
mov    -0x18(%rbp),%rcx
movslq -0x28(%rbp),%rdx
movsbl (%rcx,%rdx,1),%ecx
sub    $0x30,%ecx
add    %ecx,%eax
mov    $0x2,%ecx
cltd
idiv   %ecx
add    $0x30,%edx
mov    -0x20(%rbp),%rax
movslq -0x28(%rbp),%rcx
mov    %dl,(%rax,%rcx,1)
mov    -0x28(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x28(%rbp)
jmp    1177 <moduloTwoDivision+0x77>
jmp    11cc <moduloTwoDivision+0xcc>
movl   $0x0,-0x28(%rbp)
mov    -0x28(%rbp),%eax
mov    -0x24(%rbp),%ecx
sub    $0x1,%ecx
cmp    %ecx,%eax
jge    120d <moduloTwoDivision+0x10d>
mov    -0x20(%rbp),%rax
mov    -0x28(%rbp),%ecx
add    $0x1,%ecx
movslq %ecx,%rcx
mov    (%rax,%rcx,1),%dl
mov    -0x20(%rbp),%rax
movslq -0x28(%rbp),%rcx
mov    %dl,(%rax,%rcx,1)
mov    -0x28(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x28(%rbp)
jmp    11d3 <moduloTwoDivision+0xd3>
mov    -0x2c(%rbp),%eax
cmp    -0xc(%rbp),%eax
jne    122f <moduloTwoDivision+0x12f>
mov    -0x20(%rbp),%rax
mov    -0x24(%rbp),%ecx
sub    $0x1,%ecx
movslq %ecx,%rcx
movb   $0x0,(%rax,%rcx,1)
jmp    124a <moduloTwoDivision+0x14a>
mov    -0x8(%rbp),%rax
movslq -0x2c(%rbp),%rcx
mov    (%rax,%rcx,1),%dl
mov    -0x20(%rbp),%rax
mov    -0x24(%rbp),%ecx
sub    $0x1,%ecx
movslq %ecx,%rcx
mov    %dl,(%rax,%rcx,1)
mov    -0x2c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x2c(%rbp)
jmp    1154 <moduloTwoDivision+0x54>
pop    %rbp
ret

x86 assembly (clang, -O2):
<moduloTwoDivision>:
push   %rbp
push   %r15
push   %r14
push   %r13
push   %r12
push   %rbx
sub    $0x68,%rsp
mov    %r8d,%r13d
mov    %rcx,%rbx
mov    %rdx,%r14
mov    %esi,%r9d
mov    %rdi,%r10
mov    %r8d,%r11d
test   %r8d,%r8d
jle    11bf <moduloTwoDivision+0xaf>
cmp    $0x8,%r13d
jb     1159 <moduloTwoDivision+0x49>
lea    (%r10,%r11,1),%rax
cmp    %rbx,%rax
jbe    154e <moduloTwoDivision+0x43e>
lea    (%rbx,%r11,1),%rax
cmp    %r10,%rax
jbe    154e <moduloTwoDivision+0x43e>
xor    %eax,%eax
mov    %rax,%rsi
not    %rsi
add    %r11,%rsi
mov    %r11,%rdx
and    $0x3,%rdx
je     1182 <moduloTwoDivision+0x72>
nopl   (%rax)
movzbl (%r10,%rax,1),%ecx
mov    %cl,(%rbx,%rax,1)
add    $0x1,%rax
add    $0xffffffffffffffff,%rdx
jne    1170 <moduloTwoDivision+0x60>
cmp    $0x3,%rsi
jb     11bf <moduloTwoDivision+0xaf>
nopl   0x0(%rax,%rax,1)
movzbl (%r10,%rax,1),%ecx
mov    %cl,(%rbx,%rax,1)
movzbl 0x1(%r10,%rax,1),%ecx
mov    %cl,0x1(%rbx,%rax,1)
movzbl 0x2(%r10,%rax,1),%ecx
mov    %cl,0x2(%rbx,%rax,1)
movzbl 0x3(%r10,%rax,1),%ecx
mov    %cl,0x3(%rbx,%rax,1)
add    $0x4,%rax
cmp    %rax,%r11
jne    1190 <moduloTwoDivision+0x80>
cmp    %r9d,%r13d
jle    11d3 <moduloTwoDivision+0xc3>
add    $0x68,%rsp
pop    %rbx
pop    %r12
pop    %r13
pop    %r14
pop    %r15
pop    %rbp
ret
lea    -0x1(%r13),%eax
mov    %rax,0x58(%rsp)
movslq %eax,%rsi
lea    0x1(%rbx),%rdi
movslq %r13d,%r15
movslq %r9d,%r12
add    $0x1,%r9d
lea    (%rbx,%r11,1),%rax
lea    0x1(%r14),%rcx
lea    (%r14,%r11,1),%rdx
lea    -0x1(%r11),%rbp
mov    %rdi,0x48(%rsp)
cmp    %rdx,%rdi
setb   %dl
cmp    %rax,%rcx
setb   %al
and    %dl,%al
mov    %al,0xf(%rsp)
mov    %rbp,%rdi
and    $0xfffffffffffffff0,%rdi
lea    0x1(%rdi),%rax
mov    %rax,0x18(%rsp)
mov    %rbp,%rax
mov    %rbp,0x10(%rsp)
and    $0xfffffffffffffff8,%rbp
lea    0x1(%rbp),%rax
mov    %rax,0x20(%rsp)
mov    %r11,%rax
neg    %rax
mov    %rax,0x28(%rsp)
movdqa 0xdb4(%rip),%xmm4
movdqa 0xdbc(%rip),%xmm5
movdqa 0xdd4(%rip),%xmm6
movdqa 0xdbc(%rip),%xmm7
mov    %rsi,0x50(%rsp)
mov    %r12,0x40(%rsp)
mov    %rdi,0x38(%rsp)
mov    %rbp,0x30(%rsp)
jmp    1294 <moduloTwoDivision+0x184>
nopw   0x0(%rax,%rax,1)
mov    (%r10,%r15,1),%al
mov    %al,(%rbx,%rsi,1)
add    $0x1,%r15
cmp    %r15d,%r9d
je     11c4 <moduloTwoDivision+0xb4>
cmpb   $0x31,(%rbx)
jne    14d0 <moduloTwoDivision+0x3c0>
test   %r13d,%r13d
jle    14d0 <moduloTwoDivision+0x3c0>
movsbl (%r14),%eax
add    $0xffffffd1,%eax
movzwl %ax,%eax
mov    %eax,%ecx
shr    $0xf,%ecx
add    %eax,%ecx
and    $0xfe,%ecx
sub    %ecx,%eax
add    $0x30,%al
mov    %al,(%rbx)
cmp    $0x1,%r13d
je     14d0 <moduloTwoDivision+0x3c0>
cmpq   $0x8,0x10(%rsp)
setb   %al
or     0xf(%rsp),%al
mov    $0x1,%ecx
jne    142c <moduloTwoDivision+0x31c>
cmpq   $0x10,0x10(%rsp)
jae    12f4 <moduloTwoDivision+0x1e4>
xor    %eax,%eax
jmp    13c0 <moduloTwoDivision+0x2b0>
xor    %eax,%eax
cs nopw 0x0(%rax,%rax,1)
movdqu 0x1(%rbx,%rax,1),%xmm0
punpckhbw %xmm0,%xmm1
psraw  $0x8,%xmm1
punpcklbw %xmm0,%xmm2
psraw  $0x8,%xmm2
movdqu 0x1(%r14,%rax,1),%xmm3
punpckhbw %xmm3,%xmm0
psraw  $0x8,%xmm0
paddw  %xmm1,%xmm0
punpcklbw %xmm3,%xmm1
psraw  $0x8,%xmm1
paddw  %xmm2,%xmm1
paddw  %xmm4,%xmm0
paddw  %xmm4,%xmm1
movdqa %xmm1,%xmm2
psrlw  $0xf,%xmm2
paddw  %xmm1,%xmm2
psraw  $0x1,%xmm2
paddw  %xmm2,%xmm2
psubw  %xmm2,%xmm1
movdqa %xmm0,%xmm2
psrlw  $0xf,%xmm2
paddw  %xmm0,%xmm2
psraw  $0x1,%xmm2
paddw  %xmm2,%xmm2
psubw  %xmm2,%xmm0
pand   %xmm5,%xmm0
pand   %xmm5,%xmm1
packuswb %xmm0,%xmm1
paddb  %xmm7,%xmm1
movdqu %xmm1,0x1(%rbx,%rax,1)
add    $0x10,%rax
cmp    %rax,%rdi
jne    1300 <moduloTwoDivision+0x1f0>
cmp    %rdi,0x10(%rsp)
je     14d0 <moduloTwoDivision+0x3c0>
mov    %rdi,%rax
mov    0x18(%rsp),%rcx
testb  $0x8,0x10(%rsp)
je     142c <moduloTwoDivision+0x31c>
cs nopw 0x0(%rax,%rax,1)
nopl   0x0(%rax)
movq   0x1(%rbx,%rax,1),%xmm0
punpcklbw %xmm0,%xmm0
psraw  $0x8,%xmm0
movq   0x1(%r14,%rax,1),%xmm1
punpcklbw %xmm1,%xmm1
psraw  $0x8,%xmm1
paddw  %xmm0,%xmm1
paddw  %xmm4,%xmm1
movdqa %xmm1,%xmm0
psrlw  $0xf,%xmm0
paddw  %xmm1,%xmm0
psraw  $0x1,%xmm0
paddw  %xmm0,%xmm0
psubw  %xmm0,%xmm1
pand   %xmm5,%xmm1
packuswb %xmm1,%xmm1
paddb  %xmm6,%xmm1
movq   %xmm1,0x1(%rbx,%rax,1)
add    $0x8,%rax
cmp    %rax,%rbp
jne    13c0 <moduloTwoDivision+0x2b0>
mov    0x20(%rsp),%rcx
cmp    %rbp,0x10(%rsp)
je     14d0 <moduloTwoDivision+0x3c0>
mov    %rcx,%rax
test   $0x1,%r11b
jne    145e <moduloTwoDivision+0x34e>
movsbl (%rbx,%rcx,1),%eax
movsbl (%r14,%rcx,1),%edx
add    %edx,%eax
add    $0xffffffa0,%eax
movzwl %ax,%eax
mov    %eax,%edx
shr    $0xf,%edx
add    %eax,%edx
and    $0xfe,%edx
sub    %edx,%eax
add    $0x30,%al
mov    %al,(%rbx,%rcx,1)
lea    0x1(%rcx),%rax
not    %rcx
cmp    0x28(%rsp),%rcx
je     14d0 <moduloTwoDivision+0x3c0>
nopl   0x0(%rax,%rax,1)
movsbl (%rbx,%rax,1),%ecx
movsbl (%r14,%rax,1),%edx
add    %edx,%ecx
add    $0xffffffa0,%ecx
movzwl %cx,%ecx
mov    %ecx,%edx
shr    $0xf,%edx
add    %ecx,%edx
and    $0xfe,%edx
sub    %edx,%ecx
add    $0x30,%cl
mov    %cl,(%rbx,%rax,1)
movsbl 0x1(%rbx,%rax,1),%ecx
movsbl 0x1(%r14,%rax,1),%edx
add    %edx,%ecx
add    $0xffffffa0,%ecx
movzwl %cx,%ecx
mov    %ecx,%edx
shr    $0xf,%edx
add    %ecx,%edx
and    $0xfe,%edx
sub    %edx,%ecx
add    $0x30,%cl
mov    %cl,0x1(%rbx,%rax,1)
add    $0x2,%rax
cmp    %rax,%r11
jne    1470 <moduloTwoDivision+0x360>
nopl   0x0(%rax,%rax,1)
cmp    $0x2,%r13d
jl     153e <moduloTwoDivision+0x42e>
mov    %rbx,%rdi
mov    0x48(%rsp),%rsi
mov    0x58(%rsp),%rdx
mov    %r9d,%ebp
mov    %r14,%r12
mov    %r10,%r14
mov    %r15,0x60(%rsp)
mov    %r11,%r15
call   1030 <memmove@plt>
movdqa 0xb1f(%rip),%xmm7
movdqa 0xb27(%rip),%xmm6
movdqa 0xaff(%rip),%xmm5
movdqa 0xae7(%rip),%xmm4
mov    0x38(%rsp),%rdi
mov    0x50(%rsp),%rsi
mov    %r15,%r11
mov    0x60(%rsp),%r15
mov    %r14,%r10
mov    %r12,%r14
mov    0x40(%rsp),%r12
mov    %ebp,%r9d
mov    0x30(%rsp),%rbp
cmp    %r12,%r15
jne    1280 <moduloTwoDivision+0x170>
xor    %eax,%eax
jmp    1284 <moduloTwoDivision+0x174>
cmp    $0x20,%r13d
jae    155b <moduloTwoDivision+0x44b>
xor    %eax,%eax
jmp    1642 <moduloTwoDivision+0x532>
mov    %r11d,%eax
and    $0xffffffe0,%eax
lea    -0x20(%rax),%rsi
mov    %rsi,%rdx
shr    $0x5,%rdx
add    $0x1,%rdx
mov    %edx,%ecx
and    $0x3,%ecx
cmp    $0x60,%rsi
jae    157f <moduloTwoDivision+0x46f>
xor    %esi,%esi
jmp    15f4 <moduloTwoDivision+0x4e4>
and    $0xfffffffffffffffc,%rdx
xor    %esi,%esi
cs nopw 0x0(%rax,%rax,1)
nop
movups (%r10,%rsi,1),%xmm0
movups 0x10(%r10,%rsi,1),%xmm1
movups %xmm0,(%rbx,%rsi,1)
movups %xmm1,0x10(%rbx,%rsi,1)
movups 0x20(%r10,%rsi,1),%xmm0
movups 0x30(%r10,%rsi,1),%xmm1
movups %xmm0,0x20(%rbx,%rsi,1)
movups %xmm1,0x30(%rbx,%rsi,1)
movups 0x40(%r10,%rsi,1),%xmm0
movups 0x50(%r10,%rsi,1),%xmm1
movups %xmm0,0x40(%rbx,%rsi,1)
movups %xmm1,0x50(%rbx,%rsi,1)
movdqu 0x60(%r10,%rsi,1),%xmm0
movdqu 0x70(%r10,%rsi,1),%xmm1
movdqu %xmm0,0x60(%rbx,%rsi,1)
movdqu %xmm1,0x70(%rbx,%rsi,1)
sub    $0xffffffffffffff80,%rsi
add    $0xfffffffffffffffc,%rdx
jne    1590 <moduloTwoDivision+0x480>
test   %rcx,%rcx
je     162f <moduloTwoDivision+0x51f>
lea    (%rbx,%rsi,1),%rdx
add    $0x10,%rdx
add    %r10,%rsi
add    $0x10,%rsi
shl    $0x5,%rcx
xor    %edi,%edi
xchg   %ax,%ax
movdqu -0x10(%rsi,%rdi,1),%xmm0
movdqu (%rsi,%rdi,1),%xmm1
movdqu %xmm0,-0x10(%rdx,%rdi,1)
movdqu %xmm1,(%rdx,%rdi,1)
add    $0x20,%rdi
cmp    %rdi,%rcx
jne    1610 <moduloTwoDivision+0x500>
cmp    %r11,%rax
je     11bf <moduloTwoDivision+0xaf>
test   $0x18,%r11b
je     115b <moduloTwoDivision+0x4b>
mov    %rax,%rcx
mov    %r11d,%eax
and    $0xfffffff8,%eax
nopl   0x0(%rax,%rax,1)
mov    (%r10,%rcx,1),%rdx
mov    %rdx,(%rbx,%rcx,1)
add    $0x8,%rcx
cmp    %rcx,%rax
jne    1650 <moduloTwoDivision+0x540>
cmp    %r11,%rax
je     11bf <moduloTwoDivision+0xaf>
jmp    115b <moduloTwoDivision+0x4b>

LLVM IR (-O0):
define void @moduloTwoDivision(i8* %0, i32 %1, i8* %2, i8* %3, i32 %4) {
%6 = alloca i8*
%7 = alloca i32
%8 = alloca i8*
%9 = alloca i8*
%10 = alloca i32
%11 = alloca i32
%12 = alloca i32
store i8* %0, i8** %6
store i32 %1, i32* %7
store i8* %2, i8** %8
store i8* %3, i8** %9
store i32 %4, i32* %10
store i32 0, i32* %11
br label %13
13: ; preds = %27, %5
%14 = load i32, i32* %11
%15 = load i32, i32* %10
%16 = icmp slt i32 %14, %15
br i1 %16, label %17, label %30
17: ; preds = %13
%18 = load i8*, i8** %6
%19 = load i32, i32* %11
%20 = sext i32 %19 to i64
%21 = getelementptr inbounds i8, i8* %18, i64 %20
%22 = load i8, i8* %21
%23 = load i8*, i8** %9
%24 = load i32, i32* %11
%25 = sext i32 %24 to i64
%26 = getelementptr inbounds i8, i8* %23, i64 %25
store i8 %22, i8* %26
br label %27
27: ; preds = %17
%28 = load i32, i32* %11
%29 = add nsw i32 %28, 1
store i32 %29, i32* %11
br label %13
30: ; preds = %13
%31 = load i32, i32* %10
store i32 %31, i32* %12
br label %32
32: ; preds = %115, %30
%33 = load i32, i32* %12
%34 = load i32, i32* %7
%35 = icmp sle i32 %33, %34
br i1 %35, label %36, label %118
36: ; preds = %32
%37 = load i8*, i8** %9
%38 = getelementptr inbounds i8, i8* %37, i64 0
%39 = load i8, i8* %38
%40 = sext i8 %39 to i32
%41 = icmp eq i32 %40, 49
br i1 %41, label %42, label %74
42: ; preds = %36
store i32 0, i32* %11
br label %43
43: ; preds = %70, %42
%44 = load i32, i32* %11
%45 = load i32, i32* %10
%46 = icmp slt i32 %44, %45
br i1 %46, label %47, label %73
47: ; preds = %43
%48 = load i8*, i8** %9
%49 = load i32, i32* %11
%50 = sext i32 %49 to i64
%51 = getelementptr inbounds i8, i8* %48, i64 %50
%52 = load i8, i8* %51
%53 = sext i8 %52 to i32
%54 = sub nsw i32 %53, 48
%55 = load i8*, i8** %8
%56 = load i32, i32* %11
%57 = sext i32 %56 to i64
%58 = getelementptr inbounds i8, i8* %55, i64 %57
%59 = load i8, i8* %58
%60 = sext i8 %59 to i32
%61 = sub nsw i32 %60, 48
%62 = add nsw i32 %54, %61
%63 = srem i32 %62, 2
%64 = add nsw i32 %63, 48
%65 = trunc i32 %64 to i8
%66 = load i8*, i8** %9
%67 = load i32, i32* %11
%68 = sext i32 %67 to i64
%69 = getelementptr inbounds i8, i8* %66, i64 %68
store i8 %65, i8* %69
br label %70
70: ; preds = %47
%71 = load i32, i32* %11
%72 = add nsw i32 %71, 1
store i32 %72, i32* %11
br label %43
73: ; preds = %43
br label %74
74: ; preds = %73, %36
store i32 0, i32* %11
br label %75
75: ; preds = %91, %74
%76 = load i32, i32* %11
%77 = load i32, i32* %10
%78 = sub nsw i32 %77, 1
%79 = icmp slt i32 %76, %78
br i1 %79, label %80, label %94
80: ; preds = %75
%81 = load i8*, i8** %9
%82 = load i32, i32* %11
%83 = add nsw i32 %82, 1
%84 = sext i32 %83 to i64
%85 = getelementptr inbounds i8, i8* %81, i64 %84
%86 = load i8, i8* %85
%87 = load i8*, i8** %9
%88 = load i32, i32* %11
%89 = sext i32 %88 to i64
%90 = getelementptr inbounds i8, i8* %87, i64 %89
store i8 %86, i8* %90
br label %91
91: ; preds = %80
%92 = load i32, i32* %11
%93 = add nsw i32 %92, 1
store i32 %93, i32* %11
br label %75
94: ; preds = %75
%95 = load i32, i32* %12
%96 = load i32, i32* %7
%97 = icmp eq i32 %95, %96
br i1 %97, label %98, label %104
98: ; preds = %94
%99 = load i8*, i8** %9
%100 = load i32, i32* %10
%101 = sub nsw i32 %100, 1
%102 = sext i32 %101 to i64
%103 = getelementptr inbounds i8, i8* %99, i64 %102
store i8 0, i8* %103
br label %115
104: ; preds = %94
%105 = load i8*, i8** %6
%106 = load i32, i32* %12
%107 = sext i32 %106 to i64
%108 = getelementptr inbounds i8, i8* %105, i64 %107
%109 = load i8, i8* %108
%110 = load i8*, i8** %9
%111 = load i32, i32* %10
%112 = sub nsw i32 %111, 1
%113 = sext i32 %112 to i64
%114 = getelementptr inbounds i8, i8* %110, i64 %113
store i8 %109, i8* %114
br label %115
115: ; preds = %104, %98
%116 = load i32, i32* %12
%117 = add nsw i32 %116, 1
store i32 %117, i32* %12
br label %32
118: ; preds = %32
ret void
}

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