void ac3_5p1_mux(short *output, short *input1, short *input2, int n) {
  int i;
  short l, r;
  for (i = 0; i < n; i++) {
    l = *input1++;
    r = *input2++;
    *output++ = l;
    *output++ = (l / 2) + (r / 2);
    *output++ = r;
    *output++ = 0;
    *output++ = 0;
    *output++ = 0;
  }
}


x86 assembly (clang, -O0):
<ac3_5p1_mux>:
push   %rbp
mov    %rsp,%rbp
mov    %rdi,-0x8(%rbp)
mov    %rsi,-0x10(%rbp)
mov    %rdx,-0x18(%rbp)
mov    %ecx,-0x1c(%rbp)
movl   $0x0,-0x20(%rbp)
mov    -0x20(%rbp),%eax
cmp    -0x1c(%rbp),%eax
jge    11ff <ac3_5p1_mux+0xff>
mov    -0x10(%rbp),%rax
mov    %rax,%rcx
add    $0x2,%rcx
mov    %rcx,-0x10(%rbp)
mov    (%rax),%ax
mov    %ax,-0x22(%rbp)
mov    -0x18(%rbp),%rax
mov    %rax,%rcx
add    $0x2,%rcx
mov    %rcx,-0x18(%rbp)
mov    (%rax),%ax
mov    %ax,-0x24(%rbp)
mov    -0x22(%rbp),%cx
mov    -0x8(%rbp),%rax
mov    %rax,%rdx
add    $0x2,%rdx
mov    %rdx,-0x8(%rbp)
mov    %cx,(%rax)
movswl -0x22(%rbp),%eax
mov    $0x2,%ecx
cltd
idiv   %ecx
mov    %eax,-0x28(%rbp)
movswl -0x24(%rbp),%eax
mov    $0x2,%ecx
cltd
idiv   %ecx
mov    %eax,%ecx
mov    -0x28(%rbp),%eax
add    %ecx,%eax
mov    %ax,%cx
mov    -0x8(%rbp),%rax
mov    %rax,%rdx
add    $0x2,%rdx
mov    %rdx,-0x8(%rbp)
mov    %cx,(%rax)
mov    -0x24(%rbp),%cx
mov    -0x8(%rbp),%rax
mov    %rax,%rdx
add    $0x2,%rdx
mov    %rdx,-0x8(%rbp)
mov    %cx,(%rax)
mov    -0x8(%rbp),%rax
mov    %rax,%rcx
add    $0x2,%rcx
mov    %rcx,-0x8(%rbp)
movw   $0x0,(%rax)
mov    -0x8(%rbp),%rax
mov    %rax,%rcx
add    $0x2,%rcx
mov    %rcx,-0x8(%rbp)
movw   $0x0,(%rax)
mov    -0x8(%rbp),%rax
mov    %rax,%rcx
add    $0x2,%rcx
mov    %rcx,-0x8(%rbp)
movw   $0x0,(%rax)
mov    -0x20(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x20(%rbp)
jmp    111a <ac3_5p1_mux+0x1a>
pop    %rbp
ret

x86 assembly (clang, -O2):
<ac3_5p1_mux>:
push   %rbp
push   %rbx
test   %ecx,%ecx
jle    1318 <ac3_5p1_mux+0x218>
lea    -0x1(%rcx),%r11d
xor    %r10d,%r10d
cmp    $0x7,%r11d
jb     12c0 <ac3_5p1_mux+0x1c0>
lea    (%r11,%r11,2),%rax
lea    (%rsi,%r11,2),%rbx
add    $0x2,%rbx
cmp    %rdi,%rbx
seta   %r9b
lea    (%rdi,%rax,4),%rbx
add    $0xc,%rbx
cmp    %rsi,%rbx
seta   %bpl
lea    (%rdx,%r11,2),%rax
add    $0x2,%rax
cmp    %rdi,%rax
seta   %al
cmp    %rdx,%rbx
seta   %r8b
test   %bpl,%r9b
jne    12c0 <ac3_5p1_mux+0x1c0>
and    %r8b,%al
jne    12c0 <ac3_5p1_mux+0x1c0>
add    $0x1,%r11
mov    %r11,%r10
and    $0xfffffffffffffff8,%r10
lea    (%r10,%r10,2),%rax
lea    (%rdi,%rax,4),%rax
lea    (%rsi,%r10,2),%r8
lea    (%rdx,%r10,2),%r9
xor    %ebx,%ebx
movaps 0xe77(%rip),%xmm8
movdqa 0xe7e(%rip),%xmm11
movdqa 0xe85(%rip),%xmm9
movaps 0xe8d(%rip),%xmm10
cs nopw 0x0(%rax,%rax,1)
nopl   (%rax)
movdqu (%rsi,%rbx,2),%xmm6
movdqu (%rdx,%rbx,2),%xmm0
movdqa %xmm6,%xmm7
psrlw  $0xf,%xmm7
paddw  %xmm6,%xmm7
psraw  $0x1,%xmm7
movdqa %xmm0,%xmm5
psrlw  $0xf,%xmm5
paddw  %xmm0,%xmm5
psraw  $0x1,%xmm5
paddw  %xmm7,%xmm5
movdqa %xmm6,%xmm12
movdqa %xmm0,%xmm3
punpcklwd %xmm6,%xmm3
movdqa %xmm0,%xmm2
punpckhwd %xmm6,%xmm2
punpcklwd %xmm5,%xmm6
movdqa %xmm0,%xmm4
punpcklqdq %xmm6,%xmm4
shufps $0x42,%xmm6,%xmm4
andps  %xmm8,%xmm4
punpckhwd %xmm5,%xmm12
movdqa %xmm5,%xmm1
pslldq $0x6,%xmm1
movdqa %xmm11,%xmm7
pandn  %xmm1,%xmm7
movdqa %xmm0,%xmm1
shufps $0x4e,%xmm12,%xmm1
shufps $0x42,%xmm12,%xmm1
andps  %xmm8,%xmm1
pshufd $0xe5,%xmm3,%xmm3
pshufhw $0xc5,%xmm3,%xmm3
pand   %xmm11,%xmm3
por    %xmm7,%xmm3
pand   %xmm9,%xmm3
psrlq  $0x10,%xmm5
movdqa %xmm11,%xmm7
pandn  %xmm5,%xmm7
pshufd $0xe5,%xmm2,%xmm2
pshufhw $0xc5,%xmm2,%xmm2
pand   %xmm11,%xmm2
por    %xmm7,%xmm2
pand   %xmm9,%xmm2
movdqa %xmm0,%xmm5
pslldq $0x2,%xmm5
movhlps %xmm6,%xmm5
andps  %xmm10,%xmm5
psrlq  $0x30,%xmm0
movhlps %xmm12,%xmm0
andps  %xmm10,%xmm0
movups %xmm0,0x50(%rdi)
movups %xmm5,0x20(%rdi)
movdqu %xmm2,0x40(%rdi)
movups %xmm1,0x30(%rdi)
movdqu %xmm3,0x10(%rdi)
movups %xmm4,(%rdi)
add    $0x8,%rbx
add    $0x60,%rdi
cmp    %rbx,%r10
jne    11b0 <ac3_5p1_mux+0xb0>
cmp    %r10,%r11
jne    12c9 <ac3_5p1_mux+0x1c9>
jmp    1318 <ac3_5p1_mux+0x218>
mov    %rdi,%rax
mov    %rsi,%r8
mov    %rdx,%r9
sub    %r10d,%ecx
xor    %edx,%edx
xchg   %ax,%ax
movzwl (%r8,%rdx,2),%ebp
movzwl (%r9,%rdx,2),%ebx
mov    %bp,(%rax)
mov    %ebp,%esi
shr    $0xf,%esi
add    %ebp,%esi
movswl %si,%esi
sar    %esi
mov    %ebx,%edi
shr    $0xf,%edi
add    %ebx,%edi
movswl %di,%edi
sar    %edi
add    %esi,%edi
mov    %di,0x2(%rax)
mov    %bx,0x4(%rax)
movl   $0x0,0x6(%rax)
movw   $0x0,0xa(%rax)
add    $0x1,%rdx
add    $0xc,%rax
cmp    %edx,%ecx
jne    12d0 <ac3_5p1_mux+0x1d0>
pop    %rbx
pop    %rbp
ret

LLVM IR (-O0):
define void @ac3_5p1_mux(i16* %0, i16* %1, i16* %2, i32 %3) {
%5 = alloca i16*
%6 = alloca i16*
%7 = alloca i16*
%8 = alloca i32
%9 = alloca i32
%10 = alloca i16
%11 = alloca i16
store i16* %0, i16** %5
store i16* %1, i16** %6
store i16* %2, i16** %7
store i32 %3, i32* %8
store i32 0, i32* %9
br label %12
12: ; preds = %45, %4
%13 = load i32, i32* %9
%14 = load i32, i32* %8
%15 = icmp slt i32 %13, %14
br i1 %15, label %16, label %48
16: ; preds = %12
%17 = load i16*, i16** %6
%18 = getelementptr inbounds i16, i16* %17, i32 1
store i16* %18, i16** %6
%19 = load i16, i16* %17
store i16 %19, i16* %10
%20 = load i16*, i16** %7
%21 = getelementptr inbounds i16, i16* %20, i32 1
store i16* %21, i16** %7
%22 = load i16, i16* %20
store i16 %22, i16* %11
%23 = load i16, i16* %10
%24 = load i16*, i16** %5
%25 = getelementptr inbounds i16, i16* %24, i32 1
store i16* %25, i16** %5
store i16 %23, i16* %24
%26 = load i16, i16* %10
%27 = sext i16 %26 to i32
%28 = sdiv i32 %27, 2
%29 = load i16, i16* %11
%30 = sext i16 %29 to i32
%31 = sdiv i32 %30, 2
%32 = add nsw i32 %28, %31
%33 = trunc i32 %32 to i16
%34 = load i16*, i16** %5
%35 = getelementptr inbounds i16, i16* %34, i32 1
store i16* %35, i16** %5
store i16 %33, i16* %34
%36 = load i16, i16* %11
%37 = load i16*, i16** %5
%38 = getelementptr inbounds i16, i16* %37, i32 1
store i16* %38, i16** %5
store i16 %36, i16* %37
%39 = load i16*, i16** %5
%40 = getelementptr inbounds i16, i16* %39, i32 1
store i16* %40, i16** %5
store i16 0, i16* %39
%41 = load i16*, i16** %5
%42 = getelementptr inbounds i16, i16* %41, i32 1
store i16* %42, i16** %5
store i16 0, i16* %41
%43 = load i16*, i16** %5
%44 = getelementptr inbounds i16, i16* %43, i32 1
store i16* %44, i16** %5
store i16 0, i16* %43
br label %45
45: ; preds = %16
%46 = load i32, i32* %9
%47 = add nsw i32 %46, 1
store i32 %47, i32* %9
br label %12
48: ; preds = %12
ret void
}

LLVM IR (-O2):
define void @ac3_5p1_mux(i16* nocapture writeonly %0, i16* nocapture %1, i16* nocapture %2, i32 %3) {
%5 = icmp sgt i32 %3, 0
br i1 %5, label %6, label %81
6: ; preds = %4
%7 = add i32 %3, -1
%8 = zext i32 %7 to i64
%9 = add nuw nsw i64 %8, 1
%10 = icmp ult i32 %7, 7
br i1 %10, label %56, label %11
11: ; preds = %6
%12 = add i32 %3, -1
%13 = zext i32 %12 to i64
%14 = mul nuw nsw i64 %13, 6
%15 = add nuw nsw i64 %14, 6
%16 = getelementptr i16, i16* %0, i64 %15
%17 = add nuw nsw i64 %13, 1
%18 = getelementptr i16, i16* %1, i64 %17
%19 = getelementptr i16, i16* %2, i64 %17
%20 = icmp ugt i16* %18, %0
%21 = icmp ugt i16* %16, %1
%22 = and i1 %20, %21
%23 = icmp ugt i16* %19, %0
%24 = icmp ugt i16* %16, %2
%25 = and i1 %23, %24
%26 = or i1 %22, %25
br i1 %26, label %56, label %27
27: ; preds = %11
%28 = and i64 %9, 8589934584
%29 = mul nuw nsw i64 %28, 6
%30 = getelementptr i16, i16* %0, i64 %29
%31 = getelementptr i16, i16* %1, i64 %28
%32 = trunc i64 %28 to i32
%33 = getelementptr i16, i16* %2, i64 %28
br label %34
34: ; preds = %34, %27
%35 = phi i64 [ 0, %27 ], [ %52, %34 ]
%36 = mul i64 %35, 6
%37 = getelementptr i16, i16* %1, i64 %35
%38 = getelementptr i16, i16* %2, i64 %35
%39 = bitcast i16* %37 to <8 x i16>*
%40 = load <8 x i16>, <8 x i16>* %39
%41 = bitcast i16* %38 to <8 x i16>*
%42 = load <8 x i16>, <8 x i16>* %41
%43 = sdiv <8 x i16> %40, <i16 2, i16 2, i16 2, i16 2, i16 2, i16 2, i16 2, i16 2>
%44 = sdiv <8 x i16> %42, <i16 2, i16 2, i16 2, i16 2, i16 2, i16 2, i16 2, i16 2>
%45 = add nsw <8 x i16> %44, %43
%46 = getelementptr inbounds i16, i16* %0, i64 %36
%47 = bitcast i16* %46 to <48 x i16>*
%48 = shufflevector <8 x i16> %40, <8 x i16> %45, <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>
%49 = shufflevector <8 x i16> %42, <8 x i16> zeroinitializer, <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>
%50 = shufflevector <16 x i16> %48, <16 x i16> %49, <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>
%51 = shufflevector <32 x i16> %50, <32 x i16> <i16 0, i16 0, i16 0, i16 0, i16 0, i16 0, i16 0, i16 0, i16 0, i16 0, i16 0, i16 0, i16 0, i16 0, i16 0, i16 0, i16 poison, i16 poison, i16 poison, i16 poison, i16 poison, i16 poison, i16 poison, i16 poison, i16 poison, i16 poison, i16 poison, i16 poison, i16 poison, i16 poison, i16 poison, i16 poison>, <48 x i32> <i32 0, i32 8, i32 16, i32 24, i32 32, i32 40, i32 1, i32 9, i32 17, i32 25, i32 33, i32 41, i32 2, i32 10, i32 18, i32 26, i32 34, i32 42, i32 3, i32 11, i32 19, i32 27, i32 35, i32 43, i32 4, i32 12, i32 20, i32 28, i32 36, i32 44, i32 5, i32 13, i32 21, i32 29, i32 37, i32 45, i32 6, i32 14, i32 22, i32 30, i32 38, i32 46, i32 7, i32 15, i32 23, i32 31, i32 39, i32 47>
store <48 x i16> %51, <48 x i16>* %47
%52 = add nuw i64 %35, 8
%53 = icmp eq i64 %52, %28
br i1 %53, label %54, label %34
54: ; preds = %34
%55 = icmp eq i64 %9, %28
br i1 %55, label %81, label %56
56: ; preds = %11, %6, %54
%57 = phi i16* [ %0, %11 ], [ %0, %6 ], [ %30, %54 ]
%58 = phi i16* [ %1, %11 ], [ %1, %6 ], [ %31, %54 ]
%59 = phi i32 [ 0, %11 ], [ 0, %6 ], [ %32, %54 ]
%60 = phi i16* [ %2, %11 ], [ %2, %6 ], [ %33, %54 ]
br label %61
61: ; preds = %56, %61
%62 = phi i16* [ %78, %61 ], [ %57, %56 ]
%63 = phi i16* [ %66, %61 ], [ %58, %56 ]
%64 = phi i32 [ %79, %61 ], [ %59, %56 ]
%65 = phi i16* [ %68, %61 ], [ %60, %56 ]
%66 = getelementptr inbounds i16, i16* %63, i64 1
%67 = load i16, i16* %63
%68 = getelementptr inbounds i16, i16* %65, i64 1
%69 = load i16, i16* %65
%70 = getelementptr inbounds i16, i16* %62, i64 1
store i16 %67, i16* %62
%71 = sdiv i16 %67, 2
%72 = sdiv i16 %69, 2
%73 = add nsw i16 %72, %71
%74 = getelementptr inbounds i16, i16* %62, i64 2
store i16 %73, i16* %70
%75 = getelementptr inbounds i16, i16* %62, i64 3
store i16 %69, i16* %74
%76 = getelementptr inbounds i16, i16* %62, i64 4
store i16 0, i16* %75
%77 = getelementptr inbounds i16, i16* %62, i64 5
store i16 0, i16* %76
%78 = getelementptr inbounds i16, i16* %62, i64 6
store i16 0, i16* %77
%79 = add nuw nsw i32 %64, 1
%80 = icmp eq i32 %79, %3
br i1 %80, label %81, label %61
81: ; preds = %61, %54, %4
ret void
}