void swapbytes(void *from, int size, int nitems) {
  int i, j;
  char *tmp1, tmp2[8];
  tmp1 = (char *)(from);
  if (size == 8) {
    for (i = 0; i < nitems; i++) {
      j = i * size;
      tmp2[0] = tmp1[j + 7];
      tmp2[1] = tmp1[j + 6];
      tmp2[2] = tmp1[j + 5];
      tmp2[3] = tmp1[j + 4];
      tmp2[4] = tmp1[j + 3];
      tmp2[5] = tmp1[j + 2];
      tmp2[6] = tmp1[j + 1];
      tmp2[7] = tmp1[j];
      tmp1[j] = tmp2[0];
      tmp1[j + 1] = tmp2[1];
      tmp1[j + 2] = tmp2[2];
      tmp1[j + 3] = tmp2[3];
      tmp1[j + 4] = tmp2[4];
      tmp1[j + 5] = tmp2[5];
      tmp1[j + 6] = tmp2[6];
      tmp1[j + 7] = tmp2[7];
    }
  }
  if (size == 4) {
    for (i = 0; i < nitems; i++) {
      j = i * size;
      tmp2[0] = tmp1[j + 3];
      tmp2[1] = tmp1[j + 2];
      tmp2[2] = tmp1[j + 1];
      tmp2[3] = tmp1[j];
      tmp1[j] = tmp2[0];
      tmp1[j + 1] = tmp2[1];
      tmp1[j + 2] = tmp2[2];
      tmp1[j + 3] = tmp2[3];
    }
  }
  if (size == 2) {
    for (i = 0; i < nitems; i++) {
      j = i * size;
      tmp2[0] = tmp1[j + 1];
      tmp2[1] = tmp1[j];
      tmp1[j] = tmp2[0];
      tmp1[j + 1] = tmp2[1];
    }
  }
}


x86 assembly (clang, -O0):
<swapbytes>:
push   %rbp
mov    %rsp,%rbp
mov    %rdi,-0x8(%rbp)
mov    %esi,-0xc(%rbp)
mov    %edx,-0x10(%rbp)
mov    -0x8(%rbp),%rax
mov    %rax,-0x20(%rbp)
cmpl   $0x8,-0xc(%rbp)
jne    1276 <swapbytes+0x176>
movl   $0x0,-0x14(%rbp)
mov    -0x14(%rbp),%eax
cmp    -0x10(%rbp),%eax
jge    1271 <swapbytes+0x171>
mov    -0x14(%rbp),%eax
imul   -0xc(%rbp),%eax
mov    %eax,-0x18(%rbp)
mov    -0x20(%rbp),%rax
mov    -0x18(%rbp),%ecx
add    $0x7,%ecx
movslq %ecx,%rcx
mov    (%rax,%rcx,1),%al
mov    %al,-0x28(%rbp)
mov    -0x20(%rbp),%rax
mov    -0x18(%rbp),%ecx
add    $0x6,%ecx
movslq %ecx,%rcx
mov    (%rax,%rcx,1),%al
mov    %al,-0x27(%rbp)
mov    -0x20(%rbp),%rax
mov    -0x18(%rbp),%ecx
add    $0x5,%ecx
movslq %ecx,%rcx
mov    (%rax,%rcx,1),%al
mov    %al,-0x26(%rbp)
mov    -0x20(%rbp),%rax
mov    -0x18(%rbp),%ecx
add    $0x4,%ecx
movslq %ecx,%rcx
mov    (%rax,%rcx,1),%al
mov    %al,-0x25(%rbp)
mov    -0x20(%rbp),%rax
mov    -0x18(%rbp),%ecx
add    $0x3,%ecx
movslq %ecx,%rcx
mov    (%rax,%rcx,1),%al
mov    %al,-0x24(%rbp)
mov    -0x20(%rbp),%rax
mov    -0x18(%rbp),%ecx
add    $0x2,%ecx
movslq %ecx,%rcx
mov    (%rax,%rcx,1),%al
mov    %al,-0x23(%rbp)
mov    -0x20(%rbp),%rax
mov    -0x18(%rbp),%ecx
add    $0x1,%ecx
movslq %ecx,%rcx
mov    (%rax,%rcx,1),%al
mov    %al,-0x22(%rbp)
mov    -0x20(%rbp),%rax
movslq -0x18(%rbp),%rcx
mov    (%rax,%rcx,1),%al
mov    %al,-0x21(%rbp)
mov    -0x28(%rbp),%dl
mov    -0x20(%rbp),%rax
movslq -0x18(%rbp),%rcx
mov    %dl,(%rax,%rcx,1)
mov    -0x27(%rbp),%dl
mov    -0x20(%rbp),%rax
mov    -0x18(%rbp),%ecx
add    $0x1,%ecx
movslq %ecx,%rcx
mov    %dl,(%rax,%rcx,1)
mov    -0x26(%rbp),%dl
mov    -0x20(%rbp),%rax
mov    -0x18(%rbp),%ecx
add    $0x2,%ecx
movslq %ecx,%rcx
mov    %dl,(%rax,%rcx,1)
mov    -0x25(%rbp),%dl
mov    -0x20(%rbp),%rax
mov    -0x18(%rbp),%ecx
add    $0x3,%ecx
movslq %ecx,%rcx
mov    %dl,(%rax,%rcx,1)
mov    -0x24(%rbp),%dl
mov    -0x20(%rbp),%rax
mov    -0x18(%rbp),%ecx
add    $0x4,%ecx
movslq %ecx,%rcx
mov    %dl,(%rax,%rcx,1)
mov    -0x23(%rbp),%dl
mov    -0x20(%rbp),%rax
mov    -0x18(%rbp),%ecx
add    $0x5,%ecx
movslq %ecx,%rcx
mov    %dl,(%rax,%rcx,1)
mov    -0x22(%rbp),%dl
mov    -0x20(%rbp),%rax
mov    -0x18(%rbp),%ecx
add    $0x6,%ecx
movslq %ecx,%rcx
mov    %dl,(%rax,%rcx,1)
mov    -0x21(%rbp),%dl
mov    -0x20(%rbp),%rax
mov    -0x18(%rbp),%ecx
add    $0x7,%ecx
movslq %ecx,%rcx
mov    %dl,(%rax,%rcx,1)
mov    -0x14(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x14(%rbp)
jmp    1127 <swapbytes+0x27>
jmp    1276 <swapbytes+0x176>
cmpl   $0x4,-0xc(%rbp)
jne    133e <swapbytes+0x23e>
movl   $0x0,-0x14(%rbp)
mov    -0x14(%rbp),%eax
cmp    -0x10(%rbp),%eax
jge    1339 <swapbytes+0x239>
mov    -0x14(%rbp),%eax
imul   -0xc(%rbp),%eax
mov    %eax,-0x18(%rbp)
mov    -0x20(%rbp),%rax
mov    -0x18(%rbp),%ecx
add    $0x3,%ecx
movslq %ecx,%rcx
mov    (%rax,%rcx,1),%al
mov    %al,-0x28(%rbp)
mov    -0x20(%rbp),%rax
mov    -0x18(%rbp),%ecx
add    $0x2,%ecx
movslq %ecx,%rcx
mov    (%rax,%rcx,1),%al
mov    %al,-0x27(%rbp)
mov    -0x20(%rbp),%rax
mov    -0x18(%rbp),%ecx
add    $0x1,%ecx
movslq %ecx,%rcx
mov    (%rax,%rcx,1),%al
mov    %al,-0x26(%rbp)
mov    -0x20(%rbp),%rax
movslq -0x18(%rbp),%rcx
mov    (%rax,%rcx,1),%al
mov    %al,-0x25(%rbp)
mov    -0x28(%rbp),%dl
mov    -0x20(%rbp),%rax
movslq -0x18(%rbp),%rcx
mov    %dl,(%rax,%rcx,1)
mov    -0x27(%rbp),%dl
mov    -0x20(%rbp),%rax
mov    -0x18(%rbp),%ecx
add    $0x1,%ecx
movslq %ecx,%rcx
mov    %dl,(%rax,%rcx,1)
mov    -0x26(%rbp),%dl
mov    -0x20(%rbp),%rax
mov    -0x18(%rbp),%ecx
add    $0x2,%ecx
movslq %ecx,%rcx
mov    %dl,(%rax,%rcx,1)
mov    -0x25(%rbp),%dl
mov    -0x20(%rbp),%rax
mov    -0x18(%rbp),%ecx
add    $0x3,%ecx
movslq %ecx,%rcx
mov    %dl,(%rax,%rcx,1)
mov    -0x14(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x14(%rbp)
jmp    1287 <swapbytes+0x187>
jmp    133e <swapbytes+0x23e>
cmpl   $0x2,-0xc(%rbp)
jne    13ba <swapbytes+0x2ba>
movl   $0x0,-0x14(%rbp)
mov    -0x14(%rbp),%eax
cmp    -0x10(%rbp),%eax
jge    13b5 <swapbytes+0x2b5>
mov    -0x14(%rbp),%eax
imul   -0xc(%rbp),%eax
mov    %eax,-0x18(%rbp)
mov    -0x20(%rbp),%rax
mov    -0x18(%rbp),%ecx
add    $0x1,%ecx
movslq %ecx,%rcx
mov    (%rax,%rcx,1),%al
mov    %al,-0x28(%rbp)
mov    -0x20(%rbp),%rax
movslq -0x18(%rbp),%rcx
mov    (%rax,%rcx,1),%al
mov    %al,-0x27(%rbp)
mov    -0x28(%rbp),%dl
mov    -0x20(%rbp),%rax
movslq -0x18(%rbp),%rcx
mov    %dl,(%rax,%rcx,1)
mov    -0x27(%rbp),%dl
mov    -0x20(%rbp),%rax
mov    -0x18(%rbp),%ecx
add    $0x1,%ecx
movslq %ecx,%rcx
mov    %dl,(%rax,%rcx,1)
mov    -0x14(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x14(%rbp)
jmp    134f <swapbytes+0x24f>
jmp    13ba <swapbytes+0x2ba>
pop    %rbp
ret

x86 assembly (clang, -O2):
<swapbytes>:
push   %rbp
push   %rbx
cmp    $0x2,%esi
je     11d4 <swapbytes+0xd4>
cmp    $0x4,%esi
je     118d <swapbytes+0x8d>
cmp    $0x8,%esi
jne    121c <swapbytes+0x11c>
test   %edx,%edx
jle    121c <swapbytes+0x11c>
mov    %edx,%esi
xor    %ecx,%ecx
cs nopw 0x0(%rax,%rax,1)
nop
movzbl 0x7(%rdi,%rcx,8),%edx
movzbl 0x6(%rdi,%rcx,8),%eax
movzbl 0x5(%rdi,%rcx,8),%r8d
movzbl 0x4(%rdi,%rcx,8),%r9d
movzbl 0x3(%rdi,%rcx,8),%r10d
movzbl 0x2(%rdi,%rcx,8),%r11d
movzbl (%rdi,%rcx,8),%ebp
movzbl 0x1(%rdi,%rcx,8),%ebx
mov    %dl,(%rdi,%rcx,8)
mov    %al,0x1(%rdi,%rcx,8)
mov    %r8b,0x2(%rdi,%rcx,8)
mov    %r9b,0x3(%rdi,%rcx,8)
mov    %r10b,0x4(%rdi,%rcx,8)
mov    %r11b,0x5(%rdi,%rcx,8)
mov    %bl,0x6(%rdi,%rcx,8)
mov    %bpl,0x7(%rdi,%rcx,8)
add    $0x1,%rcx
cmp    %rcx,%rsi
jne    1130 <swapbytes+0x30>
jmp    121c <swapbytes+0x11c>
test   %edx,%edx
jle    121c <swapbytes+0x11c>
mov    %edx,%ebp
xor    %ecx,%ecx
nopl   0x0(%rax)
movzbl 0x3(%rdi,%rcx,4),%ebx
movzbl 0x2(%rdi,%rcx,4),%r9d
movzbl (%rdi,%rcx,4),%r8d
movzbl 0x1(%rdi,%rcx,4),%eax
mov    %bl,(%rdi,%rcx,4)
mov    %r9b,0x1(%rdi,%rcx,4)
mov    %al,0x2(%rdi,%rcx,4)
mov    %r8b,0x3(%rdi,%rcx,4)
add    $0x1,%rcx
cmp    %rcx,%rbp
jne    11a0 <swapbytes+0xa0>
cmp    $0x2,%esi
jne    121c <swapbytes+0x11c>
test   %edx,%edx
jle    121c <swapbytes+0x11c>
mov    %edx,%eax
cmp    $0x1,%edx
jne    11e3 <swapbytes+0xe3>
xor    %ecx,%ecx
jmp    1205 <swapbytes+0x105>
mov    %eax,%edx
and    $0xfffffffe,%edx
xor    %ecx,%ecx
nopw   0x0(%rax,%rax,1)
rolw   $0x8,(%rdi,%rcx,1)
rolw   $0x8,0x2(%rdi,%rcx,1)
add    $0x4,%rcx
add    $0xfffffffffffffffe,%rdx
jne    11f0 <swapbytes+0xf0>
test   $0x1,%al
je     121c <swapbytes+0x11c>
mov    %rcx,%rax
or     $0x1,%rax
mov    (%rdi,%rax,1),%dl
mov    (%rdi,%rcx,1),%bl
mov    %dl,(%rdi,%rcx,1)
mov    %bl,(%rdi,%rax,1)
pop    %rbx
pop    %rbp
ret

LLVM IR (-O0):
define void @swapbytes(i8* %0, i32 %1, i32 %2) {
%4 = alloca i8*
%5 = alloca i32
%6 = alloca i32
%7 = alloca i32
%8 = alloca i32
%9 = alloca i8*
%10 = alloca [8 x i8]
store i8* %0, i8** %4
store i32 %1, i32* %5
store i32 %2, i32* %6
%11 = load i8*, i8** %4
store i8* %11, i8** %9
%12 = load i32, i32* %5
%13 = icmp eq i32 %12, 8
br i1 %13, label %14, label %137
14: ; preds = %3
store i32 0, i32* %7
br label %15
15: ; preds = %133, %14
%16 = load i32, i32* %7
%17 = load i32, i32* %6
%18 = icmp slt i32 %16, %17
br i1 %18, label %19, label %136
19: ; preds = %15
%20 = load i32, i32* %7
%21 = load i32, i32* %5
%22 = mul nsw i32 %20, %21
store i32 %22, i32* %8
%23 = load i8*, i8** %9
%24 = load i32, i32* %8
%25 = add nsw i32 %24, 7
%26 = sext i32 %25 to i64
%27 = getelementptr inbounds i8, i8* %23, i64 %26
%28 = load i8, i8* %27
%29 = getelementptr inbounds [8 x i8], [8 x i8]* %10, i64 0, i64 0
store i8 %28, i8* %29
%30 = load i8*, i8** %9
%31 = load i32, i32* %8
%32 = add nsw i32 %31, 6
%33 = sext i32 %32 to i64
%34 = getelementptr inbounds i8, i8* %30, i64 %33
%35 = load i8, i8* %34
%36 = getelementptr inbounds [8 x i8], [8 x i8]* %10, i64 0, i64 1
store i8 %35, i8* %36
%37 = load i8*, i8** %9
%38 = load i32, i32* %8
%39 = add nsw i32 %38, 5
%40 = sext i32 %39 to i64
%41 = getelementptr inbounds i8, i8* %37, i64 %40
%42 = load i8, i8* %41
%43 = getelementptr inbounds [8 x i8], [8 x i8]* %10, i64 0, i64 2
store i8 %42, i8* %43
%44 = load i8*, i8** %9
%45 = load i32, i32* %8
%46 = add nsw i32 %45, 4
%47 = sext i32 %46 to i64
%48 = getelementptr inbounds i8, i8* %44, i64 %47
%49 = load i8, i8* %48
%50 = getelementptr inbounds [8 x i8], [8 x i8]* %10, i64 0, i64 3
store i8 %49, i8* %50
%51 = load i8*, i8** %9
%52 = load i32, i32* %8
%53 = add nsw i32 %52, 3
%54 = sext i32 %53 to i64
%55 = getelementptr inbounds i8, i8* %51, i64 %54
%56 = load i8, i8* %55
%57 = getelementptr inbounds [8 x i8], [8 x i8]* %10, i64 0, i64 4
store i8 %56, i8* %57
%58 = load i8*, i8** %9
%59 = load i32, i32* %8
%60 = add nsw i32 %59, 2
%61 = sext i32 %60 to i64
%62 = getelementptr inbounds i8, i8* %58, i64 %61
%63 = load i8, i8* %62
%64 = getelementptr inbounds [8 x i8], [8 x i8]* %10, i64 0, i64 5
store i8 %63, i8* %64
%65 = load i8*, i8** %9
%66 = load i32, i32* %8
%67 = add nsw i32 %66, 1
%68 = sext i32 %67 to i64
%69 = getelementptr inbounds i8, i8* %65, i64 %68
%70 = load i8, i8* %69
%71 = getelementptr inbounds [8 x i8], [8 x i8]* %10, i64 0, i64 6
store i8 %70, i8* %71
%72 = load i8*, i8** %9
%73 = load i32, i32* %8
%74 = sext i32 %73 to i64
%75 = getelementptr inbounds i8, i8* %72, i64 %74
%76 = load i8, i8* %75
%77 = getelementptr inbounds [8 x i8], [8 x i8]* %10, i64 0, i64 7
store i8 %76, i8* %77
%78 = getelementptr inbounds [8 x i8], [8 x i8]* %10, i64 0, i64 0
%79 = load i8, i8* %78
%80 = load i8*, i8** %9
%81 = load i32, i32* %8
%82 = sext i32 %81 to i64
%83 = getelementptr inbounds i8, i8* %80, i64 %82
store i8 %79, i8* %83
%84 = getelementptr inbounds [8 x i8], [8 x i8]* %10, i64 0, i64 1
%85 = load i8, i8* %84
%86 = load i8*, i8** %9
%87 = load i32, i32* %8
%88 = add nsw i32 %87, 1
%89 = sext i32 %88 to i64
%90 = getelementptr inbounds i8, i8* %86, i64 %89
store i8 %85, i8* %90
%91 = getelementptr inbounds [8 x i8], [8 x i8]* %10, i64 0, i64 2
%92 = load i8, i8* %91
%93 = load i8*, i8** %9
%94 = load i32, i32* %8
%95 = add nsw i32 %94, 2
%96 = sext i32 %95 to i64
%97 = getelementptr inbounds i8, i8* %93, i64 %96
store i8 %92, i8* %97
%98 = getelementptr inbounds [8 x i8], [8 x i8]* %10, i64 0, i64 3
%99 = load i8, i8* %98
%100 = load i8*, i8** %9
%101 = load i32, i32* %8
%102 = add nsw i32 %101, 3
%103 = sext i32 %102 to i64
%104 = getelementptr inbounds i8, i8* %100, i64 %103
store i8 %99, i8* %104
%105 = getelementptr inbounds [8 x i8], [8 x i8]* %10, i64 0, i64 4
%106 = load i8, i8* %105
%107 = load i8*, i8** %9
%108 = load i32, i32* %8
%109 = add nsw i32 %108, 4
%110 = sext i32 %109 to i64
%111 = getelementptr inbounds i8, i8* %107, i64 %110
store i8 %106, i8* %111
%112 = getelementptr inbounds [8 x i8], [8 x i8]* %10, i64 0, i64 5
%113 = load i8, i8* %112
%114 = load i8*, i8** %9
%115 = load i32, i32* %8
%116 = add nsw i32 %115, 5
%117 = sext i32 %116 to i64
%118 = getelementptr inbounds i8, i8* %114, i64 %117
store i8 %113, i8* %118
%119 = getelementptr inbounds [8 x i8], [8 x i8]* %10, i64 0, i64 6
%120 = load i8, i8* %119
%121 = load i8*, i8** %9
%122 = load i32, i32* %8
%123 = add nsw i32 %122, 6
%124 = sext i32 %123 to i64
%125 = getelementptr inbounds i8, i8* %121, i64 %124
store i8 %120, i8* %125
%126 = getelementptr inbounds [8 x i8], [8 x i8]* %10, i64 0, i64 7
%127 = load i8, i8* %126
%128 = load i8*, i8** %9
%129 = load i32, i32* %8
%130 = add nsw i32 %129, 7
%131 = sext i32 %130 to i64
%132 = getelementptr inbounds i8, i8* %128, i64 %131
store i8 %127, i8* %132
br label %133
133: ; preds = %19
%134 = load i32, i32* %7
%135 = add nsw i32 %134, 1
store i32 %135, i32* %7
br label %15
136: ; preds = %15
br label %137
137: ; preds = %136, %3
%138 = load i32, i32* %5
%139 = icmp eq i32 %138, 4
br i1 %139, label %140, label %207
140: ; preds = %137
store i32 0, i32* %7
br label %141
141: ; preds = %203, %140
%142 = load i32, i32* %7
%143 = load i32, i32* %6
%144 = icmp slt i32 %142, %143
br i1 %144, label %145, label %206
145: ; preds = %141
%146 = load i32, i32* %7
%147 = load i32, i32* %5
%148 = mul nsw i32 %146, %147
store i32 %148, i32* %8
%149 = load i8*, i8** %9
%150 = load i32, i32* %8
%151 = add nsw i32 %150, 3
%152 = sext i32 %151 to i64
%153 = getelementptr inbounds i8, i8* %149, i64 %152
%154 = load i8, i8* %153
%155 = getelementptr inbounds [8 x i8], [8 x i8]* %10, i64 0, i64 0
store i8 %154, i8* %155
%156 = load i8*, i8** %9
%157 = load i32, i32* %8
%158 = add nsw i32 %157, 2
%159 = sext i32 %158 to i64
%160 = getelementptr inbounds i8, i8* %156, i64 %159
%161 = load i8, i8* %160
%162 = getelementptr inbounds [8 x i8], [8 x i8]* %10, i64 0, i64 1
store i8 %161, i8* %162
%163 = load i8*, i8** %9
%164 = load i32, i32* %8
%165 = add nsw i32 %164, 1
%166 = sext i32 %165 to i64
%167 = getelementptr inbounds i8, i8* %163, i64 %166
%168 = load i8, i8* %167
%169 = getelementptr inbounds [8 x i8], [8 x i8]* %10, i64 0, i64 2
store i8 %168, i8* %169
%170 = load i8*, i8** %9
%171 = load i32, i32* %8
%172 = sext i32 %171 to i64
%173 = getelementptr inbounds i8, i8* %170, i64 %172
%174 = load i8, i8* %173
%175 = getelementptr inbounds [8 x i8], [8 x i8]* %10, i64 0, i64 3
store i8 %174, i8* %175
%176 = getelementptr inbounds [8 x i8], [8 x i8]* %10, i64 0, i64 0
%177 = load i8, i8* %176
%178 = load i8*, i8** %9
%179 = load i32, i32* %8
%180 = sext i32 %179 to i64
%181 = getelementptr inbounds i8, i8* %178, i64 %180
store i8 %177, i8* %181
%182 = getelementptr inbounds [8 x i8], [8 x i8]* %10, i64 0, i64 1
%183 = load i8, i8* %182
%184 = load i8*, i8** %9
%185 = load i32, i32* %8
%186 = add nsw i32 %185, 1
%187 = sext i32 %186 to i64
%188 = getelementptr inbounds i8, i8* %184, i64 %187
store i8 %183, i8* %188
%189 = getelementptr inbounds [8 x i8], [8 x i8]* %10, i64 0, i64 2
%190 = load i8, i8* %189
%191 = load i8*, i8** %9
%192 = load i32, i32* %8
%193 = add nsw i32 %192, 2
%194 = sext i32 %193 to i64
%195 = getelementptr inbounds i8, i8* %191, i64 %194
store i8 %190, i8* %195
%196 = getelementptr inbounds [8 x i8], [8 x i8]* %10, i64 0, i64 3
%197 = load i8, i8* %196
%198 = load i8*, i8** %9
%199 = load i32, i32* %8
%200 = add nsw i32 %199, 3
%201 = sext i32 %200 to i64
%202 = getelementptr inbounds i8, i8* %198, i64 %201
store i8 %197, i8* %202
br label %203
203: ; preds = %145
%204 = load i32, i32* %7
%205 = add nsw i32 %204, 1
store i32 %205, i32* %7
br label %141
206: ; preds = %141
br label %207
207: ; preds = %206, %137
%208 = load i32, i32* %5
%209 = icmp eq i32 %208, 2
br i1 %209, label %210, label %249
210: ; preds = %207
store i32 0, i32* %7
br label %211
211: ; preds = %245, %210
%212 = load i32, i32* %7
%213 = load i32, i32* %6
%214 = icmp slt i32 %212, %213
br i1 %214, label %215, label %248
215: ; preds = %211
%216 = load i32, i32* %7
%217 = load i32, i32* %5
%218 = mul nsw i32 %216, %217
store i32 %218, i32* %8
%219 = load i8*, i8** %9
%220 = load i32, i32* %8
%221 = add nsw i32 %220, 1
%222 = sext i32 %221 to i64
%223 = getelementptr inbounds i8, i8* %219, i64 %222
%224 = load i8, i8* %223
%225 = getelementptr inbounds [8 x i8], [8 x i8]* %10, i64 0, i64 0
store i8 %224, i8* %225
%226 = load i8*, i8** %9
%227 = load i32, i32* %8
%228 = sext i32 %227 to i64
%229 = getelementptr inbounds i8, i8* %226, i64 %228
%230 = load i8, i8* %229
%231 = getelementptr inbounds [8 x i8], [8 x i8]* %10, i64 0, i64 1
store i8 %230, i8* %231
%232 = getelementptr inbounds [8 x i8], [8 x i8]* %10, i64 0, i64 0
%233 = load i8, i8* %232
%234 = load i8*, i8** %9
%235 = load i32, i32* %8
%236 = sext i32 %235 to i64
%237 = getelementptr inbounds i8, i8* %234, i64 %236
store i8 %233, i8* %237
%238 = getelementptr inbounds [8 x i8], [8 x i8]* %10, i64 0, i64 1
%239 = load i8, i8* %238
%240 = load i8*, i8** %9
%241 = load i32, i32* %8
%242 = add nsw i32 %241, 1
%243 = sext i32 %242 to i64
%244 = getelementptr inbounds i8, i8* %240, i64 %243
store i8 %239, i8* %244
br label %245
245: ; preds = %215
%246 = load i32, i32* %7
%247 = add nsw i32 %246, 1
store i32 %247, i32* %7
br label %211
248: ; preds = %211
br label %249
249: ; preds = %248, %207
ret void
}

LLVM IR (-O2):
define void @swapbytes(i8* nocapture %0, i32 %1, i32 %2) {
switch i32 %1, label %97 [
i32 8, label %4
i32 4, label %36
i32 2, label %59
]
4: ; preds = %3
%5 = icmp sgt i32 %2, 0
br i1 %5, label %6, label %97
6: ; preds = %4
%7 = zext i32 %2 to i64
br label %8
8: ; preds = %6, %8
%9 = phi i64 [ 0, %6 ], [ %34, %8 ]
%10 = shl nsw i64 %9, 3
%11 = or i64 %10, 7
%12 = getelementptr inbounds i8, i8* %0, i64 %11
%13 = load i8, i8* %12
%14 = or i64 %10, 6
%15 = getelementptr inbounds i8, i8* %0, i64 %14
%16 = load i8, i8* %15
%17 = or i64 %10, 5
%18 = getelementptr inbounds i8, i8* %0, i64 %17
%19 = load i8, i8* %18
%20 = or i64 %10, 4
%21 = getelementptr inbounds i8, i8* %0, i64 %20
%22 = load i8, i8* %21
%23 = or i64 %10, 3
%24 = getelementptr inbounds i8, i8* %0, i64 %23
%25 = load i8, i8* %24
%26 = or i64 %10, 2
%27 = getelementptr inbounds i8, i8* %0, i64 %26
%28 = load i8, i8* %27
%29 = or i64 %10, 1
%30 = getelementptr inbounds i8, i8* %0, i64 %29
%31 = load i8, i8* %30
%32 = getelementptr inbounds i8, i8* %0, i64 %10
%33 = load i8, i8* %32
store i8 %13, i8* %32
store i8 %16, i8* %30
store i8 %19, i8* %27
store i8 %22, i8* %24
store i8 %25, i8* %21
store i8 %28, i8* %18
store i8 %31, i8* %15
store i8 %33, i8* %12
%34 = add nuw nsw i64 %9, 1
%35 = icmp eq i64 %34, %7
br i1 %35, label %97, label %8
36: ; preds = %3
%37 = icmp sgt i32 %2, 0
br i1 %37, label %38, label %97
38: ; preds = %36
%39 = zext i32 %2 to i64
br label %40
40: ; preds = %38, %40
%41 = phi i64 [ 0, %38 ], [ %54, %40 ]
%42 = shl nsw i64 %41, 2
%43 = or i64 %42, 3
%44 = getelementptr inbounds i8, i8* %0, i64 %43
%45 = load i8, i8* %44
%46 = or i64 %42, 2
%47 = getelementptr inbounds i8, i8* %0, i64 %46
%48 = load i8, i8* %47
%49 = or i64 %42, 1
%50 = getelementptr inbounds i8, i8* %0, i64 %49
%51 = load i8, i8* %50
%52 = getelementptr inbounds i8, i8* %0, i64 %42
%53 = load i8, i8* %52
store i8 %45, i8* %52
store i8 %48, i8* %50
store i8 %51, i8* %47
store i8 %53, i8* %44
%54 = add nuw nsw i64 %41, 1
%55 = icmp eq i64 %54, %39
br i1 %55, label %56, label %40
56: ; preds = %40
%57 = icmp eq i32 %1, 2
%58 = and i1 %57, %37
br i1 %58, label %61, label %97
59: ; preds = %3
%60 = icmp sgt i32 %2, 0
br i1 %60, label %61, label %97
61: ; preds = %59, %56
%62 = zext i32 %2 to i64
%63 = and i64 %62, 1
%64 = icmp eq i32 %2, 1
br i1 %64, label %88, label %65
65: ; preds = %61
%66 = and i64 %62, 4294967294
br label %67
67: ; preds = %67, %65
%68 = phi i64 [ 0, %65 ], [ %83, %67 ]
%69 = phi i64 [ 0, %65 ], [ %84, %67 ]
%70 = shl nuw nsw i64 %68, 1
%71 = or i64 %70, 1
%72 = getelementptr inbounds i8, i8* %0, i64 %71
%73 = load i8, i8* %72
%74 = getelementptr inbounds i8, i8* %0, i64 %70
%75 = load i8, i8* %74
store i8 %73, i8* %74
store i8 %75, i8* %72
%76 = shl nuw i64 %68, 1
%77 = or i64 %76, 2
%78 = or i64 %76, 3
%79 = getelementptr inbounds i8, i8* %0, i64 %78
%80 = load i8, i8* %79
%81 = getelementptr inbounds i8, i8* %0, i64 %77
%82 = load i8, i8* %81
store i8 %80, i8* %81
store i8 %82, i8* %79
%83 = add nuw nsw i64 %68, 2
%84 = add nuw i64 %69, 2
%85 = icmp eq i64 %84, %66
br i1 %85, label %86, label %67
86: ; preds = %67
%87 = shl nuw i64 %83, 1
br label %88
88: ; preds = %86, %61
%89 = phi i64 [ 0, %61 ], [ %87, %86 ]
%90 = icmp eq i64 %63, 0
br i1 %90, label %97, label %91
91: ; preds = %88
%92 = or i64 %89, 1
%93 = getelementptr inbounds i8, i8* %0, i64 %92
%94 = load i8, i8* %93
%95 = getelementptr inbounds i8, i8* %0, i64 %89
%96 = load i8, i8* %95
store i8 %94, i8* %95
store i8 %96, i8* %93
br label %97
97: ; preds = %91, %88, %8, %36, %4, %59, %3, %56
ret void
}