void decode_plink(unsigned char *out, const unsigned char *in, const int n) {
  int i, k;
  unsigned char tmp, geno;
  int a1, a2;
  for (i = 0; i < n; ++i) {
    tmp = in[i];
    k = 4 * i;
    geno = (tmp & 3);
    a1 = !(geno & 1);
    a2 = !(geno >> 1);
    out[k] = (geno == 1) ? 3 : a1 + a2;
    k++;
    geno = (tmp & 12) >> 2;
    a1 = !(geno & 1);
    a2 = !(geno >> 1);
    out[k] = (geno == 1) ? 3 : a1 + a2;
    k++;
    geno = (tmp & 48) >> 4;
    a1 = !(geno & 1);
    a2 = !(geno >> 1);
    out[k] = (geno == 1) ? 3 : a1 + a2;
    k++;
    geno = (tmp & 192) >> 6;
    a1 = !(geno & 1);
    a2 = !(geno >> 1);
    out[k] = (geno == 1) ? 3 : a1 + a2;
  }
}


x86 assembly (clang, -O0):
<decode_plink>:
push   %rbp
mov    %rsp,%rbp
mov    %rdi,-0x8(%rbp)
mov    %rsi,-0x10(%rbp)
mov    %edx,-0x14(%rbp)
movl   $0x0,-0x18(%rbp)
mov    -0x18(%rbp),%eax
cmp    -0x14(%rbp),%eax
jge    1319 <decode_plink+0x219>
mov    -0x10(%rbp),%rax
movslq -0x18(%rbp),%rcx
mov    (%rax,%rcx,1),%al
mov    %al,-0x1d(%rbp)
mov    -0x18(%rbp),%eax
shl    $0x2,%eax
mov    %eax,-0x1c(%rbp)
movzbl -0x1d(%rbp),%eax
and    $0x3,%eax
mov    %al,-0x1e(%rbp)
movzbl -0x1e(%rbp),%eax
and    $0x1,%eax
cmp    $0x0,%eax
setne  %al
xor    $0xff,%al
and    $0x1,%al
movzbl %al,%eax
mov    %eax,-0x24(%rbp)
movzbl -0x1e(%rbp),%eax
sar    $0x1,%eax
cmp    $0x0,%eax
setne  %al
xor    $0xff,%al
and    $0x1,%al
movzbl %al,%eax
mov    %eax,-0x28(%rbp)
movzbl -0x1e(%rbp),%eax
cmp    $0x1,%eax
jne    118b <decode_plink+0x8b>
mov    $0x3,%eax
mov    %eax,-0x2c(%rbp)
jmp    1194 <decode_plink+0x94>
mov    -0x24(%rbp),%eax
add    -0x28(%rbp),%eax
mov    %eax,-0x2c(%rbp)
mov    -0x2c(%rbp),%eax
mov    %al,%dl
mov    -0x8(%rbp),%rax
movslq -0x1c(%rbp),%rcx
mov    %dl,(%rax,%rcx,1)
mov    -0x1c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x1c(%rbp)
movzbl -0x1d(%rbp),%eax
and    $0xc,%eax
sar    $0x2,%eax
mov    %al,-0x1e(%rbp)
movzbl -0x1e(%rbp),%eax
and    $0x1,%eax
cmp    $0x0,%eax
setne  %al
xor    $0xff,%al
and    $0x1,%al
movzbl %al,%eax
mov    %eax,-0x24(%rbp)
movzbl -0x1e(%rbp),%eax
sar    $0x1,%eax
cmp    $0x0,%eax
setne  %al
xor    $0xff,%al
and    $0x1,%al
movzbl %al,%eax
mov    %eax,-0x28(%rbp)
movzbl -0x1e(%rbp),%eax
cmp    $0x1,%eax
jne    1202 <decode_plink+0x102>
mov    $0x3,%eax
mov    %eax,-0x30(%rbp)
jmp    120b <decode_plink+0x10b>
mov    -0x24(%rbp),%eax
add    -0x28(%rbp),%eax
mov    %eax,-0x30(%rbp)
mov    -0x30(%rbp),%eax
mov    %al,%dl
mov    -0x8(%rbp),%rax
movslq -0x1c(%rbp),%rcx
mov    %dl,(%rax,%rcx,1)
mov    -0x1c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x1c(%rbp)
movzbl -0x1d(%rbp),%eax
and    $0x30,%eax
sar    $0x4,%eax
mov    %al,-0x1e(%rbp)
movzbl -0x1e(%rbp),%eax
and    $0x1,%eax
cmp    $0x0,%eax
setne  %al
xor    $0xff,%al
and    $0x1,%al
movzbl %al,%eax
mov    %eax,-0x24(%rbp)
movzbl -0x1e(%rbp),%eax
sar    $0x1,%eax
cmp    $0x0,%eax
setne  %al
xor    $0xff,%al
and    $0x1,%al
movzbl %al,%eax
mov    %eax,-0x28(%rbp)
movzbl -0x1e(%rbp),%eax
cmp    $0x1,%eax
jne    1279 <decode_plink+0x179>
mov    $0x3,%eax
mov    %eax,-0x34(%rbp)
jmp    1282 <decode_plink+0x182>
mov    -0x24(%rbp),%eax
add    -0x28(%rbp),%eax
mov    %eax,-0x34(%rbp)
mov    -0x34(%rbp),%eax
mov    %al,%dl
mov    -0x8(%rbp),%rax
movslq -0x1c(%rbp),%rcx
mov    %dl,(%rax,%rcx,1)
mov    -0x1c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x1c(%rbp)
movzbl -0x1d(%rbp),%eax
and    $0xc0,%eax
sar    $0x6,%eax
mov    %al,-0x1e(%rbp)
movzbl -0x1e(%rbp),%eax
and    $0x1,%eax
cmp    $0x0,%eax
setne  %al
xor    $0xff,%al
and    $0x1,%al
movzbl %al,%eax
mov    %eax,-0x24(%rbp)
movzbl -0x1e(%rbp),%eax
sar    $0x1,%eax
cmp    $0x0,%eax
setne  %al
xor    $0xff,%al
and    $0x1,%al
movzbl %al,%eax
mov    %eax,-0x28(%rbp)
movzbl -0x1e(%rbp),%eax
cmp    $0x1,%eax
jne    12f2 <decode_plink+0x1f2>
mov    $0x3,%eax
mov    %eax,-0x38(%rbp)
jmp    12fb <decode_plink+0x1fb>
mov    -0x24(%rbp),%eax
add    -0x28(%rbp),%eax
mov    %eax,-0x38(%rbp)
mov    -0x38(%rbp),%eax
mov    %al,%dl
mov    -0x8(%rbp),%rax
movslq -0x1c(%rbp),%rcx
mov    %dl,(%rax,%rcx,1)
mov    -0x18(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x18(%rbp)
jmp    1116 <decode_plink+0x16>
pop    %rbp
ret

x86 assembly (clang, -O2):
<decode_plink>:
test   %edx,%edx
jle    11d9 <decode_plink+0xd9>
mov    %edx,%r8d
cmp    $0x8,%edx
jb     112a <decode_plink+0x2a>
lea    (%rsi,%r8,1),%rax
cmp    %rdi,%rax
jbe    11da <decode_plink+0xda>
lea    (%rdi,%r8,4),%rax
cmp    %rsi,%rax
jbe    11da <decode_plink+0xda>
xor    %r10d,%r10d
mov    $0x3,%r9d
cs nopw 0x0(%rax,%rax,1)
nopl   (%rax)
movzbl (%rsi,%r10,1),%r11d
mov    %r11d,%edx
and    $0x3,%dl
mov    %r11d,%ecx
not    %cl
mov    %ecx,%eax
and    $0x1,%al
cmp    $0x2,%dl
adc    $0x0,%al
cmp    $0x1,%dl
movzbl %al,%eax
cmove  %r9d,%eax
mov    %al,(%rdi,%r10,4)
mov    %r11d,%eax
shr    $0x2,%al
mov    %eax,%edx
not    %dl
and    $0x3,%al
and    $0x1,%dl
cmp    $0x2,%al
adc    $0x0,%dl
cmp    $0x1,%al
movzbl %dl,%eax
cmove  %r9d,%eax
mov    %al,0x1(%rdi,%r10,4)
mov    %r11d,%eax
shr    $0x4,%al
mov    %eax,%edx
not    %dl
and    $0x3,%al
and    $0x1,%dl
cmp    $0x2,%al
adc    $0x0,%dl
cmp    $0x1,%al
movzbl %dl,%eax
cmove  %r9d,%eax
shr    $0x6,%r11b
mov    %r11d,%edx
not    %dl
and    $0x1,%dl
shr    $0x7,%cl
add    %dl,%cl
cmp    $0x1,%r11b
movzbl %cl,%ecx
cmove  %r9d,%ecx
mov    %al,0x2(%rdi,%r10,4)
mov    %cl,0x3(%rdi,%r10,4)
add    $0x1,%r10
cmp    %r10,%r8
jne    1140 <decode_plink+0x40>
ret
cmp    $0x10,%edx
jae    11e7 <decode_plink+0xe7>
xor    %r10d,%r10d
jmp    135c <decode_plink+0x25c>
mov    %r8d,%r10d
and    $0xfffffff0,%r10d
xor    %edx,%edx
movdqa 0xe07(%rip),%xmm10
movdqa 0xe0f(%rip),%xmm1
movdqa 0xe16(%rip),%xmm9
pcmpeqd %xmm8,%xmm8
nop
movdqu (%rsi,%rdx,1),%xmm5
movdqa %xmm5,%xmm4
pand   %xmm10,%xmm4
movdqa %xmm5,%xmm6
pandn  %xmm1,%xmm6
movdqa %xmm9,%xmm7
pcmpgtb %xmm4,%xmm7
psubb  %xmm7,%xmm6
pcmpeqb %xmm1,%xmm4
movdqa %xmm4,%xmm7
pandn  %xmm6,%xmm7
pand   %xmm10,%xmm4
por    %xmm7,%xmm4
movdqa %xmm5,%xmm7
psrlw  $0x2,%xmm7
movdqa %xmm7,%xmm6
pand   %xmm10,%xmm6
pandn  %xmm1,%xmm7
movdqa %xmm9,%xmm2
pcmpgtb %xmm6,%xmm2
psubb  %xmm2,%xmm7
pcmpeqb %xmm1,%xmm6
movdqa %xmm6,%xmm2
pandn  %xmm7,%xmm2
pand   %xmm10,%xmm6
por    %xmm2,%xmm6
movdqa %xmm5,%xmm2
psrlw  $0x4,%xmm2
movdqa %xmm2,%xmm7
pand   %xmm10,%xmm7
pandn  %xmm1,%xmm2
movdqa %xmm9,%xmm3
pcmpgtb %xmm7,%xmm3
psubb  %xmm3,%xmm2
pcmpeqb %xmm1,%xmm7
movdqa %xmm7,%xmm3
pandn  %xmm2,%xmm3
pand   %xmm10,%xmm7
por    %xmm3,%xmm7
movdqa %xmm5,%xmm2
psrlw  $0x6,%xmm2
movdqa %xmm2,%xmm3
pand   %xmm10,%xmm3
pandn  %xmm1,%xmm2
pxor   %xmm8,%xmm5
psrlw  $0x7,%xmm5
pand   %xmm1,%xmm5
paddb  %xmm2,%xmm5
pcmpeqb %xmm1,%xmm3
movdqa %xmm3,%xmm2
pandn  %xmm5,%xmm2
pand   %xmm10,%xmm3
por    %xmm2,%xmm3
movdqa %xmm7,%xmm2
punpcklbw %xmm3,%xmm2
movdqa %xmm4,%xmm5
punpcklbw %xmm6,%xmm5
movdqa %xmm5,%xmm0
punpcklwd %xmm2,%xmm0
punpckhwd %xmm2,%xmm5
punpckhbw %xmm3,%xmm7
punpckhbw %xmm6,%xmm4
movdqa %xmm4,%xmm2
punpcklwd %xmm7,%xmm2
punpckhwd %xmm7,%xmm4
movdqu %xmm4,0x30(%rdi,%rdx,4)
movdqu %xmm2,0x20(%rdi,%rdx,4)
movdqu %xmm5,0x10(%rdi,%rdx,4)
movdqu %xmm0,(%rdi,%rdx,4)
add    $0x10,%rdx
cmp    %rdx,%r10
jne    1210 <decode_plink+0x110>
cmp    %r8,%r10
je     11d9 <decode_plink+0xd9>
test   $0x8,%r8b
je     112d <decode_plink+0x2d>
mov    %r10,%rdx
mov    %r8d,%r10d
and    $0xfffffff8,%r10d
movdqa 0xcc2(%rip),%xmm0
movdqa 0xcca(%rip),%xmm1
movdqa 0xcd1(%rip),%xmm13
pcmpeqd %xmm14,%xmm14
movdqa 0xca3(%rip),%xmm12
movdqa 0xc6a(%rip),%xmm10
movdqa 0xc71(%rip),%xmm11
pxor   %xmm15,%xmm15
movdqa 0xcd4(%rip),%xmm7
nopl   0x0(%rax)
movq   (%rsi,%rdx,1),%xmm6
movdqa %xmm6,%xmm8
pand   %xmm0,%xmm8
movdqa %xmm6,%xmm2
pandn  %xmm1,%xmm2
movdqa %xmm8,%xmm4
pmaxub %xmm13,%xmm4
pcmpeqb %xmm8,%xmm4
paddb  %xmm2,%xmm4
pcmpeqb %xmm1,%xmm8
psubb  %xmm14,%xmm4
movdqa %xmm8,%xmm2
pandn  %xmm4,%xmm2
pand   %xmm0,%xmm8
por    %xmm2,%xmm8
movdqa %xmm6,%xmm5
psrlw  $0x2,%xmm5
movdqa %xmm5,%xmm2
pand   0xc54(%rip),%xmm2
pand   %xmm12,%xmm5
pandn  %xmm1,%xmm2
movdqa %xmm5,%xmm4
pmaxub %xmm13,%xmm4
pcmpeqb %xmm5,%xmm4
paddb  %xmm2,%xmm4
pcmpeqb %xmm1,%xmm5
psubb  %xmm14,%xmm4
movdqa %xmm5,%xmm2
pandn  %xmm4,%xmm2
pand   %xmm0,%xmm5
por    %xmm2,%xmm5
movdqa %xmm6,%xmm3
psrlw  $0x4,%xmm3
movdqa %xmm3,%xmm2
pand   0xc1c(%rip),%xmm2
pand   %xmm12,%xmm3
pandn  %xmm1,%xmm2
movdqa %xmm3,%xmm4
pmaxub %xmm13,%xmm4
pcmpeqb %xmm3,%xmm4
paddb  %xmm2,%xmm4
pcmpeqb %xmm1,%xmm3
psubb  %xmm14,%xmm4
movdqa %xmm3,%xmm2
pandn  %xmm4,%xmm2
pand   %xmm0,%xmm3
por    %xmm2,%xmm3
movdqa %xmm6,%xmm2
psrlw  $0x6,%xmm2
pand   %xmm10,%xmm2
movdqa %xmm2,%xmm4
pandn  %xmm1,%xmm4
pxor   %xmm14,%xmm6
psrlw  $0x7,%xmm6
pand   %xmm11,%xmm6
paddb  %xmm4,%xmm6
pcmpeqb %xmm1,%xmm2
movdqa %xmm2,%xmm4
pandn  %xmm6,%xmm4
pand   %xmm0,%xmm2
por    %xmm4,%xmm2
punpcklbw %xmm15,%xmm2
punpcklbw %xmm15,%xmm3
movdqa %xmm3,%xmm4
punpcklwd %xmm2,%xmm4
pshufd $0xfa,%xmm4,%xmm6
pshufd $0x50,%xmm4,%xmm4
packuswb %xmm6,%xmm4
movdqa %xmm7,%xmm6
pandn  %xmm4,%xmm6
punpcklbw %xmm15,%xmm8
punpcklbw %xmm15,%xmm5
movdqa %xmm8,%xmm4
punpcklwd %xmm5,%xmm4
pshufd $0xf6,%xmm4,%xmm9
pshufd $0xd4,%xmm4,%xmm4
packuswb %xmm9,%xmm4
pand   %xmm7,%xmm4
por    %xmm6,%xmm4
punpckhwd %xmm2,%xmm3
pshufd $0xfa,%xmm3,%xmm2
pshufd $0x50,%xmm3,%xmm3
packuswb %xmm2,%xmm3
movdqa %xmm7,%xmm2
pandn  %xmm3,%xmm2
punpckhwd %xmm5,%xmm8
pshufd $0xf6,%xmm8,%xmm3
pshufd $0xd4,%xmm8,%xmm5
packuswb %xmm3,%xmm5
pand   %xmm7,%xmm5
por    %xmm2,%xmm5
movdqu %xmm5,0x10(%rdi,%rdx,4)
movdqu %xmm4,(%rdi,%rdx,4)
add    $0x8,%rdx
cmp    %rdx,%r10
jne    13b0 <decode_plink+0x2b0>
cmp    %r8,%r10
je     11d9 <decode_plink+0xd9>
jmp    112d <decode_plink+0x2d>

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

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