void vfoo16(unsigned short int *a) {
  int i = 0;
  for (i = 0; i < 128; ++i)
    a[i] = __builtin_bswap16(a[i]);
}


x86 assembly (clang, -O0):
<vfoo16>:
push   %rbp
mov    %rsp,%rbp
mov    %rdi,-0x8(%rbp)
movl   $0x0,-0xc(%rbp)
movl   $0x0,-0xc(%rbp)
cmpl   $0x80,-0xc(%rbp)
jge    114d <vfoo16+0x4d>
mov    -0x8(%rbp),%rax
movslq -0xc(%rbp),%rcx
mov    (%rax,%rcx,2),%dx
rol    $0x8,%dx
mov    -0x8(%rbp),%rax
movslq -0xc(%rbp),%rcx
mov    %dx,(%rax,%rcx,2)
mov    -0xc(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0xc(%rbp)
jmp    1116 <vfoo16+0x16>
pop    %rbp
ret

x86 assembly (clang, -O2):
<vfoo16>:
movdqu (%rdi),%xmm0
movdqu 0x10(%rdi),%xmm1
movdqu 0x20(%rdi),%xmm2
movdqu 0x30(%rdi),%xmm3
movdqa %xmm0,%xmm4
psrlw  $0x8,%xmm4
psllw  $0x8,%xmm0
por    %xmm4,%xmm0
movdqa %xmm1,%xmm4
psrlw  $0x8,%xmm4
psllw  $0x8,%xmm1
por    %xmm4,%xmm1
movdqu %xmm0,(%rdi)
movdqu %xmm1,0x10(%rdi)
movdqa %xmm2,%xmm0
psrlw  $0x8,%xmm0
psllw  $0x8,%xmm2
por    %xmm0,%xmm2
movdqa %xmm3,%xmm0
psrlw  $0x8,%xmm0
psllw  $0x8,%xmm3
por    %xmm0,%xmm3
movdqu %xmm2,0x20(%rdi)
movdqu %xmm3,0x30(%rdi)
movdqu 0x40(%rdi),%xmm0
movdqa %xmm0,%xmm1
psrlw  $0x8,%xmm1
psllw  $0x8,%xmm0
por    %xmm1,%xmm0
movdqu 0x50(%rdi),%xmm1
movdqa %xmm1,%xmm2
psrlw  $0x8,%xmm2
psllw  $0x8,%xmm1
por    %xmm2,%xmm1
movdqu %xmm0,0x40(%rdi)
movdqu %xmm1,0x50(%rdi)
movdqu 0x60(%rdi),%xmm0
movdqa %xmm0,%xmm1
psrlw  $0x8,%xmm1
psllw  $0x8,%xmm0
por    %xmm1,%xmm0
movdqu 0x70(%rdi),%xmm1
movdqa %xmm1,%xmm2
psrlw  $0x8,%xmm2
psllw  $0x8,%xmm1
por    %xmm2,%xmm1
movdqu %xmm0,0x60(%rdi)
movdqu %xmm1,0x70(%rdi)
movdqu 0x80(%rdi),%xmm0
movdqa %xmm0,%xmm1
psrlw  $0x8,%xmm1
psllw  $0x8,%xmm0
por    %xmm1,%xmm0
movdqu 0x90(%rdi),%xmm1
movdqa %xmm1,%xmm2
psrlw  $0x8,%xmm2
psllw  $0x8,%xmm1
por    %xmm2,%xmm1
movdqu %xmm0,0x80(%rdi)
movdqu %xmm1,0x90(%rdi)
movdqu 0xa0(%rdi),%xmm0
movdqu 0xb0(%rdi),%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,0xa0(%rdi)
movdqu %xmm1,0xb0(%rdi)
movdqu 0xc0(%rdi),%xmm0
movdqu 0xd0(%rdi),%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,0xc0(%rdi)
movdqu %xmm1,0xd0(%rdi)
movdqu 0xe0(%rdi),%xmm0
movdqu 0xf0(%rdi),%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,0xe0(%rdi)
movdqu %xmm1,0xf0(%rdi)
ret

LLVM IR (-O0):
define void @vfoo16(i16* %0) {
%2 = alloca i16*
%3 = alloca i32
store i16* %0, i16** %2
store i32 0, i32* %3
store i32 0, i32* %3
br label %4
4: ; preds = %18, %1
%5 = load i32, i32* %3
%6 = icmp slt i32 %5, 128
br i1 %6, label %7, label %21
7: ; preds = %4
%8 = load i16*, i16** %2
%9 = load i32, i32* %3
%10 = sext i32 %9 to i64
%11 = getelementptr inbounds i16, i16* %8, i64 %10
%12 = load i16, i16* %11
%13 = call i16 @llvm.bswap.i16(i16 %12)
%14 = load i16*, i16** %2
%15 = load i32, i32* %3
%16 = sext i32 %15 to i64
%17 = getelementptr inbounds i16, i16* %14, i64 %16
store i16 %13, i16* %17
br label %18
18: ; preds = %7
%19 = load i32, i32* %3
%20 = add nsw i32 %19, 1
store i32 %20, i32* %3
br label %4
21: ; preds = %4
ret void
}

LLVM IR (-O2):
define void @vfoo16(i16* nocapture %0) {
%2 = bitcast i16* %0 to <8 x i16>*
%3 = load <8 x i16>, <8 x i16>* %2
%4 = getelementptr inbounds i16, i16* %0, i64 8
%5 = bitcast i16* %4 to <8 x i16>*
%6 = load <8 x i16>, <8 x i16>* %5
%7 = call <8 x i16> @llvm.bswap.v8i16(<8 x i16> %3)
%8 = call <8 x i16> @llvm.bswap.v8i16(<8 x i16> %6)
%9 = bitcast i16* %0 to <8 x i16>*
store <8 x i16> %7, <8 x i16>* %9
%10 = bitcast i16* %4 to <8 x i16>*
store <8 x i16> %8, <8 x i16>* %10
%11 = getelementptr inbounds i16, i16* %0, i64 16
%12 = bitcast i16* %11 to <8 x i16>*
%13 = load <8 x i16>, <8 x i16>* %12
%14 = getelementptr inbounds i16, i16* %0, i64 24
%15 = bitcast i16* %14 to <8 x i16>*
%16 = load <8 x i16>, <8 x i16>* %15
%17 = call <8 x i16> @llvm.bswap.v8i16(<8 x i16> %13)
%18 = call <8 x i16> @llvm.bswap.v8i16(<8 x i16> %16)
%19 = bitcast i16* %11 to <8 x i16>*
store <8 x i16> %17, <8 x i16>* %19
%20 = bitcast i16* %14 to <8 x i16>*
store <8 x i16> %18, <8 x i16>* %20
%21 = getelementptr inbounds i16, i16* %0, i64 32
%22 = bitcast i16* %21 to <8 x i16>*
%23 = load <8 x i16>, <8 x i16>* %22
%24 = getelementptr inbounds i16, i16* %0, i64 40
%25 = bitcast i16* %24 to <8 x i16>*
%26 = load <8 x i16>, <8 x i16>* %25
%27 = call <8 x i16> @llvm.bswap.v8i16(<8 x i16> %23)
%28 = call <8 x i16> @llvm.bswap.v8i16(<8 x i16> %26)
%29 = bitcast i16* %21 to <8 x i16>*
store <8 x i16> %27, <8 x i16>* %29
%30 = bitcast i16* %24 to <8 x i16>*
store <8 x i16> %28, <8 x i16>* %30
%31 = getelementptr inbounds i16, i16* %0, i64 48
%32 = bitcast i16* %31 to <8 x i16>*
%33 = load <8 x i16>, <8 x i16>* %32
%34 = getelementptr inbounds i16, i16* %0, i64 56
%35 = bitcast i16* %34 to <8 x i16>*
%36 = load <8 x i16>, <8 x i16>* %35
%37 = call <8 x i16> @llvm.bswap.v8i16(<8 x i16> %33)
%38 = call <8 x i16> @llvm.bswap.v8i16(<8 x i16> %36)
%39 = bitcast i16* %31 to <8 x i16>*
store <8 x i16> %37, <8 x i16>* %39
%40 = bitcast i16* %34 to <8 x i16>*
store <8 x i16> %38, <8 x i16>* %40
%41 = getelementptr inbounds i16, i16* %0, i64 64
%42 = bitcast i16* %41 to <8 x i16>*
%43 = load <8 x i16>, <8 x i16>* %42
%44 = getelementptr inbounds i16, i16* %0, i64 72
%45 = bitcast i16* %44 to <8 x i16>*
%46 = load <8 x i16>, <8 x i16>* %45
%47 = call <8 x i16> @llvm.bswap.v8i16(<8 x i16> %43)
%48 = call <8 x i16> @llvm.bswap.v8i16(<8 x i16> %46)
%49 = bitcast i16* %41 to <8 x i16>*
store <8 x i16> %47, <8 x i16>* %49
%50 = bitcast i16* %44 to <8 x i16>*
store <8 x i16> %48, <8 x i16>* %50
%51 = getelementptr inbounds i16, i16* %0, i64 80
%52 = bitcast i16* %51 to <8 x i16>*
%53 = load <8 x i16>, <8 x i16>* %52
%54 = getelementptr inbounds i16, i16* %0, i64 88
%55 = bitcast i16* %54 to <8 x i16>*
%56 = load <8 x i16>, <8 x i16>* %55
%57 = call <8 x i16> @llvm.bswap.v8i16(<8 x i16> %53)
%58 = call <8 x i16> @llvm.bswap.v8i16(<8 x i16> %56)
%59 = bitcast i16* %51 to <8 x i16>*
store <8 x i16> %57, <8 x i16>* %59
%60 = bitcast i16* %54 to <8 x i16>*
store <8 x i16> %58, <8 x i16>* %60
%61 = getelementptr inbounds i16, i16* %0, i64 96
%62 = bitcast i16* %61 to <8 x i16>*
%63 = load <8 x i16>, <8 x i16>* %62
%64 = getelementptr inbounds i16, i16* %0, i64 104
%65 = bitcast i16* %64 to <8 x i16>*
%66 = load <8 x i16>, <8 x i16>* %65
%67 = call <8 x i16> @llvm.bswap.v8i16(<8 x i16> %63)
%68 = call <8 x i16> @llvm.bswap.v8i16(<8 x i16> %66)
%69 = bitcast i16* %61 to <8 x i16>*
store <8 x i16> %67, <8 x i16>* %69
%70 = bitcast i16* %64 to <8 x i16>*
store <8 x i16> %68, <8 x i16>* %70
%71 = getelementptr inbounds i16, i16* %0, i64 112
%72 = bitcast i16* %71 to <8 x i16>*
%73 = load <8 x i16>, <8 x i16>* %72
%74 = getelementptr inbounds i16, i16* %0, i64 120
%75 = bitcast i16* %74 to <8 x i16>*
%76 = load <8 x i16>, <8 x i16>* %75
%77 = call <8 x i16> @llvm.bswap.v8i16(<8 x i16> %73)
%78 = call <8 x i16> @llvm.bswap.v8i16(<8 x i16> %76)
%79 = bitcast i16* %71 to <8 x i16>*
store <8 x i16> %77, <8 x i16>* %79
%80 = bitcast i16* %74 to <8 x i16>*
store <8 x i16> %78, <8 x i16>* %80
ret void
}