void stereo_split(short *output1, short *output2, short *input, int n) {
  int i;
  for (i = 0; i < n; i++) {
    *output1++ = *input++;
    *output2++ = *input++;
  }
}


x86 assembly (clang, -O0):
<stereo_split>:
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    117c <stereo_split+0x7c>
mov    -0x18(%rbp),%rax
mov    %rax,%rcx
add    $0x2,%rcx
mov    %rcx,-0x18(%rbp)
mov    (%rax),%cx
mov    -0x8(%rbp),%rax
mov    %rax,%rdx
add    $0x2,%rdx
mov    %rdx,-0x8(%rbp)
mov    %cx,(%rax)
mov    -0x18(%rbp),%rax
mov    %rax,%rcx
add    $0x2,%rcx
mov    %rcx,-0x18(%rbp)
mov    (%rax),%cx
mov    -0x10(%rbp),%rax
mov    %rax,%rdx
add    $0x2,%rdx
mov    %rdx,-0x10(%rbp)
mov    %cx,(%rax)
mov    -0x20(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x20(%rbp)
jmp    111a <stereo_split+0x1a>
pop    %rbp
ret

x86 assembly (clang, -O2):
<stereo_split>:
push   %rbp
push   %r15
push   %r14
push   %r12
push   %rbx
test   %ecx,%ecx
jle    131e <stereo_split+0x21e>
lea    -0x1(%rcx),%r9d
xor    %r8d,%r8d
cmp    $0x3,%r9d
jae    11da <stereo_split+0xda>
mov    %ecx,%r10d
sub    %r8d,%r10d
mov    %r8d,%r9d
not    %r9d
add    %ecx,%r9d
and    $0x3,%r10d
je     1164 <stereo_split+0x64>
neg    %r10d
xor    %eax,%eax
nopl   0x0(%rax,%rax,1)
movzwl (%rdx),%ebp
mov    %bp,(%rdi)
add    $0x2,%rdi
movzwl 0x2(%rdx),%ebp
add    $0x4,%rdx
mov    %bp,(%rsi)
add    $0x2,%rsi
add    $0xffffffff,%eax
cmp    %eax,%r10d
jne    1140 <stereo_split+0x40>
sub    %eax,%r8d
cmp    $0x3,%r9d
jb     131e <stereo_split+0x21e>
sub    %r8d,%ecx
xor    %eax,%eax
cs nopw 0x0(%rax,%rax,1)
nopl   (%rax)
movzwl (%rdx,%rax,4),%ebp
mov    %bp,(%rdi,%rax,2)
movzwl 0x2(%rdx,%rax,4),%ebp
mov    %bp,(%rsi,%rax,2)
movzwl 0x4(%rdx,%rax,4),%ebp
mov    %bp,0x2(%rdi,%rax,2)
movzwl 0x6(%rdx,%rax,4),%ebp
mov    %bp,0x2(%rsi,%rax,2)
movzwl 0x8(%rdx,%rax,4),%ebp
mov    %bp,0x4(%rdi,%rax,2)
movzwl 0xa(%rdx,%rax,4),%ebp
mov    %bp,0x4(%rsi,%rax,2)
movzwl 0xc(%rdx,%rax,4),%ebp
mov    %bp,0x6(%rdi,%rax,2)
movzwl 0xe(%rdx,%rax,4),%ebp
mov    %bp,0x6(%rsi,%rax,2)
add    $0x4,%rax
cmp    %eax,%ecx
jne    1180 <stereo_split+0x80>
jmp    131e <stereo_split+0x21e>
lea    (%rsi,%r9,2),%rbx
add    $0x2,%rbx
cmp    %rdi,%rbx
seta   %r14b
lea    (%rdi,%r9,2),%rbp
add    $0x2,%rbp
cmp    %rsi,%rbp
seta   %r15b
lea    (%rdx,%r9,4),%rax
add    $0x4,%rax
cmp    %rdi,%rax
seta   %r12b
cmp    %rdx,%rbp
seta   %r11b
cmp    %rsi,%rax
seta   %r10b
cmp    %rdx,%rbx
seta   %bl
test   %r15b,%r14b
jne    1121 <stereo_split+0x21>
and    %r11b,%r12b
jne    1121 <stereo_split+0x21>
and    %bl,%r10b
jne    1121 <stereo_split+0x21>
add    $0x1,%r9
mov    %r9,%r8
and    $0xfffffffffffffffc,%r8
lea    -0x4(%r8),%rax
mov    %rax,%r10
shr    $0x2,%r10
add    $0x1,%r10
test   %rax,%rax
je     1338 <stereo_split+0x238>
mov    %r10,%r11
and    $0xfffffffffffffffe,%r11
xor    %eax,%eax
cs nopw 0x0(%rax,%rax,1)
nopl   0x0(%rax)
movdqu (%rdx,%rax,4),%xmm0
pshuflw $0xe8,%xmm0,%xmm1
pshufhw $0xe8,%xmm1,%xmm1
pshufd $0xe8,%xmm1,%xmm1
pshuflw $0xe7,%xmm0,%xmm0
pshufhw $0xe7,%xmm0,%xmm0
pshufd $0xe8,%xmm0,%xmm0
pshuflw $0xb1,%xmm0,%xmm0
movq   %xmm1,(%rdi,%rax,2)
movq   %xmm0,(%rsi,%rax,2)
movdqu 0x10(%rdx,%rax,4),%xmm0
pshuflw $0xe8,%xmm0,%xmm1
pshufhw $0xe8,%xmm1,%xmm1
pshufd $0xe8,%xmm1,%xmm1
pshuflw $0xe7,%xmm0,%xmm0
pshufhw $0xe7,%xmm0,%xmm0
pshufd $0xe8,%xmm0,%xmm0
pshuflw $0xb1,%xmm0,%xmm0
movq   %xmm1,0x8(%rdi,%rax,2)
movq   %xmm0,0x8(%rsi,%rax,2)
add    $0x8,%rax
add    $0xfffffffffffffffe,%r11
jne    1270 <stereo_split+0x170>
test   $0x1,%r10b
je     1319 <stereo_split+0x219>
movdqu (%rdx,%rax,4),%xmm0
pshuflw $0xe8,%xmm0,%xmm1
pshufhw $0xe8,%xmm1,%xmm1
pshufd $0xe8,%xmm1,%xmm1
pshuflw $0xe7,%xmm0,%xmm0
pshufhw $0xe7,%xmm0,%xmm0
pshufd $0xe8,%xmm0,%xmm0
pshuflw $0xb1,%xmm0,%xmm0
movq   %xmm1,(%rdi,%rax,2)
movq   %xmm0,(%rsi,%rax,2)
cmp    %r8,%r9
jne    1327 <stereo_split+0x227>
pop    %rbx
pop    %r12
pop    %r14
pop    %r15
pop    %rbp
ret
lea    (%rdi,%r8,2),%rdi
lea    (%rdx,%r8,4),%rdx
lea    (%rsi,%r8,2),%rsi
jmp    1121 <stereo_split+0x21>
xor    %eax,%eax
test   $0x1,%r10b
jne    12e7 <stereo_split+0x1e7>
jmp    1319 <stereo_split+0x219>

LLVM IR (-O0):
define void @stereo_split(i16* %0, i16* %1, i16* %2, i32 %3) {
%5 = alloca i16*
%6 = alloca i16*
%7 = alloca i16*
%8 = alloca i32
%9 = alloca i32
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 %10
10: ; preds = %25, %4
%11 = load i32, i32* %9
%12 = load i32, i32* %8
%13 = icmp slt i32 %11, %12
br i1 %13, label %14, label %28
14: ; preds = %10
%15 = load i16*, i16** %7
%16 = getelementptr inbounds i16, i16* %15, i32 1
store i16* %16, i16** %7
%17 = load i16, i16* %15
%18 = load i16*, i16** %5
%19 = getelementptr inbounds i16, i16* %18, i32 1
store i16* %19, i16** %5
store i16 %17, i16* %18
%20 = load i16*, i16** %7
%21 = getelementptr inbounds i16, i16* %20, i32 1
store i16* %21, i16** %7
%22 = load i16, i16* %20
%23 = load i16*, i16** %6
%24 = getelementptr inbounds i16, i16* %23, i32 1
store i16* %24, i16** %6
store i16 %22, i16* %23
br label %25
25: ; preds = %14
%26 = load i32, i32* %9
%27 = add nsw i32 %26, 1
store i32 %27, i32* %9
br label %10
28: ; preds = %10
ret void
}

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