void MonoTo2I_16(const short *src, short *dst, short n) {
  short ii;
  src += n - 1;
  dst += (n * 2) - 1;
  for (ii = n; ii != 0; ii--) {
    *dst-- = *src;
    *dst-- = *src--;
  }
  return;
}


x86 assembly (clang, -O0):
<MonoTo2I_16>:
push   %rbp
mov    %rsp,%rbp
mov    %dx,%ax
mov    %rdi,-0x8(%rbp)
mov    %rsi,-0x10(%rbp)
mov    %ax,-0x12(%rbp)
movswl -0x12(%rbp),%ecx
sub    $0x1,%ecx
mov    -0x8(%rbp),%rax
movslq %ecx,%rcx
shl    $0x1,%rcx
add    %rcx,%rax
mov    %rax,-0x8(%rbp)
movswl -0x12(%rbp),%ecx
shl    $0x1,%ecx
sub    $0x1,%ecx
mov    -0x10(%rbp),%rax
movslq %ecx,%rcx
shl    $0x1,%rcx
add    %rcx,%rax
mov    %rax,-0x10(%rbp)
mov    -0x12(%rbp),%ax
mov    %ax,-0x14(%rbp)
movswl -0x14(%rbp),%eax
cmp    $0x0,%eax
je     11ab <MonoTo2I_16+0xab>
mov    -0x8(%rbp),%rax
mov    (%rax),%cx
mov    -0x10(%rbp),%rax
mov    %rax,%rdx
add    $0xfffffffffffffffe,%rdx
mov    %rdx,-0x10(%rbp)
mov    %cx,(%rax)
mov    -0x8(%rbp),%rax
mov    %rax,%rcx
add    $0xfffffffffffffffe,%rcx
mov    %rcx,-0x8(%rbp)
mov    (%rax),%cx
mov    -0x10(%rbp),%rax
mov    %rax,%rdx
add    $0xfffffffffffffffe,%rdx
mov    %rdx,-0x10(%rbp)
mov    %cx,(%rax)
mov    -0x14(%rbp),%ax
add    $0xffff,%ax
mov    %ax,-0x14(%rbp)
jmp    1150 <MonoTo2I_16+0x50>
pop    %rbp
ret

x86 assembly (clang, -O2):
<MonoTo2I_16>:
push   %r14
push   %rbx
test   %dx,%dx
je     12a2 <MonoTo2I_16+0x1a2>
lea    (%rdx,%rdx,1),%eax
movslq %eax,%r14
lea    (%rsi,%r14,2),%r8
add    $0xfffffffffffffffe,%r8
movslq %edx,%r9
lea    (%rdi,%r9,2),%rax
add    $0xfffffffffffffffe,%rax
lea    -0x1(%rdx),%r10d
cmp    $0x7,%r10w
jb     117c <MonoTo2I_16+0x7c>
add    $0xffffffffffffffff,%r14
add    $0xffffffffffffffff,%r9
lea    -0x1(%rdx),%ebx
movzwl %bx,%r11d
mov    %r14,%rcx
sub    %r11,%rcx
sub    %r11,%rcx
lea    (%rsi,%rcx,2),%rcx
add    $0xfffffffffffffffe,%rcx
lea    (%rdi,%r9,2),%rbx
add    $0x2,%rbx
cmp    %rbx,%rcx
jae    1228 <MonoTo2I_16+0x128>
lea    (%rsi,%r14,2),%rcx
add    $0x2,%rcx
mov    %r9,%rsi
sub    %r11,%rsi
lea    (%rdi,%rsi,2),%rsi
cmp    %rcx,%rsi
jae    1228 <MonoTo2I_16+0x128>
mov    %r8,%rcx
lea    -0x1(%rdx),%r8d
mov    %edx,%esi
and    $0x3,%si
je     11af <MonoTo2I_16+0xaf>
xor    %edi,%edi
nopl   (%rax)
movzwl (%rax),%ebx
mov    %bx,(%rcx)
movzwl (%rax),%ebx
add    $0xfffffffffffffffe,%rax
mov    %bx,-0x2(%rcx)
add    $0xfffffffffffffffc,%rcx
add    $0x1,%edi
cmp    %di,%si
jne    1190 <MonoTo2I_16+0x90>
sub    %edi,%edx
cmp    $0x3,%r8w
jb     12a2 <MonoTo2I_16+0x1a2>
neg    %edx
movzwl %dx,%edx
xor    %esi,%esi
cs nopw 0x0(%rax,%rax,1)
nopl   0x0(%rax,%rax,1)
movzwl (%rax,%rsi,2),%edi
mov    %di,(%rcx,%rsi,4)
movzwl (%rax,%rsi,2),%edi
mov    %di,-0x2(%rcx,%rsi,4)
movzwl -0x2(%rax,%rsi,2),%edi
mov    %di,-0x4(%rcx,%rsi,4)
movzwl -0x2(%rax,%rsi,2),%edi
mov    %di,-0x6(%rcx,%rsi,4)
movzwl -0x4(%rax,%rsi,2),%edi
mov    %di,-0x8(%rcx,%rsi,4)
movzwl -0x4(%rax,%rsi,2),%edi
mov    %di,-0xa(%rcx,%rsi,4)
movzwl -0x6(%rax,%rsi,2),%edi
mov    %di,-0xc(%rcx,%rsi,4)
movzwl -0x6(%rax,%rsi,2),%edi
mov    %di,-0xe(%rcx,%rsi,4)
add    $0xfffffffffffffffc,%rsi
cmp    %si,%dx
jne    11d0 <MonoTo2I_16+0xd0>
jmp    12a2 <MonoTo2I_16+0x1a2>
movzwl %r10w,%r10d
add    $0x1,%r10
mov    %r10d,%r11d
and    $0xfffffff8,%r11d
sub    %r11d,%edx
mov    %r11,%rbx
neg    %rbx
sub    %r11,%rax
sub    %r11,%rax
lea    0x0(,%r11,4),%rsi
mov    %r8,%rcx
sub    %rsi,%rcx
add    $0xfffffffffffffff2,%r8
lea    (%rdi,%r9,2),%rdi
add    $0xfffffffffffffffa,%rdi
xor    %esi,%esi
cs nopw 0x0(%rax,%rax,1)
nopl   0x0(%rax)
movq   (%rdi,%rsi,2),%xmm0
movq   -0x8(%rdi,%rsi,2),%xmm1
punpcklwd %xmm0,%xmm0
movdqu %xmm0,(%r8,%rsi,4)
punpcklwd %xmm1,%xmm1
movdqu %xmm1,-0x10(%r8,%rsi,4)
add    $0xfffffffffffffff8,%rsi
cmp    %rsi,%rbx
jne    1270 <MonoTo2I_16+0x170>
cmp    %r11,%r10
jne    117f <MonoTo2I_16+0x7f>
pop    %rbx
pop    %r14
ret

LLVM IR (-O0):
define void @MonoTo2I_16(i16* %0, i16* %1, i16 signext %2) {
%4 = alloca i16*
%5 = alloca i16*
%6 = alloca i16
%7 = alloca i16
store i16* %0, i16** %4
store i16* %1, i16** %5
store i16 %2, i16* %6
%8 = load i16, i16* %6
%9 = sext i16 %8 to i32
%10 = sub nsw i32 %9, 1
%11 = load i16*, i16** %4
%12 = sext i32 %10 to i64
%13 = getelementptr inbounds i16, i16* %11, i64 %12
store i16* %13, i16** %4
%14 = load i16, i16* %6
%15 = sext i16 %14 to i32
%16 = mul nsw i32 %15, 2
%17 = sub nsw i32 %16, 1
%18 = load i16*, i16** %5
%19 = sext i32 %17 to i64
%20 = getelementptr inbounds i16, i16* %18, i64 %19
store i16* %20, i16** %5
%21 = load i16, i16* %6
store i16 %21, i16* %7
br label %22
22: ; preds = %36, %3
%23 = load i16, i16* %7
%24 = sext i16 %23 to i32
%25 = icmp ne i32 %24, 0
br i1 %25, label %26, label %39
26: ; preds = %22
%27 = load i16*, i16** %4
%28 = load i16, i16* %27
%29 = load i16*, i16** %5
%30 = getelementptr inbounds i16, i16* %29, i32 -1
store i16* %30, i16** %5
store i16 %28, i16* %29
%31 = load i16*, i16** %4
%32 = getelementptr inbounds i16, i16* %31, i32 -1
store i16* %32, i16** %4
%33 = load i16, i16* %31
%34 = load i16*, i16** %5
%35 = getelementptr inbounds i16, i16* %34, i32 -1
store i16* %35, i16** %5
store i16 %33, i16* %34
br label %36
36: ; preds = %26
%37 = load i16, i16* %7
%38 = add i16 %37, -1
store i16 %38, i16* %7
br label %22
39: ; preds = %22
ret void
}

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