void cvtshorts(buffer, n) register unsigned short buffer[];
register int n;
{
  register short i;
  register int nshorts = n >> 1;
  register unsigned short swrd;
  for (i = 0; i < nshorts; i++) {
    swrd = *buffer;
    *buffer++ = (swrd >> 8) | (swrd << 8);
  }
}


x86 assembly (clang, -O0):
<cvtshorts>:
push   %rbp
mov    %rsp,%rbp
mov    %rdi,-0x8(%rbp)
mov    %esi,-0xc(%rbp)
mov    -0xc(%rbp),%eax
sar    $0x1,%eax
mov    %eax,-0x14(%rbp)
movw   $0x0,-0xe(%rbp)
movswl -0xe(%rbp),%eax
cmp    -0x14(%rbp),%eax
jge    1168 <cvtshorts+0x68>
mov    -0x8(%rbp),%rax
mov    (%rax),%ax
mov    %ax,-0x16(%rbp)
movzwl -0x16(%rbp),%eax
sar    $0x8,%eax
movzwl -0x16(%rbp),%ecx
shl    $0x8,%ecx
or     %ecx,%eax
mov    %ax,%cx
mov    -0x8(%rbp),%rax
mov    %rax,%rdx
add    $0x2,%rdx
mov    %rdx,-0x8(%rbp)
mov    %cx,(%rax)
mov    -0xe(%rbp),%ax
add    $0x1,%ax
mov    %ax,-0xe(%rbp)
jmp    111a <cvtshorts+0x1a>
pop    %rbp
ret

x86 assembly (clang, -O2):
<cvtshorts>:
cmp    $0x2,%esi
jl     1142 <cvtshorts+0x42>
sar    %esi
cmp    $0x2,%esi
mov    $0x1,%ecx
mov    $0x1,%r8d
cmovge %esi,%r8d
add    $0xffffffff,%r8d
cmp    $0xf,%r8d
jae    1143 <cvtshorts+0x43>
xor    %eax,%eax
mov    %rdi,%rcx
add    $0x1,%eax
nopl   0x0(%rax,%rax,1)
rolw   $0x8,(%rcx)
add    $0x2,%rcx
movswl %ax,%edx
add    $0x1,%eax
cmp    %edx,%esi
jg     1130 <cvtshorts+0x30>
ret
cmp    $0x2,%esi
cmovge %esi,%ecx
add    $0xffffffff,%ecx
movzwl %cx,%edx
xor    %eax,%eax
cmp    $0x7ffe,%edx
ja     1125 <cvtshorts+0x25>
cmp    $0xffff,%ecx
ja     1125 <cvtshorts+0x25>
add    $0x1,%r8
mov    %r8,%rax
and    $0xfffffffffffffff0,%rax
lea    (%rdi,%rax,2),%rcx
xor    %edx,%edx
cs nopw 0x0(%rax,%rax,1)
nopl   0x0(%rax)
movdqu (%rdi,%rdx,2),%xmm0
movdqu 0x10(%rdi,%rdx,2),%xmm1
movdqa %xmm0,%xmm2
psrlw  $0x8,%xmm2
psllw  $0x8,%xmm0
por    %xmm2,%xmm0
movdqa %xmm1,%xmm2
psrlw  $0x8,%xmm2
psllw  $0x8,%xmm1
por    %xmm2,%xmm1
movdqu %xmm0,(%rdi,%rdx,2)
movdqu %xmm1,0x10(%rdi,%rdx,2)
add    $0x10,%rdx
cmp    %rdx,%rax
jne    1180 <cvtshorts+0x80>
cmp    %rax,%r8
je     1142 <cvtshorts+0x42>
jmp    1128 <cvtshorts+0x28>

LLVM IR (-O0):
define void @cvtshorts(i16* %0, i32 %1) {
%3 = alloca i16*
%4 = alloca i32
%5 = alloca i16
%6 = alloca i32
%7 = alloca i16
store i16* %0, i16** %3
store i32 %1, i32* %4
%8 = load i32, i32* %4
%9 = ashr i32 %8, 1
store i32 %9, i32* %6
store i16 0, i16* %5
br label %10
10: ; preds = %28, %2
%11 = load i16, i16* %5
%12 = sext i16 %11 to i32
%13 = load i32, i32* %6
%14 = icmp slt i32 %12, %13
br i1 %14, label %15, label %31
15: ; preds = %10
%16 = load i16*, i16** %3
%17 = load i16, i16* %16
store i16 %17, i16* %7
%18 = load i16, i16* %7
%19 = zext i16 %18 to i32
%20 = ashr i32 %19, 8
%21 = load i16, i16* %7
%22 = zext i16 %21 to i32
%23 = shl i32 %22, 8
%24 = or i32 %20, %23
%25 = trunc i32 %24 to i16
%26 = load i16*, i16** %3
%27 = getelementptr inbounds i16, i16* %26, i32 1
store i16* %27, i16** %3
store i16 %25, i16* %26
br label %28
28: ; preds = %15
%29 = load i16, i16* %5
%30 = add i16 %29, 1
store i16 %30, i16* %5
br label %10
31: ; preds = %10
ret void
}

LLVM IR (-O2):
define void @cvtshorts(i16* nocapture %0, i32 %1) {
%3 = ashr i32 %1, 1
%4 = icmp sgt i32 %1, 1
br i1 %4, label %5, label %50
5: ; preds = %2
%6 = call i32 @llvm.smax.i32(i32 %3, i32 1)
%7 = add nsw i32 %6, -1
%8 = zext i32 %7 to i64
%9 = add nuw nsw i64 %8, 1
%10 = icmp ult i32 %7, 15
br i1 %10, label %38, label %11
11: ; preds = %5
%12 = call i32 @llvm.smax.i32(i32 %3, i32 1)
%13 = add nsw i32 %12, -1
%14 = trunc i32 %13 to i16
%15 = icmp ugt i16 %14, 32766
%16 = icmp ugt i32 %13, 65535
%17 = or i1 %15, %16
br i1 %17, label %38, label %18
18: ; preds = %11
%19 = and i64 %9, 8589934576
%20 = getelementptr i16, i16* %0, i64 %19
%21 = trunc i64 %19 to i16
br label %22
22: ; preds = %22, %18
%23 = phi i64 [ 0, %18 ], [ %34, %22 ]
%24 = getelementptr i16, i16* %0, i64 %23
%25 = bitcast i16* %24 to <8 x i16>*
%26 = load <8 x i16>, <8 x i16>* %25
%27 = getelementptr i16, i16* %24, i64 8
%28 = bitcast i16* %27 to <8 x i16>*
%29 = load <8 x i16>, <8 x i16>* %28
%30 = call <8 x i16> @llvm.bswap.v8i16(<8 x i16> %26)
%31 = call <8 x i16> @llvm.bswap.v8i16(<8 x i16> %29)
%32 = bitcast i16* %24 to <8 x i16>*
store <8 x i16> %30, <8 x i16>* %32
%33 = bitcast i16* %27 to <8 x i16>*
store <8 x i16> %31, <8 x i16>* %33
%34 = add nuw i64 %23, 16
%35 = icmp eq i64 %34, %19
br i1 %35, label %36, label %22
36: ; preds = %22
%37 = icmp eq i64 %9, %19
br i1 %37, label %50, label %38
38: ; preds = %11, %5, %36
%39 = phi i16* [ %0, %11 ], [ %0, %5 ], [ %20, %36 ]
%40 = phi i16 [ 0, %11 ], [ 0, %5 ], [ %21, %36 ]
br label %41
41: ; preds = %38, %41
%42 = phi i16* [ %46, %41 ], [ %39, %38 ]
%43 = phi i16 [ %47, %41 ], [ %40, %38 ]
%44 = load i16, i16* %42
%45 = tail call i16 @llvm.bswap.i16(i16 %44)
%46 = getelementptr inbounds i16, i16* %42, i64 1
store i16 %45, i16* %42
%47 = add i16 %43, 1
%48 = sext i16 %47 to i32
%49 = icmp sgt i32 %3, %48
br i1 %49, label %41, label %50
50: ; preds = %41, %36, %2
ret void
}