void _swaps_buffer(short *s2, short *s1, int n) {
  register char *p, *q;
  short r[2];
  register short *s;
  p = (char *)s2;
  q = (char *)s1;
  if (p != q) {
    p += sizeof(short);
    for (n++; --n; p += 2 * sizeof(short)) {
      *--p = *q++;
      *--p = *q++;
    }
  } else {
    for (s = s2, n++; --n; *s++ = r[0]) {
      p = (char *)&r[1];
      *--p = *q++;
      *--p = *q++;
    }
  }
}


x86 assembly (clang, -O0):
<_swaps_buffer>:
push   %rbp
mov    %rsp,%rbp
mov    %rdi,-0x8(%rbp)
mov    %rsi,-0x10(%rbp)
mov    %edx,-0x14(%rbp)
mov    -0x8(%rbp),%rax
mov    %rax,-0x20(%rbp)
mov    -0x10(%rbp),%rax
mov    %rax,-0x28(%rbp)
mov    -0x20(%rbp),%rax
cmp    -0x28(%rbp),%rax
je     11b0 <_swaps_buffer+0xb0>
mov    -0x20(%rbp),%rax
add    $0x2,%rax
mov    %rax,-0x20(%rbp)
mov    -0x14(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x14(%rbp)
mov    -0x14(%rbp),%eax
add    $0xffffffff,%eax
mov    %eax,-0x14(%rbp)
cmp    $0x0,%eax
je     11ab <_swaps_buffer+0xab>
mov    -0x28(%rbp),%rax
mov    %rax,%rcx
add    $0x1,%rcx
mov    %rcx,-0x28(%rbp)
mov    (%rax),%cl
mov    -0x20(%rbp),%rax
mov    %rax,%rdx
add    $0xffffffffffffffff,%rdx
mov    %rdx,-0x20(%rbp)
mov    %cl,-0x1(%rax)
mov    -0x28(%rbp),%rax
mov    %rax,%rcx
add    $0x1,%rcx
mov    %rcx,-0x28(%rbp)
mov    (%rax),%cl
mov    -0x20(%rbp),%rax
mov    %rax,%rdx
add    $0xffffffffffffffff,%rdx
mov    %rdx,-0x20(%rbp)
mov    %cl,-0x1(%rax)
mov    -0x20(%rbp),%rax
add    $0x4,%rax
mov    %rax,-0x20(%rbp)
jmp    1142 <_swaps_buffer+0x42>
jmp    1245 <_swaps_buffer+0x145>
mov    -0x8(%rbp),%rax
mov    %rax,-0x38(%rbp)
mov    -0x14(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x14(%rbp)
mov    -0x14(%rbp),%eax
add    $0xffffffff,%eax
mov    %eax,-0x14(%rbp)
cmp    $0x0,%eax
je     1240 <_swaps_buffer+0x140>
lea    -0x2c(%rbp),%rax
add    $0x2,%rax
mov    %rax,-0x20(%rbp)
mov    -0x28(%rbp),%rax
mov    %rax,%rcx
add    $0x1,%rcx
mov    %rcx,-0x28(%rbp)
mov    (%rax),%cl
mov    -0x20(%rbp),%rax
mov    %rax,%rdx
add    $0xffffffffffffffff,%rdx
mov    %rdx,-0x20(%rbp)
mov    %cl,-0x1(%rax)
mov    -0x28(%rbp),%rax
mov    %rax,%rcx
add    $0x1,%rcx
mov    %rcx,-0x28(%rbp)
mov    (%rax),%cl
mov    -0x20(%rbp),%rax
mov    %rax,%rdx
add    $0xffffffffffffffff,%rdx
mov    %rdx,-0x20(%rbp)
mov    %cl,-0x1(%rax)
mov    -0x2c(%rbp),%cx
mov    -0x38(%rbp),%rax
mov    %rax,%rdx
add    $0x2,%rdx
mov    %rdx,-0x38(%rbp)
mov    %cx,(%rax)
jmp    11c1 <_swaps_buffer+0xc1>
jmp    1245 <_swaps_buffer+0x145>
pop    %rbp
ret

x86 assembly (clang, -O2):
<_swaps_buffer>:
cmp    %rsi,%rdi
je     11b0 <_swaps_buffer+0xb0>
test   %edx,%edx
je     122e <_swaps_buffer+0x12e>
add    $0x2,%rdi
lea    -0x1(%rdx),%r8d
test   $0x3,%dl
je     1150 <_swaps_buffer+0x50>
mov    %edx,%r9d
and    $0x3,%r9d
xor    %ecx,%ecx
nopw   0x0(%rax,%rax,1)
movzbl (%rsi),%eax
mov    %al,-0x1(%rdi)
movzbl 0x1(%rsi),%eax
add    $0x2,%rsi
mov    %al,-0x2(%rdi)
add    $0x2,%rdi
add    $0x1,%rcx
cmp    %ecx,%r9d
jne    1130 <_swaps_buffer+0x30>
sub    %ecx,%edx
cmp    $0x3,%r8d
jb     122e <_swaps_buffer+0x12e>
mov    %edx,%eax
xor    %ecx,%ecx
xchg   %ax,%ax
movzbl (%rsi,%rcx,2),%edx
mov    %dl,-0x1(%rdi,%rcx,2)
movzbl 0x1(%rsi,%rcx,2),%edx
mov    %dl,-0x2(%rdi,%rcx,2)
movzbl 0x2(%rsi,%rcx,2),%edx
mov    %dl,0x1(%rdi,%rcx,2)
movzbl 0x3(%rsi,%rcx,2),%edx
mov    %dl,(%rdi,%rcx,2)
movzbl 0x4(%rsi,%rcx,2),%edx
mov    %dl,0x3(%rdi,%rcx,2)
movzbl 0x5(%rsi,%rcx,2),%edx
mov    %dl,0x2(%rdi,%rcx,2)
movzbl 0x6(%rsi,%rcx,2),%edx
mov    %dl,0x5(%rdi,%rcx,2)
movzbl 0x7(%rsi,%rcx,2),%edx
mov    %dl,0x4(%rdi,%rcx,2)
add    $0x4,%rcx
cmp    %ecx,%eax
jne    1160 <_swaps_buffer+0x60>
jmp    122e <_swaps_buffer+0x12e>
test   %edx,%edx
je     122e <_swaps_buffer+0x12e>
lea    -0x1(%rdx),%eax
test   $0x3,%dl
je     11e2 <_swaps_buffer+0xe2>
mov    %edx,%edi
and    $0x3,%edi
xor    %ecx,%ecx
cs nopw 0x0(%rax,%rax,1)
nopl   (%rax)
rolw   $0x8,(%rsi)
add    $0x2,%rsi
add    $0x1,%rcx
cmp    %ecx,%edi
jne    11d0 <_swaps_buffer+0xd0>
sub    %ecx,%edx
cmp    $0x3,%eax
jb     122e <_swaps_buffer+0x12e>
mov    %edx,%eax
xor    %ecx,%ecx
nopl   0x0(%rax,%rax,1)
movzwl (%rsi,%rcx,2),%edx
rol    $0x8,%dx
mov    %dx,(%rsi,%rcx,2)
movzwl 0x2(%rsi,%rcx,2),%edx
rol    $0x8,%dx
mov    %dx,0x2(%rsi,%rcx,2)
movzwl 0x4(%rsi,%rcx,2),%edx
rol    $0x8,%dx
mov    %dx,0x4(%rsi,%rcx,2)
movzwl 0x6(%rsi,%rcx,2),%edx
rol    $0x8,%dx
mov    %dx,0x6(%rsi,%rcx,2)
add    $0x4,%rcx
cmp    %ecx,%eax
jne    11f0 <_swaps_buffer+0xf0>
ret

LLVM IR (-O0):
define void @_swaps_buffer(i16* %0, i16* %1, i32 %2) {
%4 = alloca i16*
%5 = alloca i16*
%6 = alloca i32
%7 = alloca i8*
%8 = alloca i8*
%9 = alloca [2 x i16]
%10 = alloca i16*
store i16* %0, i16** %4
store i16* %1, i16** %5
store i32 %2, i32* %6
%11 = load i16*, i16** %4
%12 = bitcast i16* %11 to i8*
store i8* %12, i8** %7
%13 = load i16*, i16** %5
%14 = bitcast i16* %13 to i8*
store i8* %14, i8** %8
%15 = load i8*, i8** %7
%16 = load i8*, i8** %8
%17 = icmp ne i8* %15, %16
br i1 %17, label %18, label %42
18: ; preds = %3
%19 = load i8*, i8** %7
%20 = getelementptr inbounds i8, i8* %19, i64 2
store i8* %20, i8** %7
%21 = load i32, i32* %6
%22 = add nsw i32 %21, 1
store i32 %22, i32* %6
br label %23
23: ; preds = %38, %18
%24 = load i32, i32* %6
%25 = add nsw i32 %24, -1
store i32 %25, i32* %6
%26 = icmp ne i32 %25, 0
br i1 %26, label %27, label %41
27: ; preds = %23
%28 = load i8*, i8** %8
%29 = getelementptr inbounds i8, i8* %28, i32 1
store i8* %29, i8** %8
%30 = load i8, i8* %28
%31 = load i8*, i8** %7
%32 = getelementptr inbounds i8, i8* %31, i32 -1
store i8* %32, i8** %7
store i8 %30, i8* %32
%33 = load i8*, i8** %8
%34 = getelementptr inbounds i8, i8* %33, i32 1
store i8* %34, i8** %8
%35 = load i8, i8* %33
%36 = load i8*, i8** %7
%37 = getelementptr inbounds i8, i8* %36, i32 -1
store i8* %37, i8** %7
store i8 %35, i8* %37
br label %38
38: ; preds = %27
%39 = load i8*, i8** %7
%40 = getelementptr inbounds i8, i8* %39, i64 4
store i8* %40, i8** %7
br label %23
41: ; preds = %23
br label %69
42: ; preds = %3
%43 = load i16*, i16** %4
store i16* %43, i16** %10
%44 = load i32, i32* %6
%45 = add nsw i32 %44, 1
store i32 %45, i32* %6
br label %46
46: ; preds = %63, %42
%47 = load i32, i32* %6
%48 = add nsw i32 %47, -1
store i32 %48, i32* %6
%49 = icmp ne i32 %48, 0
br i1 %49, label %50, label %68
50: ; preds = %46
%51 = getelementptr inbounds [2 x i16], [2 x i16]* %9, i64 0, i64 1
%52 = bitcast i16* %51 to i8*
store i8* %52, i8** %7
%53 = load i8*, i8** %8
%54 = getelementptr inbounds i8, i8* %53, i32 1
store i8* %54, i8** %8
%55 = load i8, i8* %53
%56 = load i8*, i8** %7
%57 = getelementptr inbounds i8, i8* %56, i32 -1
store i8* %57, i8** %7
store i8 %55, i8* %57
%58 = load i8*, i8** %8
%59 = getelementptr inbounds i8, i8* %58, i32 1
store i8* %59, i8** %8
%60 = load i8, i8* %58
%61 = load i8*, i8** %7
%62 = getelementptr inbounds i8, i8* %61, i32 -1
store i8* %62, i8** %7
store i8 %60, i8* %62
br label %63
63: ; preds = %50
%64 = getelementptr inbounds [2 x i16], [2 x i16]* %9, i64 0, i64 0
%65 = load i16, i16* %64
%66 = load i16*, i16** %10
%67 = getelementptr inbounds i16, i16* %66, i32 1
store i16* %67, i16** %10
store i16 %65, i16* %66
br label %46
68: ; preds = %46
br label %69
69: ; preds = %68, %41
ret void
}

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