int YUV2YUV(int x_dim, int y_dim, void *yuv, void *y_out, void *u_out,
            void *v_out) {
  unsigned char *in;
  short int *out;
  long size;
  in = yuv;
  out = y_out;
  size = x_dim * y_dim;
  while (size--)
    *(out++) = *(in++);
  out = u_out;
  size = x_dim * y_dim / 4;
  while (size--)
    *(out++) = *(in++);
  out = v_out;
  size = x_dim * y_dim / 4;
  while (size--)
    *(out++) = *(in++);
  return 0;
}


x86 assembly (clang, -O0):
<YUV2YUV>:
push   %rbp
mov    %rsp,%rbp
mov    %edi,-0x4(%rbp)
mov    %esi,-0x8(%rbp)
mov    %rdx,-0x10(%rbp)
mov    %rcx,-0x18(%rbp)
mov    %r8,-0x20(%rbp)
mov    %r9,-0x28(%rbp)
mov    -0x10(%rbp),%rax
mov    %rax,-0x30(%rbp)
mov    -0x18(%rbp),%rax
mov    %rax,-0x38(%rbp)
mov    -0x4(%rbp),%eax
imul   -0x8(%rbp),%eax
cltq
mov    %rax,-0x40(%rbp)
mov    -0x40(%rbp),%rax
mov    %rax,%rcx
add    $0xffffffffffffffff,%rcx
mov    %rcx,-0x40(%rbp)
cmp    $0x0,%rax
je     117c <YUV2YUV+0x7c>
mov    -0x30(%rbp),%rax
mov    %rax,%rcx
add    $0x1,%rcx
mov    %rcx,-0x30(%rbp)
movzbl (%rax),%eax
mov    %ax,%cx
mov    -0x38(%rbp),%rax
mov    %rax,%rdx
add    $0x2,%rdx
mov    %rdx,-0x38(%rbp)
mov    %cx,(%rax)
jmp    1137 <YUV2YUV+0x37>
mov    -0x20(%rbp),%rax
mov    %rax,-0x38(%rbp)
mov    -0x4(%rbp),%eax
imul   -0x8(%rbp),%eax
mov    $0x4,%ecx
cltd
idiv   %ecx
cltq
mov    %rax,-0x40(%rbp)
mov    -0x40(%rbp),%rax
mov    %rax,%rcx
add    $0xffffffffffffffff,%rcx
mov    %rcx,-0x40(%rbp)
cmp    $0x0,%rax
je     11de <YUV2YUV+0xde>
mov    -0x30(%rbp),%rax
mov    %rax,%rcx
add    $0x1,%rcx
mov    %rcx,-0x30(%rbp)
movzbl (%rax),%eax
mov    %ax,%cx
mov    -0x38(%rbp),%rax
mov    %rax,%rdx
add    $0x2,%rdx
mov    %rdx,-0x38(%rbp)
mov    %cx,(%rax)
jmp    1199 <YUV2YUV+0x99>
mov    -0x28(%rbp),%rax
mov    %rax,-0x38(%rbp)
mov    -0x4(%rbp),%eax
imul   -0x8(%rbp),%eax
mov    $0x4,%ecx
cltd
idiv   %ecx
cltq
mov    %rax,-0x40(%rbp)
mov    -0x40(%rbp),%rax
mov    %rax,%rcx
add    $0xffffffffffffffff,%rcx
mov    %rcx,-0x40(%rbp)
cmp    $0x0,%rax
je     1240 <YUV2YUV+0x140>
mov    -0x30(%rbp),%rax
mov    %rax,%rcx
add    $0x1,%rcx
mov    %rcx,-0x30(%rbp)
movzbl (%rax),%eax
mov    %ax,%cx
mov    -0x38(%rbp),%rax
mov    %rax,%rdx
add    $0x2,%rdx
mov    %rdx,-0x38(%rbp)
mov    %cx,(%rax)
jmp    11fb <YUV2YUV+0xfb>
xor    %eax,%eax
pop    %rbp
ret

x86 assembly (clang, -O2):
<YUV2YUV>:
push   %rbp
push   %rbx
imul   %esi,%edi
test   %edi,%edi
je     15cf <YUV2YUV+0x4cf>
movslq %edi,%rbx
cmp    $0x10,%edi
jb     11e5 <YUV2YUV+0xe5>
lea    (%rdx,%rbx,1),%rax
cmp    %rcx,%rax
jbe    112f <YUV2YUV+0x2f>
lea    (%rcx,%rbx,2),%rax
cmp    %rdx,%rax
ja     11e5 <YUV2YUV+0xe5>
mov    %rbx,%r10
and    $0xfffffffffffffff0,%r10
lea    -0x10(%r10),%rax
mov    %rax,%r11
shr    $0x4,%r11
add    $0x1,%r11
test   %rax,%rax
je     14be <YUV2YUV+0x3be>
mov    %r11,%rax
and    $0xfffffffffffffffe,%rax
xor    %esi,%esi
pxor   %xmm0,%xmm0
nopl   0x0(%rax,%rax,1)
movq   (%rdx,%rsi,1),%xmm1
movq   0x8(%rdx,%rsi,1),%xmm2
punpcklbw %xmm0,%xmm1
punpcklbw %xmm0,%xmm2
movdqu %xmm1,(%rcx,%rsi,2)
movdqu %xmm2,0x10(%rcx,%rsi,2)
movq   0x10(%rdx,%rsi,1),%xmm1
movq   0x18(%rdx,%rsi,1),%xmm2
punpcklbw %xmm0,%xmm1
punpcklbw %xmm0,%xmm2
movdqu %xmm1,0x20(%rcx,%rsi,2)
movdqu %xmm2,0x30(%rcx,%rsi,2)
add    $0x20,%rsi
add    $0xfffffffffffffffe,%rax
jne    1160 <YUV2YUV+0x60>
test   $0x1,%r11b
je     11d0 <YUV2YUV+0xd0>
movq   (%rdx,%rsi,1),%xmm0
movq   0x8(%rdx,%rsi,1),%xmm1
pxor   %xmm2,%xmm2
punpcklbw %xmm2,%xmm0
punpcklbw %xmm2,%xmm1
movdqu %xmm0,(%rcx,%rsi,2)
movdqu %xmm1,0x10(%rcx,%rsi,2)
add    %r10,%rdx
cmp    %rbx,%r10
je     127a <YUV2YUV+0x17a>
mov    %edi,%ebx
and    $0xf,%ebx
lea    (%rcx,%r10,2),%rcx
lea    -0x1(%rbx),%r10
mov    %rbx,%rax
and    $0x7,%rax
je     1218 <YUV2YUV+0x118>
cs nopw 0x0(%rax,%rax,1)
nopl   0x0(%rax)
add    $0xffffffffffffffff,%rbx
movzbl (%rdx),%esi
add    $0x1,%rdx
mov    %si,(%rcx)
add    $0x2,%rcx
add    $0xffffffffffffffff,%rax
jne    1200 <YUV2YUV+0x100>
cmp    $0x7,%r10
jb     127a <YUV2YUV+0x17a>
xor    %esi,%esi
movzbl (%rdx,%rsi,1),%eax
mov    %ax,(%rcx,%rsi,2)
movzbl 0x1(%rdx,%rsi,1),%eax
mov    %ax,0x2(%rcx,%rsi,2)
movzbl 0x2(%rdx,%rsi,1),%eax
mov    %ax,0x4(%rcx,%rsi,2)
movzbl 0x3(%rdx,%rsi,1),%eax
mov    %ax,0x6(%rcx,%rsi,2)
movzbl 0x4(%rdx,%rsi,1),%eax
mov    %ax,0x8(%rcx,%rsi,2)
movzbl 0x5(%rdx,%rsi,1),%eax
mov    %ax,0xa(%rcx,%rsi,2)
movzbl 0x6(%rdx,%rsi,1),%eax
mov    %ax,0xc(%rcx,%rsi,2)
movzbl 0x7(%rdx,%rsi,1),%eax
mov    %ax,0xe(%rcx,%rsi,2)
add    $0x8,%rsi
cmp    %rsi,%rbx
jne    1220 <YUV2YUV+0x120>
add    %rsi,%rdx
lea    0x3(%rdi),%ebp
test   %edi,%edi
cmovs  %ebp,%edi
cmp    $0x7,%ebp
jb     15cf <YUV2YUV+0x4cf>
sar    $0x2,%edi
movslq %edi,%rax
cmp    $0x10,%eax
jb     12b0 <YUV2YUV+0x1b0>
lea    (%rdx,%rax,1),%rcx
cmp    %r8,%rcx
jbe    1357 <YUV2YUV+0x257>
lea    (%r8,%rax,2),%rcx
cmp    %rcx,%rdx
jae    1357 <YUV2YUV+0x257>
mov    %rax,%rsi
lea    -0x1(%rsi),%r10
mov    %rsi,%rcx
and    $0x7,%rcx
je     12d9 <YUV2YUV+0x1d9>
add    $0xffffffffffffffff,%rsi
movzbl (%rdx),%ebx
add    $0x1,%rdx
mov    %bx,(%r8)
add    $0x2,%r8
add    $0xffffffffffffffff,%rcx
jne    12c0 <YUV2YUV+0x1c0>
cmp    $0x7,%r10
jb     1412 <YUV2YUV+0x312>
xor    %ecx,%ecx
cs nopw 0x0(%rax,%rax,1)
nop
movzbl (%rdx,%rcx,1),%ebx
mov    %bx,(%r8,%rcx,2)
movzbl 0x1(%rdx,%rcx,1),%ebx
mov    %bx,0x2(%r8,%rcx,2)
movzbl 0x2(%rdx,%rcx,1),%ebx
mov    %bx,0x4(%r8,%rcx,2)
movzbl 0x3(%rdx,%rcx,1),%ebx
mov    %bx,0x6(%r8,%rcx,2)
movzbl 0x4(%rdx,%rcx,1),%ebx
mov    %bx,0x8(%r8,%rcx,2)
movzbl 0x5(%rdx,%rcx,1),%ebx
mov    %bx,0xa(%r8,%rcx,2)
movzbl 0x6(%rdx,%rcx,1),%ebx
mov    %bx,0xc(%r8,%rcx,2)
movzbl 0x7(%rdx,%rcx,1),%ebx
mov    %bx,0xe(%r8,%rcx,2)
add    $0x8,%rcx
cmp    %rcx,%rsi
jne    12f0 <YUV2YUV+0x1f0>
add    %rcx,%rdx
jmp    1412 <YUV2YUV+0x312>
mov    %rax,%r10
and    $0xfffffffffffffff0,%r10
lea    -0x10(%r10),%rcx
mov    %rcx,%r11
shr    $0x4,%r11
add    $0x1,%r11
test   %rcx,%rcx
je     14dd <YUV2YUV+0x3dd>
mov    %r11,%rcx
and    $0xfffffffffffffffe,%rcx
xor    %esi,%esi
pxor   %xmm0,%xmm0
cs nopw 0x0(%rax,%rax,1)
nopl   (%rax)
movq   (%rdx,%rsi,1),%xmm1
movq   0x8(%rdx,%rsi,1),%xmm2
punpcklbw %xmm0,%xmm1
punpcklbw %xmm0,%xmm2
movdqu %xmm1,(%r8,%rsi,2)
movdqu %xmm2,0x10(%r8,%rsi,2)
movq   0x10(%rdx,%rsi,1),%xmm1
movq   0x18(%rdx,%rsi,1),%xmm2
punpcklbw %xmm0,%xmm1
punpcklbw %xmm0,%xmm2
movdqu %xmm1,0x20(%r8,%rsi,2)
movdqu %xmm2,0x30(%r8,%rsi,2)
add    $0x20,%rsi
add    $0xfffffffffffffffe,%rcx
jne    1390 <YUV2YUV+0x290>
test   $0x1,%r11b
je     1406 <YUV2YUV+0x306>
movq   (%rdx,%rsi,1),%xmm0
movq   0x8(%rdx,%rsi,1),%xmm1
pxor   %xmm2,%xmm2
punpcklbw %xmm2,%xmm0
punpcklbw %xmm2,%xmm1
movdqu %xmm0,(%r8,%rsi,2)
movdqu %xmm1,0x10(%r8,%rsi,2)
add    %r10,%rdx
cmp    %rax,%r10
jne    14cf <YUV2YUV+0x3cf>
cmp    $0x7,%ebp
jb     15cf <YUV2YUV+0x4cf>
cmp    $0x10,%edi
jb     152f <YUV2YUV+0x42f>
lea    (%rdx,%rax,1),%rcx
cmp    %r9,%rcx
jbe    143a <YUV2YUV+0x33a>
lea    (%r9,%rax,2),%rcx
cmp    %rcx,%rdx
jb     152f <YUV2YUV+0x42f>
mov    %rax,%r8
and    $0xfffffffffffffff0,%r8
lea    -0x10(%r8),%rcx
mov    %rcx,%rbx
shr    $0x4,%rbx
add    $0x1,%rbx
test   %rcx,%rcx
je     14ee <YUV2YUV+0x3ee>
mov    %rbx,%rcx
and    $0xfffffffffffffffe,%rcx
xor    %esi,%esi
pxor   %xmm0,%xmm0
cs nopw 0x0(%rax,%rax,1)
movq   (%rdx,%rsi,1),%xmm1
movq   0x8(%rdx,%rsi,1),%xmm2
punpcklbw %xmm0,%xmm1
punpcklbw %xmm0,%xmm2
movdqu %xmm1,(%r9,%rsi,2)
movdqu %xmm2,0x10(%r9,%rsi,2)
movq   0x10(%rdx,%rsi,1),%xmm1
movq   0x18(%rdx,%rsi,1),%xmm2
punpcklbw %xmm0,%xmm1
punpcklbw %xmm0,%xmm2
movdqu %xmm1,0x20(%r9,%rsi,2)
movdqu %xmm2,0x30(%r9,%rsi,2)
add    $0x20,%rsi
add    $0xfffffffffffffffe,%rcx
jne    1470 <YUV2YUV+0x370>
jmp    14f0 <YUV2YUV+0x3f0>
xor    %esi,%esi
test   $0x1,%r11b
jne    11ae <YUV2YUV+0xae>
jmp    11d0 <YUV2YUV+0xd0>
mov    %edi,%esi
and    $0xf,%esi
lea    (%r8,%r10,2),%r8
jmp    12b3 <YUV2YUV+0x1b3>
xor    %esi,%esi
test   $0x1,%r11b
jne    13e2 <YUV2YUV+0x2e2>
jmp    1406 <YUV2YUV+0x306>
xor    %esi,%esi
test   $0x1,%bl
je     1519 <YUV2YUV+0x419>
movq   (%rdx,%rsi,1),%xmm0
movq   0x8(%rdx,%rsi,1),%xmm1
pxor   %xmm2,%xmm2
punpcklbw %xmm2,%xmm0
punpcklbw %xmm2,%xmm1
movdqu %xmm0,(%r9,%rsi,2)
movdqu %xmm1,0x10(%r9,%rsi,2)
cmp    %rax,%r8
je     15cf <YUV2YUV+0x4cf>
and    $0xf,%edi
lea    (%r9,%r8,2),%r9
add    %r8,%rdx
mov    %rdi,%rax
lea    -0x1(%rax),%rcx
mov    %rax,%rsi
and    $0x7,%rsi
je     1559 <YUV2YUV+0x459>
nopl   0x0(%rax)
add    $0xffffffffffffffff,%rax
movzbl (%rdx),%edi
add    $0x1,%rdx
mov    %di,(%r9)
add    $0x2,%r9
add    $0xffffffffffffffff,%rsi
jne    1540 <YUV2YUV+0x440>
cmp    $0x7,%rcx
jb     15cf <YUV2YUV+0x4cf>
xor    %ecx,%ecx
cs nopw 0x0(%rax,%rax,1)
nopl   0x0(%rax,%rax,1)
movzbl (%rdx,%rcx,1),%esi
mov    %si,(%r9,%rcx,2)
movzbl 0x1(%rdx,%rcx,1),%esi
mov    %si,0x2(%r9,%rcx,2)
movzbl 0x2(%rdx,%rcx,1),%esi
mov    %si,0x4(%r9,%rcx,2)
movzbl 0x3(%rdx,%rcx,1),%esi
mov    %si,0x6(%r9,%rcx,2)
movzbl 0x4(%rdx,%rcx,1),%esi
mov    %si,0x8(%r9,%rcx,2)
movzbl 0x5(%rdx,%rcx,1),%esi
mov    %si,0xa(%r9,%rcx,2)
movzbl 0x6(%rdx,%rcx,1),%esi
mov    %si,0xc(%r9,%rcx,2)
movzbl 0x7(%rdx,%rcx,1),%esi
mov    %si,0xe(%r9,%rcx,2)
add    $0x8,%rcx
cmp    %rcx,%rax
jne    1570 <YUV2YUV+0x470>
xor    %eax,%eax
pop    %rbx
pop    %rbp
ret

LLVM IR (-O0):
define i32 @YUV2YUV(i32 %0, i32 %1, i8* %2, i8* %3, i8* %4, i8* %5) {
%7 = alloca i32
%8 = alloca i32
%9 = alloca i8*
%10 = alloca i8*
%11 = alloca i8*
%12 = alloca i8*
%13 = alloca i8*
%14 = alloca i16*
%15 = alloca i64
store i32 %0, i32* %7
store i32 %1, i32* %8
store i8* %2, i8** %9
store i8* %3, i8** %10
store i8* %4, i8** %11
store i8* %5, i8** %12
%16 = load i8*, i8** %9
store i8* %16, i8** %13
%17 = load i8*, i8** %10
%18 = bitcast i8* %17 to i16*
store i16* %18, i16** %14
%19 = load i32, i32* %7
%20 = load i32, i32* %8
%21 = mul nsw i32 %19, %20
%22 = sext i32 %21 to i64
store i64 %22, i64* %15
br label %23
23: ; preds = %27, %6
%24 = load i64, i64* %15
%25 = add nsw i64 %24, -1
store i64 %25, i64* %15
%26 = icmp ne i64 %24, 0
br i1 %26, label %27, label %34
27: ; preds = %23
%28 = load i8*, i8** %13
%29 = getelementptr inbounds i8, i8* %28, i32 1
store i8* %29, i8** %13
%30 = load i8, i8* %28
%31 = zext i8 %30 to i16
%32 = load i16*, i16** %14
%33 = getelementptr inbounds i16, i16* %32, i32 1
store i16* %33, i16** %14
store i16 %31, i16* %32
br label %23
34: ; preds = %23
%35 = load i8*, i8** %11
%36 = bitcast i8* %35 to i16*
store i16* %36, i16** %14
%37 = load i32, i32* %7
%38 = load i32, i32* %8
%39 = mul nsw i32 %37, %38
%40 = sdiv i32 %39, 4
%41 = sext i32 %40 to i64
store i64 %41, i64* %15
br label %42
42: ; preds = %46, %34
%43 = load i64, i64* %15
%44 = add nsw i64 %43, -1
store i64 %44, i64* %15
%45 = icmp ne i64 %43, 0
br i1 %45, label %46, label %53
46: ; preds = %42
%47 = load i8*, i8** %13
%48 = getelementptr inbounds i8, i8* %47, i32 1
store i8* %48, i8** %13
%49 = load i8, i8* %47
%50 = zext i8 %49 to i16
%51 = load i16*, i16** %14
%52 = getelementptr inbounds i16, i16* %51, i32 1
store i16* %52, i16** %14
store i16 %50, i16* %51
br label %42
53: ; preds = %42
%54 = load i8*, i8** %12
%55 = bitcast i8* %54 to i16*
store i16* %55, i16** %14
%56 = load i32, i32* %7
%57 = load i32, i32* %8
%58 = mul nsw i32 %56, %57
%59 = sdiv i32 %58, 4
%60 = sext i32 %59 to i64
store i64 %60, i64* %15
br label %61
61: ; preds = %65, %53
%62 = load i64, i64* %15
%63 = add nsw i64 %62, -1
store i64 %63, i64* %15
%64 = icmp ne i64 %62, 0
br i1 %64, label %65, label %72
65: ; preds = %61
%66 = load i8*, i8** %13
%67 = getelementptr inbounds i8, i8* %66, i32 1
store i8* %67, i8** %13
%68 = load i8, i8* %66
%69 = zext i8 %68 to i16
%70 = load i16*, i16** %14
%71 = getelementptr inbounds i16, i16* %70, i32 1
store i16* %71, i16** %14
store i16 %69, i16* %70
br label %61
72: ; preds = %61
ret i32 0
}

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