void yuv420pto422(int *out, unsigned char *pic, int width) {
  int j, k;
  unsigned char *pic0, *pic1;
  int *outy, *outu, *outv;
  int outy1 = 0;
  int outy2 = 8;
  pic0 = pic;
  pic1 = pic + width;
  outy = out;
  outu = out + 64 * 4;
  outv = out + 64 * 5;
  for (j = 0; j < 8; j++) {
    for (k = 0; k < 8; k++) {
      if (k == 4) {
        outy1 += 56;
        outy2 += 56;
      }
      *pic0++ =
          (unsigned char)(((outy[outy1]) > 0xFF)
                              ? 0xff
                              : (((outy[outy1]) < 0) ? 0 : (outy[outy1])));
      *pic0++ =
          (unsigned char)(((128 + *outu) > 0xFF)
                              ? 0xff
                              : (((128 + *outu) < 0) ? 0 : (128 + *outu)));
      *pic0++ =
          (unsigned char)(((outy[outy1 + 1]) > 0xFF)
                              ? 0xff
                              : (((outy[outy1 + 1]) < 0) ? 0
                                                         : (outy[outy1 + 1])));
      *pic0++ =
          (unsigned char)(((128 + *outv) > 0xFF)
                              ? 0xff
                              : (((128 + *outv) < 0) ? 0 : (128 + *outv)));
      *pic1++ =
          (unsigned char)(((outy[outy2]) > 0xFF)
                              ? 0xff
                              : (((outy[outy2]) < 0) ? 0 : (outy[outy2])));
      *pic1++ =
          (unsigned char)(((128 + *outu) > 0xFF)
                              ? 0xff
                              : (((128 + *outu) < 0) ? 0 : (128 + *outu)));
      *pic1++ =
          (unsigned char)(((outy[outy2 + 1]) > 0xFF)
                              ? 0xff
                              : (((outy[outy2 + 1]) < 0) ? 0
                                                         : (outy[outy2 + 1])));
      *pic1++ =
          (unsigned char)(((128 + *outv) > 0xFF)
                              ? 0xff
                              : (((128 + *outv) < 0) ? 0 : (128 + *outv)));
      outy1 += 2;
      outy2 += 2;
      outu++;
      outv++;
    }
    if (j == 3) {
      outy = out + 128;
    } else {
      outy += 16;
    }
    outy1 = 0;
    outy2 = 8;
    pic0 += 2 * (width - 16);
    pic1 += 2 * (width - 16);
  }
}


x86 assembly (clang, -O0):
<yuv420pto422>:
push   %rbp
mov    %rsp,%rbp
sub    $0x10,%rsp
mov    %rdi,-0x8(%rbp)
mov    %rsi,-0x10(%rbp)
mov    %edx,-0x14(%rbp)
movl   $0x0,-0x4c(%rbp)
movl   $0x8,-0x50(%rbp)
mov    -0x10(%rbp),%rax
mov    %rax,-0x28(%rbp)
mov    -0x10(%rbp),%rax
movslq -0x14(%rbp),%rcx
add    %rcx,%rax
mov    %rax,-0x30(%rbp)
mov    -0x8(%rbp),%rax
mov    %rax,-0x38(%rbp)
mov    -0x8(%rbp),%rax
add    $0x400,%rax
mov    %rax,-0x40(%rbp)
mov    -0x8(%rbp),%rax
add    $0x500,%rax
mov    %rax,-0x48(%rbp)
movl   $0x0,-0x18(%rbp)
cmpl   $0x8,-0x18(%rbp)
jge    15d3 <yuv420pto422+0x4d3>
movl   $0x0,-0x1c(%rbp)
cmpl   $0x8,-0x1c(%rbp)
jge    1560 <yuv420pto422+0x460>
cmpl   $0x4,-0x1c(%rbp)
jne    119a <yuv420pto422+0x9a>
mov    -0x4c(%rbp),%eax
add    $0x38,%eax
mov    %eax,-0x4c(%rbp)
mov    -0x50(%rbp),%eax
add    $0x38,%eax
mov    %eax,-0x50(%rbp)
mov    -0x38(%rbp),%rax
movslq -0x4c(%rbp),%rcx
cmpl   $0xff,(%rax,%rcx,4)
jle    11bc <yuv420pto422+0xbc>
mov    $0xff,%eax
mov    %eax,-0x54(%rbp)
jmp    11ec <yuv420pto422+0xec>
mov    -0x38(%rbp),%rax
movslq -0x4c(%rbp),%rcx
cmpl   $0x0,(%rax,%rcx,4)
jge    11d8 <yuv420pto422+0xd8>
xor    %eax,%eax
mov    %eax,-0x58(%rbp)
jmp    11e6 <yuv420pto422+0xe6>
mov    -0x38(%rbp),%rax
movslq -0x4c(%rbp),%rcx
mov    (%rax,%rcx,4),%eax
mov    %eax,-0x58(%rbp)
mov    -0x58(%rbp),%eax
mov    %eax,-0x54(%rbp)
mov    -0x54(%rbp),%eax
mov    %al,%cl
mov    -0x28(%rbp),%rax
mov    %rax,%rdx
add    $0x1,%rdx
mov    %rdx,-0x28(%rbp)
mov    %cl,(%rax)
mov    -0x40(%rbp),%rax
mov    (%rax),%eax
add    $0x80,%eax
cmp    $0xff,%eax
jle    1225 <yuv420pto422+0x125>
mov    $0xff,%eax
mov    %eax,-0x5c(%rbp)
jmp    1257 <yuv420pto422+0x157>
mov    -0x40(%rbp),%rax
mov    (%rax),%eax
add    $0x80,%eax
cmp    $0x0,%eax
jge    1243 <yuv420pto422+0x143>
xor    %eax,%eax
mov    %eax,-0x60(%rbp)
jmp    1251 <yuv420pto422+0x151>
mov    -0x40(%rbp),%rax
mov    (%rax),%eax
add    $0x80,%eax
mov    %eax,-0x60(%rbp)
mov    -0x60(%rbp),%eax
mov    %eax,-0x5c(%rbp)
mov    -0x5c(%rbp),%eax
mov    %al,%cl
mov    -0x28(%rbp),%rax
mov    %rax,%rdx
add    $0x1,%rdx
mov    %rdx,-0x28(%rbp)
mov    %cl,(%rax)
mov    -0x38(%rbp),%rax
mov    -0x4c(%rbp),%ecx
add    $0x1,%ecx
movslq %ecx,%rcx
cmpl   $0xff,(%rax,%rcx,4)
jle    1294 <yuv420pto422+0x194>
mov    $0xff,%eax
mov    %eax,-0x64(%rbp)
jmp    12ce <yuv420pto422+0x1ce>
mov    -0x38(%rbp),%rax
mov    -0x4c(%rbp),%ecx
add    $0x1,%ecx
movslq %ecx,%rcx
cmpl   $0x0,(%rax,%rcx,4)
jge    12b5 <yuv420pto422+0x1b5>
xor    %eax,%eax
mov    %eax,-0x68(%rbp)
jmp    12c8 <yuv420pto422+0x1c8>
mov    -0x38(%rbp),%rax
mov    -0x4c(%rbp),%ecx
add    $0x1,%ecx
movslq %ecx,%rcx
mov    (%rax,%rcx,4),%eax
mov    %eax,-0x68(%rbp)
mov    -0x68(%rbp),%eax
mov    %eax,-0x64(%rbp)
mov    -0x64(%rbp),%eax
mov    %al,%cl
mov    -0x28(%rbp),%rax
mov    %rax,%rdx
add    $0x1,%rdx
mov    %rdx,-0x28(%rbp)
mov    %cl,(%rax)
mov    -0x48(%rbp),%rax
mov    (%rax),%eax
add    $0x80,%eax
cmp    $0xff,%eax
jle    1307 <yuv420pto422+0x207>
mov    $0xff,%eax
mov    %eax,-0x6c(%rbp)
jmp    1339 <yuv420pto422+0x239>
mov    -0x48(%rbp),%rax
mov    (%rax),%eax
add    $0x80,%eax
cmp    $0x0,%eax
jge    1325 <yuv420pto422+0x225>
xor    %eax,%eax
mov    %eax,-0x70(%rbp)
jmp    1333 <yuv420pto422+0x233>
mov    -0x48(%rbp),%rax
mov    (%rax),%eax
add    $0x80,%eax
mov    %eax,-0x70(%rbp)
mov    -0x70(%rbp),%eax
mov    %eax,-0x6c(%rbp)
mov    -0x6c(%rbp),%eax
mov    %al,%cl
mov    -0x28(%rbp),%rax
mov    %rax,%rdx
add    $0x1,%rdx
mov    %rdx,-0x28(%rbp)
mov    %cl,(%rax)
mov    -0x38(%rbp),%rax
movslq -0x50(%rbp),%rcx
cmpl   $0xff,(%rax,%rcx,4)
jle    1371 <yuv420pto422+0x271>
mov    $0xff,%eax
mov    %eax,-0x74(%rbp)
jmp    13a1 <yuv420pto422+0x2a1>
mov    -0x38(%rbp),%rax
movslq -0x50(%rbp),%rcx
cmpl   $0x0,(%rax,%rcx,4)
jge    138d <yuv420pto422+0x28d>
xor    %eax,%eax
mov    %eax,-0x78(%rbp)
jmp    139b <yuv420pto422+0x29b>
mov    -0x38(%rbp),%rax
movslq -0x50(%rbp),%rcx
mov    (%rax,%rcx,4),%eax
mov    %eax,-0x78(%rbp)
mov    -0x78(%rbp),%eax
mov    %eax,-0x74(%rbp)
mov    -0x74(%rbp),%eax
mov    %al,%cl
mov    -0x30(%rbp),%rax
mov    %rax,%rdx
add    $0x1,%rdx
mov    %rdx,-0x30(%rbp)
mov    %cl,(%rax)
mov    -0x40(%rbp),%rax
mov    (%rax),%eax
add    $0x80,%eax
cmp    $0xff,%eax
jle    13da <yuv420pto422+0x2da>
mov    $0xff,%eax
mov    %eax,-0x7c(%rbp)
jmp    140c <yuv420pto422+0x30c>
mov    -0x40(%rbp),%rax
mov    (%rax),%eax
add    $0x80,%eax
cmp    $0x0,%eax
jge    13f8 <yuv420pto422+0x2f8>
xor    %eax,%eax
mov    %eax,-0x80(%rbp)
jmp    1406 <yuv420pto422+0x306>
mov    -0x40(%rbp),%rax
mov    (%rax),%eax
add    $0x80,%eax
mov    %eax,-0x80(%rbp)
mov    -0x80(%rbp),%eax
mov    %eax,-0x7c(%rbp)
mov    -0x7c(%rbp),%eax
mov    %al,%cl
mov    -0x30(%rbp),%rax
mov    %rax,%rdx
add    $0x1,%rdx
mov    %rdx,-0x30(%rbp)
mov    %cl,(%rax)
mov    -0x38(%rbp),%rax
mov    -0x50(%rbp),%ecx
add    $0x1,%ecx
movslq %ecx,%rcx
cmpl   $0xff,(%rax,%rcx,4)
jle    144c <yuv420pto422+0x34c>
mov    $0xff,%eax
mov    %eax,-0x84(%rbp)
jmp    1492 <yuv420pto422+0x392>
mov    -0x38(%rbp),%rax
mov    -0x50(%rbp),%ecx
add    $0x1,%ecx
movslq %ecx,%rcx
cmpl   $0x0,(%rax,%rcx,4)
jge    1470 <yuv420pto422+0x370>
xor    %eax,%eax
mov    %eax,-0x88(%rbp)
jmp    1486 <yuv420pto422+0x386>
mov    -0x38(%rbp),%rax
mov    -0x50(%rbp),%ecx
add    $0x1,%ecx
movslq %ecx,%rcx
mov    (%rax,%rcx,4),%eax
mov    %eax,-0x88(%rbp)
mov    -0x88(%rbp),%eax
mov    %eax,-0x84(%rbp)
mov    -0x84(%rbp),%eax
mov    %al,%cl
mov    -0x30(%rbp),%rax
mov    %rax,%rdx
add    $0x1,%rdx
mov    %rdx,-0x30(%rbp)
mov    %cl,(%rax)
mov    -0x48(%rbp),%rax
mov    (%rax),%eax
add    $0x80,%eax
cmp    $0xff,%eax
jle    14d1 <yuv420pto422+0x3d1>
mov    $0xff,%eax
mov    %eax,-0x8c(%rbp)
jmp    150f <yuv420pto422+0x40f>
mov    -0x48(%rbp),%rax
mov    (%rax),%eax
add    $0x80,%eax
cmp    $0x0,%eax
jge    14f2 <yuv420pto422+0x3f2>
xor    %eax,%eax
mov    %eax,-0x90(%rbp)
jmp    1503 <yuv420pto422+0x403>
mov    -0x48(%rbp),%rax
mov    (%rax),%eax
add    $0x80,%eax
mov    %eax,-0x90(%rbp)
mov    -0x90(%rbp),%eax
mov    %eax,-0x8c(%rbp)
mov    -0x8c(%rbp),%eax
mov    %al,%cl
mov    -0x30(%rbp),%rax
mov    %rax,%rdx
add    $0x1,%rdx
mov    %rdx,-0x30(%rbp)
mov    %cl,(%rax)
mov    -0x4c(%rbp),%eax
add    $0x2,%eax
mov    %eax,-0x4c(%rbp)
mov    -0x50(%rbp),%eax
add    $0x2,%eax
mov    %eax,-0x50(%rbp)
mov    -0x40(%rbp),%rax
add    $0x4,%rax
mov    %rax,-0x40(%rbp)
mov    -0x48(%rbp),%rax
add    $0x4,%rax
mov    %rax,-0x48(%rbp)
mov    -0x1c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x1c(%rbp)
jmp    1174 <yuv420pto422+0x74>
cmpl   $0x3,-0x18(%rbp)
jne    157d <yuv420pto422+0x47d>
mov    -0x8(%rbp),%rax
add    $0x200,%rax
mov    %rax,-0x38(%rbp)
jmp    1589 <yuv420pto422+0x489>
mov    -0x38(%rbp),%rax
add    $0x40,%rax
mov    %rax,-0x38(%rbp)
movl   $0x0,-0x4c(%rbp)
movl   $0x8,-0x50(%rbp)
mov    -0x14(%rbp),%ecx
sub    $0x10,%ecx
shl    $0x1,%ecx
mov    -0x28(%rbp),%rax
movslq %ecx,%rcx
add    %rcx,%rax
mov    %rax,-0x28(%rbp)
mov    -0x14(%rbp),%ecx
sub    $0x10,%ecx
shl    $0x1,%ecx
mov    -0x30(%rbp),%rax
movslq %ecx,%rcx
add    %rcx,%rax
mov    %rax,-0x30(%rbp)
mov    -0x18(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x18(%rbp)
jmp    1163 <yuv420pto422+0x63>
add    $0x10,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<yuv420pto422>:
push   %rbp
push   %r15
push   %r14
push   %r13
push   %r12
push   %rbx
movslq %edx,%rax
lea    (%rsi,%rax,1),%r13
lea    0x400(%rdi),%r11
lea    0x500(%rdi),%r14
lea    0x200(%rdi),%rcx
mov    %rcx,-0x8(%rsp)
add    %eax,%eax
add    $0xffffffe0,%eax
cltq
mov    %rax,-0x10(%rsp)
xor    %r10d,%r10d
xor    %r15d,%r15d
mov    $0xff,%r12d
jmp    1183 <yuv420pto422+0x83>
cs nopw 0x0(%rax,%rax,1)
nop
add    $0x40,%rdi
cmp    $0x3,%r10d
cmove  -0x8(%rsp),%rdi
mov    -0x10(%rsp),%rax
add    %rax,%rsi
add    %rcx,%rsi
add    %rax,%r13
add    %rcx,%r13
add    $0x1,%r10d
add    %rcx,%r14
add    %rcx,%r11
cmp    $0x8,%r10d
je     12a9 <yuv420pto422+0x1a9>
mov    $0x8,%edx
xor    %ecx,%ecx
xor    %eax,%eax
jmp    11c9 <yuv420pto422+0xc9>
xchg   %ax,%ax
mov    %al,0x2(%r13,%rcx,1)
mov    (%r14,%rcx,1),%eax
mov    %eax,%edx
xor    $0x80,%dl
cmp    $0xffffff80,%eax
movzbl %dl,%edx
cmovl  %r15d,%edx
cmp    $0x7f,%eax
cmovg  %r12d,%edx
mov    %dl,0x3(%r13,%rcx,1)
add    $0x2,%r9d
add    $0x2,%ebp
add    $0x4,%rcx
mov    %ebp,%edx
mov    %r9d,%eax
cmp    $0x20,%ecx
je     1150 <yuv420pto422+0x50>
lea    0x38(%rax),%r9d
lea    0x38(%rdx),%ebp
cmp    $0x10,%ecx
cmovne %eax,%r9d
cmovne %edx,%ebp
movslq %r9d,%rdx
mov    (%rdi,%rdx,4),%eax
test   %eax,%eax
jns    11e6 <yuv420pto422+0xe6>
xor    %eax,%eax
cmp    $0xff,%eax
jb     11f2 <yuv420pto422+0xf2>
mov    $0xff,%eax
mov    %al,(%rsi,%rcx,1)
mov    (%r11,%rcx,1),%eax
mov    %eax,%r8d
xor    $0x80,%r8b
cmp    $0xffffff80,%eax
movzbl %r8b,%ebx
cmovl  %r15d,%ebx
cmp    $0x7f,%eax
cmovg  %r12d,%ebx
mov    %bl,0x1(%rsi,%rcx,1)
mov    0x4(%rdi,%rdx,4),%eax
test   %eax,%eax
jns    1220 <yuv420pto422+0x120>
xor    %eax,%eax
cmp    $0xff,%eax
jb     122c <yuv420pto422+0x12c>
mov    $0xff,%eax
mov    %al,0x2(%rsi,%rcx,1)
mov    (%r14,%rcx,1),%eax
mov    %eax,%edx
xor    $0x80,%dl
cmp    $0xffffff80,%eax
movzbl %dl,%edx
cmovl  %r15d,%edx
cmp    $0x7f,%eax
cmovg  %r12d,%edx
mov    %dl,0x3(%rsi,%rcx,1)
movslq %ebp,%rdx
mov    (%rdi,%rdx,4),%eax
test   %eax,%eax
jns    125a <yuv420pto422+0x15a>
xor    %eax,%eax
cmp    $0xff,%eax
jb     1266 <yuv420pto422+0x166>
mov    $0xff,%eax
mov    %al,0x0(%r13,%rcx,1)
mov    (%r11,%rcx,1),%eax
mov    %eax,%ebx
xor    $0x80,%bl
cmp    $0xffffff80,%eax
movzbl %bl,%ebx
cmovl  %r15d,%ebx
cmp    $0x7f,%eax
cmovg  %r12d,%ebx
mov    %bl,0x1(%r13,%rcx,1)
mov    0x4(%rdi,%rdx,4),%eax
test   %eax,%eax
jns    1294 <yuv420pto422+0x194>
xor    %eax,%eax
cmp    $0xff,%eax
jb     1190 <yuv420pto422+0x90>
mov    $0xff,%eax
jmp    1190 <yuv420pto422+0x90>
pop    %rbx
pop    %r12
pop    %r13
pop    %r14
pop    %r15
pop    %rbp
ret

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

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