#define NULL ((void *)0)
typedef unsigned long size_t; // Customize by platform.
typedef long intptr_t;
typedef unsigned long uintptr_t;
typedef long scalar_t__; // Either arithmetic or pointer type.
/* By default, we understand bool (as a convenience). */
typedef int bool;
#define false 0
#define true 1

/* Forward declarations */

/* Type definitions */

/* Variables and functions */
int /*<<< orphan*/ abort();
__attribute__((no)) void ayuv2yuyv_ref(int *d, int *src, int n) {
  char *dest = (char *)d;
  int i;
  for (i = 0; i < n / 2; i++) {
    dest[i * 4 + 0] = (src[i * 2 + 0]) >> 16;
    dest[i * 4 + 1] = (src[i * 2 + 1]) >> 8;
    dest[i * 4 + 2] = (src[i * 2 + 0]) >> 16;
    dest[i * 4 + 3] = (src[i * 2 + 0]) >> 0;
  }
  for (i = 0; i < n / 2; i++) {
    if (dest[i * 4 + 0] != (src[i * 2 + 0]) >> 16 ||
        dest[i * 4 + 1] != (src[i * 2 + 1]) >> 8 ||
        dest[i * 4 + 2] != (src[i * 2 + 0]) >> 16 ||
        dest[i * 4 + 3] != (src[i * 2 + 0]) >> 0)
      abort();
  }
}


x86 assembly (clang, -O0):
<ayuv2yuyv_ref>:
push   %rbp
mov    %rsp,%rbp
sub    $0x30,%rsp
mov    %rdi,-0x8(%rbp)
mov    %rsi,-0x10(%rbp)
mov    %edx,-0x14(%rbp)
mov    -0x8(%rbp),%rax
mov    %rax,-0x20(%rbp)
movl   $0x0,-0x24(%rbp)
mov    -0x24(%rbp),%eax
mov    %eax,-0x28(%rbp)
mov    -0x14(%rbp),%eax
mov    $0x2,%ecx
cltd
idiv   %ecx
mov    %eax,%ecx
mov    -0x28(%rbp),%eax
cmp    %ecx,%eax
jge    120a <ayuv2yuyv_ref+0xfa>
mov    -0x10(%rbp),%rax
mov    -0x24(%rbp),%ecx
shl    $0x1,%ecx
add    $0x0,%ecx
movslq %ecx,%rcx
mov    (%rax,%rcx,4),%eax
sar    $0x10,%eax
mov    %al,%dl
mov    -0x20(%rbp),%rax
mov    -0x24(%rbp),%ecx
shl    $0x2,%ecx
add    $0x0,%ecx
movslq %ecx,%rcx
mov    %dl,(%rax,%rcx,1)
mov    -0x10(%rbp),%rax
mov    -0x24(%rbp),%ecx
shl    $0x1,%ecx
add    $0x1,%ecx
movslq %ecx,%rcx
mov    (%rax,%rcx,4),%eax
sar    $0x8,%eax
mov    %al,%dl
mov    -0x20(%rbp),%rax
mov    -0x24(%rbp),%ecx
shl    $0x2,%ecx
add    $0x1,%ecx
movslq %ecx,%rcx
mov    %dl,(%rax,%rcx,1)
mov    -0x10(%rbp),%rax
mov    -0x24(%rbp),%ecx
shl    $0x1,%ecx
add    $0x0,%ecx
movslq %ecx,%rcx
mov    (%rax,%rcx,4),%eax
sar    $0x10,%eax
mov    %al,%dl
mov    -0x20(%rbp),%rax
mov    -0x24(%rbp),%ecx
shl    $0x2,%ecx
add    $0x2,%ecx
movslq %ecx,%rcx
mov    %dl,(%rax,%rcx,1)
mov    -0x10(%rbp),%rax
mov    -0x24(%rbp),%ecx
shl    $0x1,%ecx
add    $0x0,%ecx
movslq %ecx,%rcx
mov    (%rax,%rcx,4),%eax
sar    $0x0,%eax
mov    %al,%dl
mov    -0x20(%rbp),%rax
mov    -0x24(%rbp),%ecx
shl    $0x2,%ecx
add    $0x3,%ecx
movslq %ecx,%rcx
mov    %dl,(%rax,%rcx,1)
mov    -0x24(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x24(%rbp)
jmp    1132 <ayuv2yuyv_ref+0x22>
movl   $0x0,-0x24(%rbp)
mov    -0x24(%rbp),%eax
mov    %eax,-0x2c(%rbp)
mov    -0x14(%rbp),%eax
mov    $0x2,%ecx
cltd
idiv   %ecx
mov    %eax,%ecx
mov    -0x2c(%rbp),%eax
cmp    %ecx,%eax
jge    1311 <ayuv2yuyv_ref+0x201>
mov    -0x20(%rbp),%rax
mov    -0x24(%rbp),%ecx
shl    $0x2,%ecx
add    $0x0,%ecx
movslq %ecx,%rcx
movsbl (%rax,%rcx,1),%eax
mov    -0x10(%rbp),%rcx
mov    -0x24(%rbp),%edx
shl    $0x1,%edx
add    $0x0,%edx
movslq %edx,%rdx
mov    (%rcx,%rdx,4),%ecx
sar    $0x10,%ecx
cmp    %ecx,%eax
jne    12f7 <ayuv2yuyv_ref+0x1e7>
mov    -0x20(%rbp),%rax
mov    -0x24(%rbp),%ecx
shl    $0x2,%ecx
add    $0x1,%ecx
movslq %ecx,%rcx
movsbl (%rax,%rcx,1),%eax
mov    -0x10(%rbp),%rcx
mov    -0x24(%rbp),%edx
shl    $0x1,%edx
add    $0x1,%edx
movslq %edx,%rdx
mov    (%rcx,%rdx,4),%ecx
sar    $0x8,%ecx
cmp    %ecx,%eax
jne    12f7 <ayuv2yuyv_ref+0x1e7>
mov    -0x20(%rbp),%rax
mov    -0x24(%rbp),%ecx
shl    $0x2,%ecx
add    $0x2,%ecx
movslq %ecx,%rcx
movsbl (%rax,%rcx,1),%eax
mov    -0x10(%rbp),%rcx
mov    -0x24(%rbp),%edx
shl    $0x1,%edx
add    $0x0,%edx
movslq %edx,%rdx
mov    (%rcx,%rdx,4),%ecx
sar    $0x10,%ecx
cmp    %ecx,%eax
jne    12f7 <ayuv2yuyv_ref+0x1e7>
mov    -0x20(%rbp),%rax
mov    -0x24(%rbp),%ecx
shl    $0x2,%ecx
add    $0x3,%ecx
movslq %ecx,%rcx
movsbl (%rax,%rcx,1),%eax
mov    -0x10(%rbp),%rcx
mov    -0x24(%rbp),%edx
shl    $0x1,%edx
add    $0x0,%edx
movslq %edx,%rdx
mov    (%rcx,%rdx,4),%ecx
sar    $0x0,%ecx
cmp    %ecx,%eax
je     12fe <ayuv2yuyv_ref+0x1ee>
mov    $0x0,%al
call   1030 <abort@plt>
jmp    1303 <ayuv2yuyv_ref+0x1f3>
mov    -0x24(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x24(%rbp)
jmp    1211 <ayuv2yuyv_ref+0x101>
add    $0x30,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<ayuv2yuyv_ref>:
push   %rax
cmp    $0x2,%edx
jl     11ad <ayuv2yuyv_ref+0x9d>
mov    %edx,%eax
shr    $0x1f,%eax
add    %edx,%eax
sar    %eax
mov    %eax,%r8d
xor    %ecx,%ecx
nopl   0x0(%rax,%rax,1)
movzbl 0x2(%rsi,%rcx,8),%eax
mov    %al,(%rdi,%rcx,4)
movzbl 0x5(%rsi,%rcx,8),%eax
mov    %al,0x1(%rdi,%rcx,4)
movzbl 0x2(%rsi,%rcx,8),%eax
mov    %al,0x2(%rdi,%rcx,4)
movzbl (%rsi,%rcx,8),%eax
mov    %al,0x3(%rdi,%rcx,4)
add    $0x1,%rcx
cmp    %rcx,%r8
jne    1130 <ayuv2yuyv_ref+0x20>
cmp    $0x2,%edx
jl     11ad <ayuv2yuyv_ref+0x9d>
xor    %ecx,%ecx
cs nopw 0x0(%rax,%rax,1)
nopl   0x0(%rax)
movsbl (%rdi,%rcx,4),%eax
mov    (%rsi,%rcx,8),%r9d
mov    %r9d,%edx
sar    $0x10,%edx
cmp    %eax,%edx
jne    11af <ayuv2yuyv_ref+0x9f>
movsbl 0x1(%rdi,%rcx,4),%r10d
mov    0x4(%rsi,%rcx,8),%edx
sar    $0x8,%edx
cmp    %r10d,%edx
jne    11af <ayuv2yuyv_ref+0x9f>
cmp    0x2(%rdi,%rcx,4),%al
jne    11af <ayuv2yuyv_ref+0x9f>
movsbl 0x3(%rdi,%rcx,4),%eax
cmp    %eax,%r9d
jne    11af <ayuv2yuyv_ref+0x9f>
add    $0x1,%rcx
cmp    %rcx,%r8
jne    1170 <ayuv2yuyv_ref+0x60>
pop    %rax
ret
xor    %eax,%eax
call   1030 <abort@plt>

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

LLVM IR (-O2):
define void @ayuv2yuyv_ref(i32* nocapture %0, i32* nocapture %1, i32 %2) {
%4 = bitcast i32* %0 to i8*
%5 = sdiv i32 %2, 2
%6 = icmp sgt i32 %2, 1
br i1 %6, label %7, label %78
7: ; preds = %3
%8 = zext i32 %5 to i64
br label %12
9: ; preds = %12
br i1 %6, label %10, label %78
10: ; preds = %9
%11 = zext i32 %5 to i64
br label %42
12: ; preds = %7, %12
%13 = phi i64 [ 0, %7 ], [ %38, %12 ]
%14 = shl nuw nsw i64 %13, 1
%15 = getelementptr inbounds i32, i32* %1, i64 %14
%16 = load i32, i32* %15
%17 = lshr i32 %16, 16
%18 = trunc i32 %17 to i8
%19 = shl nsw i64 %13, 2
%20 = getelementptr inbounds i32, i32* %0, i64 %13
%21 = bitcast i32* %20 to i8*
store i8 %18, i8* %21
%22 = or i64 %14, 1
%23 = getelementptr inbounds i32, i32* %1, i64 %22
%24 = load i32, i32* %23
%25 = lshr i32 %24, 8
%26 = trunc i32 %25 to i8
%27 = or i64 %19, 1
%28 = getelementptr inbounds i8, i8* %4, i64 %27
store i8 %26, i8* %28
%29 = load i32, i32* %15
%30 = lshr i32 %29, 16
%31 = trunc i32 %30 to i8
%32 = or i64 %19, 2
%33 = getelementptr inbounds i8, i8* %4, i64 %32
store i8 %31, i8* %33
%34 = load i32, i32* %15
%35 = trunc i32 %34 to i8
%36 = or i64 %19, 3
%37 = getelementptr inbounds i8, i8* %4, i64 %36
store i8 %35, i8* %37
%38 = add nuw nsw i64 %13, 1
%39 = icmp eq i64 %38, %8
br i1 %39, label %9, label %12
40: ; preds = %69
%41 = icmp eq i64 %75, %11
br i1 %41, label %78, label %42
42: ; preds = %10, %40
%43 = phi i64 [ 0, %10 ], [ %75, %40 ]
%44 = shl nsw i64 %43, 2
%45 = getelementptr inbounds i32, i32* %0, i64 %43
%46 = bitcast i32* %45 to i8*
%47 = load i8, i8* %46
%48 = sext i8 %47 to i32
%49 = shl nuw nsw i64 %43, 1
%50 = getelementptr inbounds i32, i32* %1, i64 %49
%51 = load i32, i32* %50
%52 = ashr i32 %51, 16
%53 = icmp eq i32 %52, %48
br i1 %53, label %54, label %76
54: ; preds = %42
%55 = or i64 %44, 1
%56 = getelementptr inbounds i8, i8* %4, i64 %55
%57 = load i8, i8* %56
%58 = sext i8 %57 to i32
%59 = or i64 %49, 1
%60 = getelementptr inbounds i32, i32* %1, i64 %59
%61 = load i32, i32* %60
%62 = ashr i32 %61, 8
%63 = icmp eq i32 %62, %58
br i1 %63, label %64, label %76
64: ; preds = %54
%65 = or i64 %44, 2
%66 = getelementptr inbounds i8, i8* %4, i64 %65
%67 = load i8, i8* %66
%68 = icmp eq i8 %47, %67
br i1 %68, label %69, label %76
69: ; preds = %64
%70 = or i64 %44, 3
%71 = getelementptr inbounds i8, i8* %4, i64 %70
%72 = load i8, i8* %71
%73 = sext i8 %72 to i32
%74 = icmp eq i32 %51, %73
%75 = add nuw nsw i64 %43, 1
br i1 %74, label %40, label %76
76: ; preds = %69, %64, %54, %42
%77 = tail call i32 (...) @abort()
unreachable
78: ; preds = %40, %3, %9
ret void
}