int swap_bytes(int wordsize, unsigned char *buffer, long len) {
  register unsigned char byte1, byte2, byte3, byte4;
  register unsigned char *buffer1 = buffer;
  register unsigned char *buffer2 = buffer + 1;
  register unsigned char *buffer3 = buffer + 2;
  register unsigned char *buffer4 = buffer + 3;
  register long i = 0;
  switch (wordsize) {
  case 1:
    return 0;
  case 2:
    len -= 8;
    while (i < len) {
      byte1 = buffer1[i];
      byte2 = buffer2[i];
      buffer1[i] = byte2;
      buffer2[i] = byte1;
      i += 2;
      byte1 = buffer1[i];
      byte2 = buffer2[i];
      buffer1[i] = byte2;
      buffer2[i] = byte1;
      i += 2;
      byte1 = buffer1[i];
      byte2 = buffer2[i];
      buffer1[i] = byte2;
      buffer2[i] = byte1;
      i += 2;
      byte1 = buffer1[i];
      byte2 = buffer2[i];
      buffer1[i] = byte2;
      buffer2[i] = byte1;
      i += 2;
    }
    len += 8;
    while (i < len) {
      byte1 = buffer1[i];
      byte2 = buffer2[i];
      buffer1[i] = byte2;
      buffer2[i] = byte1;
      i += 2;
    }
    return 0;
  case 3:
    len -= 12;
    while (i < len) {
      byte1 = buffer1[i];
      byte2 = buffer2[i];
      byte3 = buffer3[i];
      buffer1[i] = byte3;
      buffer2[i] = byte2;
      buffer3[i] = byte1;
      i += 3;
      byte1 = buffer1[i];
      byte2 = buffer2[i];
      byte3 = buffer3[i];
      buffer1[i] = byte3;
      buffer2[i] = byte2;
      buffer3[i] = byte1;
      i += 3;
      byte1 = buffer1[i];
      byte2 = buffer2[i];
      byte3 = buffer3[i];
      buffer1[i] = byte3;
      buffer2[i] = byte2;
      buffer3[i] = byte1;
      i += 3;
      byte1 = buffer1[i];
      byte2 = buffer2[i];
      byte3 = buffer3[i];
      buffer1[i] = byte3;
      buffer2[i] = byte2;
      buffer3[i] = byte1;
      i += 3;
    }
    len += 12;
    while (i < len) {
      byte1 = buffer1[i];
      byte2 = buffer2[i];
      byte3 = buffer3[i];
      buffer1[i] = byte3;
      buffer2[i] = byte2;
      buffer3[i] = byte1;
      i += 3;
    }
    return 0;
  case 4:
    len -= 16;
    while (i < len) {
      byte1 = buffer1[i];
      byte2 = buffer2[i];
      byte3 = buffer3[i];
      byte4 = buffer4[i];
      buffer1[i] = byte4;
      buffer2[i] = byte1;
      buffer3[i] = byte2;
      buffer4[i] = byte3;
      i += 4;
      byte1 = buffer1[i];
      byte2 = buffer2[i];
      byte3 = buffer3[i];
      byte4 = buffer4[i];
      buffer1[i] = byte4;
      buffer2[i] = byte1;
      buffer3[i] = byte2;
      buffer4[i] = byte3;
      i += 4;
      byte1 = buffer1[i];
      byte2 = buffer2[i];
      byte3 = buffer3[i];
      byte4 = buffer4[i];
      buffer1[i] = byte4;
      buffer2[i] = byte1;
      buffer3[i] = byte2;
      buffer4[i] = byte3;
      i += 4;
      byte1 = buffer1[i];
      byte2 = buffer2[i];
      byte3 = buffer3[i];
      byte4 = buffer4[i];
      buffer1[i] = byte4;
      buffer2[i] = byte1;
      buffer3[i] = byte2;
      buffer4[i] = byte3;
      i += 4;
    }
    len += 16;
    while (i < len) {
      byte1 = buffer1[i];
      byte2 = buffer2[i];
      byte3 = buffer3[i];
      byte4 = buffer4[i];
      buffer1[i] = byte4;
      buffer2[i] = byte1;
      buffer3[i] = byte2;
      buffer4[i] = byte3;
      i += 4;
    }
    return 0;
  }
  return 1;
}


x86 assembly (clang, -O0):
<swap_bytes>:
push   %rbp
mov    %rsp,%rbp
mov    %edi,-0x8(%rbp)
mov    %rsi,-0x10(%rbp)
mov    %rdx,-0x18(%rbp)
mov    -0x10(%rbp),%rax
mov    %rax,-0x28(%rbp)
mov    -0x10(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x30(%rbp)
mov    -0x10(%rbp),%rax
add    $0x2,%rax
mov    %rax,-0x38(%rbp)
mov    -0x10(%rbp),%rax
add    $0x3,%rax
mov    %rax,-0x40(%rbp)
movq   $0x0,-0x48(%rbp)
mov    -0x8(%rbp),%eax
add    $0xffffffff,%eax
mov    %eax,%ecx
mov    %rcx,-0x50(%rbp)
sub    $0x3,%eax
ja     17f6 <swap_bytes+0x6f6>
mov    -0x50(%rbp),%rax
lea    0xe9d(%rip),%rcx
movslq (%rcx,%rax,4),%rax
add    %rcx,%rax
jmp    *%rax
movl   $0x0,-0x4(%rbp)
jmp    17fd <swap_bytes+0x6fd>
mov    -0x18(%rbp),%rax
sub    $0x8,%rax
mov    %rax,-0x18(%rbp)
mov    -0x48(%rbp),%rax
cmp    -0x18(%rbp),%rax
jge    12a7 <swap_bytes+0x1a7>
mov    -0x28(%rbp),%rax
mov    -0x48(%rbp),%rcx
mov    (%rax,%rcx,1),%al
mov    %al,-0x19(%rbp)
mov    -0x30(%rbp),%rax
mov    -0x48(%rbp),%rcx
mov    (%rax,%rcx,1),%al
mov    %al,-0x1a(%rbp)
mov    -0x1a(%rbp),%dl
mov    -0x28(%rbp),%rax
mov    -0x48(%rbp),%rcx
mov    %dl,(%rax,%rcx,1)
mov    -0x19(%rbp),%dl
mov    -0x30(%rbp),%rax
mov    -0x48(%rbp),%rcx
mov    %dl,(%rax,%rcx,1)
mov    -0x48(%rbp),%rax
add    $0x2,%rax
mov    %rax,-0x48(%rbp)
mov    -0x28(%rbp),%rax
mov    -0x48(%rbp),%rcx
mov    (%rax,%rcx,1),%al
mov    %al,-0x19(%rbp)
mov    -0x30(%rbp),%rax
mov    -0x48(%rbp),%rcx
mov    (%rax,%rcx,1),%al
mov    %al,-0x1a(%rbp)
mov    -0x1a(%rbp),%dl
mov    -0x28(%rbp),%rax
mov    -0x48(%rbp),%rcx
mov    %dl,(%rax,%rcx,1)
mov    -0x19(%rbp),%dl
mov    -0x30(%rbp),%rax
mov    -0x48(%rbp),%rcx
mov    %dl,(%rax,%rcx,1)
mov    -0x48(%rbp),%rax
add    $0x2,%rax
mov    %rax,-0x48(%rbp)
mov    -0x28(%rbp),%rax
mov    -0x48(%rbp),%rcx
mov    (%rax,%rcx,1),%al
mov    %al,-0x19(%rbp)
mov    -0x30(%rbp),%rax
mov    -0x48(%rbp),%rcx
mov    (%rax,%rcx,1),%al
mov    %al,-0x1a(%rbp)
mov    -0x1a(%rbp),%dl
mov    -0x28(%rbp),%rax
mov    -0x48(%rbp),%rcx
mov    %dl,(%rax,%rcx,1)
mov    -0x19(%rbp),%dl
mov    -0x30(%rbp),%rax
mov    -0x48(%rbp),%rcx
mov    %dl,(%rax,%rcx,1)
mov    -0x48(%rbp),%rax
add    $0x2,%rax
mov    %rax,-0x48(%rbp)
mov    -0x28(%rbp),%rax
mov    -0x48(%rbp),%rcx
mov    (%rax,%rcx,1),%al
mov    %al,-0x19(%rbp)
mov    -0x30(%rbp),%rax
mov    -0x48(%rbp),%rcx
mov    (%rax,%rcx,1),%al
mov    %al,-0x1a(%rbp)
mov    -0x1a(%rbp),%dl
mov    -0x28(%rbp),%rax
mov    -0x48(%rbp),%rcx
mov    %dl,(%rax,%rcx,1)
mov    -0x19(%rbp),%dl
mov    -0x30(%rbp),%rax
mov    -0x48(%rbp),%rcx
mov    %dl,(%rax,%rcx,1)
mov    -0x48(%rbp),%rax
add    $0x2,%rax
mov    %rax,-0x48(%rbp)
jmp    1184 <swap_bytes+0x84>
mov    -0x18(%rbp),%rax
add    $0x8,%rax
mov    %rax,-0x18(%rbp)
mov    -0x48(%rbp),%rax
cmp    -0x18(%rbp),%rax
jge    130a <swap_bytes+0x20a>
mov    -0x28(%rbp),%rax
mov    -0x48(%rbp),%rcx
mov    (%rax,%rcx,1),%al
mov    %al,-0x19(%rbp)
mov    -0x30(%rbp),%rax
mov    -0x48(%rbp),%rcx
mov    (%rax,%rcx,1),%al
mov    %al,-0x1a(%rbp)
mov    -0x1a(%rbp),%dl
mov    -0x28(%rbp),%rax
mov    -0x48(%rbp),%rcx
mov    %dl,(%rax,%rcx,1)
mov    -0x19(%rbp),%dl
mov    -0x30(%rbp),%rax
mov    -0x48(%rbp),%rcx
mov    %dl,(%rax,%rcx,1)
mov    -0x48(%rbp),%rax
add    $0x2,%rax
mov    %rax,-0x48(%rbp)
jmp    12b3 <swap_bytes+0x1b3>
movl   $0x0,-0x4(%rbp)
jmp    17fd <swap_bytes+0x6fd>
mov    -0x18(%rbp),%rax
sub    $0xc,%rax
mov    %rax,-0x18(%rbp)
mov    -0x48(%rbp),%rax
cmp    -0x18(%rbp),%rax
jge    14b5 <swap_bytes+0x3b5>
mov    -0x28(%rbp),%rax
mov    -0x48(%rbp),%rcx
mov    (%rax,%rcx,1),%al
mov    %al,-0x19(%rbp)
mov    -0x30(%rbp),%rax
mov    -0x48(%rbp),%rcx
mov    (%rax,%rcx,1),%al
mov    %al,-0x1a(%rbp)
mov    -0x38(%rbp),%rax
mov    -0x48(%rbp),%rcx
mov    (%rax,%rcx,1),%al
mov    %al,-0x1b(%rbp)
mov    -0x1b(%rbp),%dl
mov    -0x28(%rbp),%rax
mov    -0x48(%rbp),%rcx
mov    %dl,(%rax,%rcx,1)
mov    -0x1a(%rbp),%dl
mov    -0x30(%rbp),%rax
mov    -0x48(%rbp),%rcx
mov    %dl,(%rax,%rcx,1)
mov    -0x19(%rbp),%dl
mov    -0x38(%rbp),%rax
mov    -0x48(%rbp),%rcx
mov    %dl,(%rax,%rcx,1)
mov    -0x48(%rbp),%rax
add    $0x3,%rax
mov    %rax,-0x48(%rbp)
mov    -0x28(%rbp),%rax
mov    -0x48(%rbp),%rcx
mov    (%rax,%rcx,1),%al
mov    %al,-0x19(%rbp)
mov    -0x30(%rbp),%rax
mov    -0x48(%rbp),%rcx
mov    (%rax,%rcx,1),%al
mov    %al,-0x1a(%rbp)
mov    -0x38(%rbp),%rax
mov    -0x48(%rbp),%rcx
mov    (%rax,%rcx,1),%al
mov    %al,-0x1b(%rbp)
mov    -0x1b(%rbp),%dl
mov    -0x28(%rbp),%rax
mov    -0x48(%rbp),%rcx
mov    %dl,(%rax,%rcx,1)
mov    -0x1a(%rbp),%dl
mov    -0x30(%rbp),%rax
mov    -0x48(%rbp),%rcx
mov    %dl,(%rax,%rcx,1)
mov    -0x19(%rbp),%dl
mov    -0x38(%rbp),%rax
mov    -0x48(%rbp),%rcx
mov    %dl,(%rax,%rcx,1)
mov    -0x48(%rbp),%rax
add    $0x3,%rax
mov    %rax,-0x48(%rbp)
mov    -0x28(%rbp),%rax
mov    -0x48(%rbp),%rcx
mov    (%rax,%rcx,1),%al
mov    %al,-0x19(%rbp)
mov    -0x30(%rbp),%rax
mov    -0x48(%rbp),%rcx
mov    (%rax,%rcx,1),%al
mov    %al,-0x1a(%rbp)
mov    -0x38(%rbp),%rax
mov    -0x48(%rbp),%rcx
mov    (%rax,%rcx,1),%al
mov    %al,-0x1b(%rbp)
mov    -0x1b(%rbp),%dl
mov    -0x28(%rbp),%rax
mov    -0x48(%rbp),%rcx
mov    %dl,(%rax,%rcx,1)
mov    -0x1a(%rbp),%dl
mov    -0x30(%rbp),%rax
mov    -0x48(%rbp),%rcx
mov    %dl,(%rax,%rcx,1)
mov    -0x19(%rbp),%dl
mov    -0x38(%rbp),%rax
mov    -0x48(%rbp),%rcx
mov    %dl,(%rax,%rcx,1)
mov    -0x48(%rbp),%rax
add    $0x3,%rax
mov    %rax,-0x48(%rbp)
mov    -0x28(%rbp),%rax
mov    -0x48(%rbp),%rcx
mov    (%rax,%rcx,1),%al
mov    %al,-0x19(%rbp)
mov    -0x30(%rbp),%rax
mov    -0x48(%rbp),%rcx
mov    (%rax,%rcx,1),%al
mov    %al,-0x1a(%rbp)
mov    -0x38(%rbp),%rax
mov    -0x48(%rbp),%rcx
mov    (%rax,%rcx,1),%al
mov    %al,-0x1b(%rbp)
mov    -0x1b(%rbp),%dl
mov    -0x28(%rbp),%rax
mov    -0x48(%rbp),%rcx
mov    %dl,(%rax,%rcx,1)
mov    -0x1a(%rbp),%dl
mov    -0x30(%rbp),%rax
mov    -0x48(%rbp),%rcx
mov    %dl,(%rax,%rcx,1)
mov    -0x19(%rbp),%dl
mov    -0x38(%rbp),%rax
mov    -0x48(%rbp),%rcx
mov    %dl,(%rax,%rcx,1)
mov    -0x48(%rbp),%rax
add    $0x3,%rax
mov    %rax,-0x48(%rbp)
jmp    1322 <swap_bytes+0x222>
mov    -0x18(%rbp),%rax
add    $0xc,%rax
mov    %rax,-0x18(%rbp)
mov    -0x48(%rbp),%rax
cmp    -0x18(%rbp),%rax
jge    1534 <swap_bytes+0x434>
mov    -0x28(%rbp),%rax
mov    -0x48(%rbp),%rcx
mov    (%rax,%rcx,1),%al
mov    %al,-0x19(%rbp)
mov    -0x30(%rbp),%rax
mov    -0x48(%rbp),%rcx
mov    (%rax,%rcx,1),%al
mov    %al,-0x1a(%rbp)
mov    -0x38(%rbp),%rax
mov    -0x48(%rbp),%rcx
mov    (%rax,%rcx,1),%al
mov    %al,-0x1b(%rbp)
mov    -0x1b(%rbp),%dl
mov    -0x28(%rbp),%rax
mov    -0x48(%rbp),%rcx
mov    %dl,(%rax,%rcx,1)
mov    -0x1a(%rbp),%dl
mov    -0x30(%rbp),%rax
mov    -0x48(%rbp),%rcx
mov    %dl,(%rax,%rcx,1)
mov    -0x19(%rbp),%dl
mov    -0x38(%rbp),%rax
mov    -0x48(%rbp),%rcx
mov    %dl,(%rax,%rcx,1)
mov    -0x48(%rbp),%rax
add    $0x3,%rax
mov    %rax,-0x48(%rbp)
jmp    14c1 <swap_bytes+0x3c1>
movl   $0x0,-0x4(%rbp)
jmp    17fd <swap_bytes+0x6fd>
mov    -0x18(%rbp),%rax
sub    $0x10,%rax
mov    %rax,-0x18(%rbp)
mov    -0x48(%rbp),%rax
cmp    -0x18(%rbp),%rax
jge    174f <swap_bytes+0x64f>
mov    -0x28(%rbp),%rax
mov    -0x48(%rbp),%rcx
mov    (%rax,%rcx,1),%al
mov    %al,-0x19(%rbp)
mov    -0x30(%rbp),%rax
mov    -0x48(%rbp),%rcx
mov    (%rax,%rcx,1),%al
mov    %al,-0x1a(%rbp)
mov    -0x38(%rbp),%rax
mov    -0x48(%rbp),%rcx
mov    (%rax,%rcx,1),%al
mov    %al,-0x1b(%rbp)
mov    -0x40(%rbp),%rax
mov    -0x48(%rbp),%rcx
mov    (%rax,%rcx,1),%al
mov    %al,-0x1c(%rbp)
mov    -0x1c(%rbp),%dl
mov    -0x28(%rbp),%rax
mov    -0x48(%rbp),%rcx
mov    %dl,(%rax,%rcx,1)
mov    -0x19(%rbp),%dl
mov    -0x30(%rbp),%rax
mov    -0x48(%rbp),%rcx
mov    %dl,(%rax,%rcx,1)
mov    -0x1a(%rbp),%dl
mov    -0x38(%rbp),%rax
mov    -0x48(%rbp),%rcx
mov    %dl,(%rax,%rcx,1)
mov    -0x1b(%rbp),%dl
mov    -0x40(%rbp),%rax
mov    -0x48(%rbp),%rcx
mov    %dl,(%rax,%rcx,1)
mov    -0x48(%rbp),%rax
add    $0x4,%rax
mov    %rax,-0x48(%rbp)
mov    -0x28(%rbp),%rax
mov    -0x48(%rbp),%rcx
mov    (%rax,%rcx,1),%al
mov    %al,-0x19(%rbp)
mov    -0x30(%rbp),%rax
mov    -0x48(%rbp),%rcx
mov    (%rax,%rcx,1),%al
mov    %al,-0x1a(%rbp)
mov    -0x38(%rbp),%rax
mov    -0x48(%rbp),%rcx
mov    (%rax,%rcx,1),%al
mov    %al,-0x1b(%rbp)
mov    -0x40(%rbp),%rax
mov    -0x48(%rbp),%rcx
mov    (%rax,%rcx,1),%al
mov    %al,-0x1c(%rbp)
mov    -0x1c(%rbp),%dl
mov    -0x28(%rbp),%rax
mov    -0x48(%rbp),%rcx
mov    %dl,(%rax,%rcx,1)
mov    -0x19(%rbp),%dl
mov    -0x30(%rbp),%rax
mov    -0x48(%rbp),%rcx
mov    %dl,(%rax,%rcx,1)
mov    -0x1a(%rbp),%dl
mov    -0x38(%rbp),%rax
mov    -0x48(%rbp),%rcx
mov    %dl,(%rax,%rcx,1)
mov    -0x1b(%rbp),%dl
mov    -0x40(%rbp),%rax
mov    -0x48(%rbp),%rcx
mov    %dl,(%rax,%rcx,1)
mov    -0x48(%rbp),%rax
add    $0x4,%rax
mov    %rax,-0x48(%rbp)
mov    -0x28(%rbp),%rax
mov    -0x48(%rbp),%rcx
mov    (%rax,%rcx,1),%al
mov    %al,-0x19(%rbp)
mov    -0x30(%rbp),%rax
mov    -0x48(%rbp),%rcx
mov    (%rax,%rcx,1),%al
mov    %al,-0x1a(%rbp)
mov    -0x38(%rbp),%rax
mov    -0x48(%rbp),%rcx
mov    (%rax,%rcx,1),%al
mov    %al,-0x1b(%rbp)
mov    -0x40(%rbp),%rax
mov    -0x48(%rbp),%rcx
mov    (%rax,%rcx,1),%al
mov    %al,-0x1c(%rbp)
mov    -0x1c(%rbp),%dl
mov    -0x28(%rbp),%rax
mov    -0x48(%rbp),%rcx
mov    %dl,(%rax,%rcx,1)
mov    -0x19(%rbp),%dl
mov    -0x30(%rbp),%rax
mov    -0x48(%rbp),%rcx
mov    %dl,(%rax,%rcx,1)
mov    -0x1a(%rbp),%dl
mov    -0x38(%rbp),%rax
mov    -0x48(%rbp),%rcx
mov    %dl,(%rax,%rcx,1)
mov    -0x1b(%rbp),%dl
mov    -0x40(%rbp),%rax
mov    -0x48(%rbp),%rcx
mov    %dl,(%rax,%rcx,1)
mov    -0x48(%rbp),%rax
add    $0x4,%rax
mov    %rax,-0x48(%rbp)
mov    -0x28(%rbp),%rax
mov    -0x48(%rbp),%rcx
mov    (%rax,%rcx,1),%al
mov    %al,-0x19(%rbp)
mov    -0x30(%rbp),%rax
mov    -0x48(%rbp),%rcx
mov    (%rax,%rcx,1),%al
mov    %al,-0x1a(%rbp)
mov    -0x38(%rbp),%rax
mov    -0x48(%rbp),%rcx
mov    (%rax,%rcx,1),%al
mov    %al,-0x1b(%rbp)
mov    -0x40(%rbp),%rax
mov    -0x48(%rbp),%rcx
mov    (%rax,%rcx,1),%al
mov    %al,-0x1c(%rbp)
mov    -0x1c(%rbp),%dl
mov    -0x28(%rbp),%rax
mov    -0x48(%rbp),%rcx
mov    %dl,(%rax,%rcx,1)
mov    -0x19(%rbp),%dl
mov    -0x30(%rbp),%rax
mov    -0x48(%rbp),%rcx
mov    %dl,(%rax,%rcx,1)
mov    -0x1a(%rbp),%dl
mov    -0x38(%rbp),%rax
mov    -0x48(%rbp),%rcx
mov    %dl,(%rax,%rcx,1)
mov    -0x1b(%rbp),%dl
mov    -0x40(%rbp),%rax
mov    -0x48(%rbp),%rcx
mov    %dl,(%rax,%rcx,1)
mov    -0x48(%rbp),%rax
add    $0x4,%rax
mov    %rax,-0x48(%rbp)
jmp    154c <swap_bytes+0x44c>
mov    -0x18(%rbp),%rax
add    $0x10,%rax
mov    %rax,-0x18(%rbp)
mov    -0x48(%rbp),%rax
cmp    -0x18(%rbp),%rax
jge    17ea <swap_bytes+0x6ea>
mov    -0x28(%rbp),%rax
mov    -0x48(%rbp),%rcx
mov    (%rax,%rcx,1),%al
mov    %al,-0x19(%rbp)
mov    -0x30(%rbp),%rax
mov    -0x48(%rbp),%rcx
mov    (%rax,%rcx,1),%al
mov    %al,-0x1a(%rbp)
mov    -0x38(%rbp),%rax
mov    -0x48(%rbp),%rcx
mov    (%rax,%rcx,1),%al
mov    %al,-0x1b(%rbp)
mov    -0x40(%rbp),%rax
mov    -0x48(%rbp),%rcx
mov    (%rax,%rcx,1),%al
mov    %al,-0x1c(%rbp)
mov    -0x1c(%rbp),%dl
mov    -0x28(%rbp),%rax
mov    -0x48(%rbp),%rcx
mov    %dl,(%rax,%rcx,1)
mov    -0x19(%rbp),%dl
mov    -0x30(%rbp),%rax
mov    -0x48(%rbp),%rcx
mov    %dl,(%rax,%rcx,1)
mov    -0x1a(%rbp),%dl
mov    -0x38(%rbp),%rax
mov    -0x48(%rbp),%rcx
mov    %dl,(%rax,%rcx,1)
mov    -0x1b(%rbp),%dl
mov    -0x40(%rbp),%rax
mov    -0x48(%rbp),%rcx
mov    %dl,(%rax,%rcx,1)
mov    -0x48(%rbp),%rax
add    $0x4,%rax
mov    %rax,-0x48(%rbp)
jmp    175b <swap_bytes+0x65b>
movl   $0x0,-0x4(%rbp)
jmp    17fd <swap_bytes+0x6fd>
movl   $0x1,-0x4(%rbp)
mov    -0x4(%rbp),%eax
pop    %rbp
ret

x86 assembly (clang, -O2):
<swap_bytes>:
add    $0xffffffff,%edi
cmp    $0x3,%edi
ja     11c9 <swap_bytes+0xc9>
xor    %eax,%eax
lea    0xeeb(%rip),%rcx
movslq (%rcx,%rdi,4),%rdi
add    %rcx,%rdi
jmp    *%rdi
xor    %eax,%eax
cmp    $0x9,%rdx
jl     1220 <swap_bytes+0x120>
lea    -0x8(%rdx),%rdi
xor    %ecx,%ecx
rolw   $0x8,(%rsi,%rcx,1)
rolw   $0x8,0x2(%rsi,%rcx,1)
rolw   $0x8,0x4(%rsi,%rcx,1)
rolw   $0x8,0x6(%rsi,%rcx,1)
add    $0x8,%rcx
cmp    %rdi,%rcx
jl     1130 <swap_bytes+0x30>
jmp    1239 <swap_bytes+0x139>
xor    %eax,%eax
cmp    $0xd,%rdx
jl     11f7 <swap_bytes+0xf7>
lea    -0xc(%rdx),%r9
xor    %edi,%edi
nopw   0x0(%rax,%rax,1)
movzbl (%rsi,%rdi,1),%r8d
movzbl 0x2(%rsi,%rdi,1),%ecx
mov    %cl,(%rsi,%rdi,1)
mov    %r8b,0x2(%rsi,%rdi,1)
movzbl 0x3(%rsi,%rdi,1),%r8d
movzbl 0x5(%rsi,%rdi,1),%ecx
mov    %cl,0x3(%rsi,%rdi,1)
mov    %r8b,0x5(%rsi,%rdi,1)
movzbl 0x6(%rsi,%rdi,1),%r8d
movzbl 0x8(%rsi,%rdi,1),%ecx
mov    %cl,0x6(%rsi,%rdi,1)
mov    %r8b,0x8(%rsi,%rdi,1)
movzbl 0x9(%rsi,%rdi,1),%r8d
movzbl 0xb(%rsi,%rdi,1),%ecx
mov    %cl,0x9(%rsi,%rdi,1)
mov    %r8b,0xb(%rsi,%rdi,1)
add    $0xc,%rdi
cmp    %r9,%rdi
jl     1170 <swap_bytes+0x70>
jmp    1216 <swap_bytes+0x116>
mov    $0x1,%eax
jmp    1301 <swap_bytes+0x201>
xor    %eax,%eax
cmp    $0x11,%rdx
jl     1243 <swap_bytes+0x143>
lea    -0x11(%rdx),%rcx
mov    %rcx,%r8
shr    $0x4,%r8
add    $0x1,%r8
cmp    $0x10,%rcx
jae    124a <swap_bytes+0x14a>
xor    %edi,%edi
jmp    12a4 <swap_bytes+0x1a4>
xor    %edi,%edi
jmp    1216 <swap_bytes+0x116>
nopl   0x0(%rax,%rax,1)
movzbl (%rsi,%rdi,1),%r8d
movzbl 0x2(%rsi,%rdi,1),%ecx
mov    %cl,(%rsi,%rdi,1)
mov    %r8b,0x2(%rsi,%rdi,1)
add    $0x3,%rdi
cmp    %rdx,%rdi
jl     1200 <swap_bytes+0x100>
jmp    1301 <swap_bytes+0x201>
xor    %ecx,%ecx
jmp    1239 <swap_bytes+0x139>
cs nopw 0x0(%rax,%rax,1)
xchg   %ax,%ax
rolw   $0x8,(%rsi,%rcx,1)
add    $0x2,%rcx
cmp    %rdx,%rcx
jl     1230 <swap_bytes+0x130>
jmp    1301 <swap_bytes+0x201>
xor    %edi,%edi
jmp    12fc <swap_bytes+0x1fc>
mov    %r8,%rcx
and    $0xfffffffffffffffe,%rcx
xor    %edi,%edi
cs nopw 0x0(%rax,%rax,1)
nopl   (%rax)
movdqu (%rsi,%rdi,1),%xmm0
movdqu 0x10(%rsi,%rdi,1),%xmm1
movdqa %xmm0,%xmm2
psrld  $0x18,%xmm2
pslld  $0x8,%xmm0
por    %xmm2,%xmm0
movdqu %xmm0,(%rsi,%rdi,1)
movdqa %xmm1,%xmm0
psrld  $0x18,%xmm0
pslld  $0x8,%xmm1
por    %xmm0,%xmm1
movdqu %xmm1,0x10(%rsi,%rdi,1)
add    $0x20,%rdi
add    $0xfffffffffffffffe,%rcx
jne    1260 <swap_bytes+0x160>
test   $0x1,%r8b
je     12fc <swap_bytes+0x1fc>
movdqu (%rsi,%rdi,1),%xmm0
movdqa %xmm0,%xmm1
psrld  $0x18,%xmm1
pslld  $0x8,%xmm0
por    %xmm1,%xmm0
movdqu %xmm0,(%rsi,%rdi,1)
add    $0x10,%rdi
jmp    12fc <swap_bytes+0x1fc>
nopl   0x0(%rax)
movzbl (%rsi,%rdi,1),%r10d
movzbl 0x1(%rsi,%rdi,1),%r8d
movzbl 0x2(%rsi,%rdi,1),%r9d
movzbl 0x3(%rsi,%rdi,1),%ecx
mov    %cl,(%rsi,%rdi,1)
mov    %r10b,0x1(%rsi,%rdi,1)
mov    %r8b,0x2(%rsi,%rdi,1)
mov    %r9b,0x3(%rsi,%rdi,1)
add    $0x4,%rdi
cmp    %rdx,%rdi
jl     12d0 <swap_bytes+0x1d0>
ret

LLVM IR (-O0):
define i32 @swap_bytes(i32 %0, i8* %1, i64 %2) {
%4 = alloca i32
%5 = alloca i32
%6 = alloca i8*
%7 = alloca i64
%8 = alloca i8
%9 = alloca i8
%10 = alloca i8
%11 = alloca i8
%12 = alloca i8*
%13 = alloca i8*
%14 = alloca i8*
%15 = alloca i8*
%16 = alloca i64
store i32 %0, i32* %5
store i8* %1, i8** %6
store i64 %2, i64* %7
%17 = load i8*, i8** %6
store i8* %17, i8** %12
%18 = load i8*, i8** %6
%19 = getelementptr inbounds i8, i8* %18, i64 1
store i8* %19, i8** %13
%20 = load i8*, i8** %6
%21 = getelementptr inbounds i8, i8* %20, i64 2
store i8* %21, i8** %14
%22 = load i8*, i8** %6
%23 = getelementptr inbounds i8, i8* %22, i64 3
store i8* %23, i8** %15
store i64 0, i64* %16
%24 = load i32, i32* %5
switch i32 %24, label %467 [
i32 1, label %25
i32 2, label %26
i32 3, label %133
i32 4, label %280
]
25: ; preds = %3
store i32 0, i32* %4
br label %468
26: ; preds = %3
%27 = load i64, i64* %7
%28 = sub nsw i64 %27, 8
store i64 %28, i64* %7
br label %29
29: ; preds = %33, %26
%30 = load i64, i64* %16
%31 = load i64, i64* %7
%32 = icmp slt i64 %30, %31
br i1 %32, label %33, label %106
33: ; preds = %29
%34 = load i8*, i8** %12
%35 = load i64, i64* %16
%36 = getelementptr inbounds i8, i8* %34, i64 %35
%37 = load i8, i8* %36
store i8 %37, i8* %8
%38 = load i8*, i8** %13
%39 = load i64, i64* %16
%40 = getelementptr inbounds i8, i8* %38, i64 %39
%41 = load i8, i8* %40
store i8 %41, i8* %9
%42 = load i8, i8* %9
%43 = load i8*, i8** %12
%44 = load i64, i64* %16
%45 = getelementptr inbounds i8, i8* %43, i64 %44
store i8 %42, i8* %45
%46 = load i8, i8* %8
%47 = load i8*, i8** %13
%48 = load i64, i64* %16
%49 = getelementptr inbounds i8, i8* %47, i64 %48
store i8 %46, i8* %49
%50 = load i64, i64* %16
%51 = add nsw i64 %50, 2
store i64 %51, i64* %16
%52 = load i8*, i8** %12
%53 = load i64, i64* %16
%54 = getelementptr inbounds i8, i8* %52, i64 %53
%55 = load i8, i8* %54
store i8 %55, i8* %8
%56 = load i8*, i8** %13
%57 = load i64, i64* %16
%58 = getelementptr inbounds i8, i8* %56, i64 %57
%59 = load i8, i8* %58
store i8 %59, i8* %9
%60 = load i8, i8* %9
%61 = load i8*, i8** %12
%62 = load i64, i64* %16
%63 = getelementptr inbounds i8, i8* %61, i64 %62
store i8 %60, i8* %63
%64 = load i8, i8* %8
%65 = load i8*, i8** %13
%66 = load i64, i64* %16
%67 = getelementptr inbounds i8, i8* %65, i64 %66
store i8 %64, i8* %67
%68 = load i64, i64* %16
%69 = add nsw i64 %68, 2
store i64 %69, i64* %16
%70 = load i8*, i8** %12
%71 = load i64, i64* %16
%72 = getelementptr inbounds i8, i8* %70, i64 %71
%73 = load i8, i8* %72
store i8 %73, i8* %8
%74 = load i8*, i8** %13
%75 = load i64, i64* %16
%76 = getelementptr inbounds i8, i8* %74, i64 %75
%77 = load i8, i8* %76
store i8 %77, i8* %9
%78 = load i8, i8* %9
%79 = load i8*, i8** %12
%80 = load i64, i64* %16
%81 = getelementptr inbounds i8, i8* %79, i64 %80
store i8 %78, i8* %81
%82 = load i8, i8* %8
%83 = load i8*, i8** %13
%84 = load i64, i64* %16
%85 = getelementptr inbounds i8, i8* %83, i64 %84
store i8 %82, i8* %85
%86 = load i64, i64* %16
%87 = add nsw i64 %86, 2
store i64 %87, i64* %16
%88 = load i8*, i8** %12
%89 = load i64, i64* %16
%90 = getelementptr inbounds i8, i8* %88, i64 %89
%91 = load i8, i8* %90
store i8 %91, i8* %8
%92 = load i8*, i8** %13
%93 = load i64, i64* %16
%94 = getelementptr inbounds i8, i8* %92, i64 %93
%95 = load i8, i8* %94
store i8 %95, i8* %9
%96 = load i8, i8* %9
%97 = load i8*, i8** %12
%98 = load i64, i64* %16
%99 = getelementptr inbounds i8, i8* %97, i64 %98
store i8 %96, i8* %99
%100 = load i8, i8* %8
%101 = load i8*, i8** %13
%102 = load i64, i64* %16
%103 = getelementptr inbounds i8, i8* %101, i64 %102
store i8 %100, i8* %103
%104 = load i64, i64* %16
%105 = add nsw i64 %104, 2
store i64 %105, i64* %16
br label %29
106: ; preds = %29
%107 = load i64, i64* %7
%108 = add nsw i64 %107, 8
store i64 %108, i64* %7
br label %109
109: ; preds = %113, %106
%110 = load i64, i64* %16
%111 = load i64, i64* %7
%112 = icmp slt i64 %110, %111
br i1 %112, label %113, label %132
113: ; preds = %109
%114 = load i8*, i8** %12
%115 = load i64, i64* %16
%116 = getelementptr inbounds i8, i8* %114, i64 %115
%117 = load i8, i8* %116
store i8 %117, i8* %8
%118 = load i8*, i8** %13
%119 = load i64, i64* %16
%120 = getelementptr inbounds i8, i8* %118, i64 %119
%121 = load i8, i8* %120
store i8 %121, i8* %9
%122 = load i8, i8* %9
%123 = load i8*, i8** %12
%124 = load i64, i64* %16
%125 = getelementptr inbounds i8, i8* %123, i64 %124
store i8 %122, i8* %125
%126 = load i8, i8* %8
%127 = load i8*, i8** %13
%128 = load i64, i64* %16
%129 = getelementptr inbounds i8, i8* %127, i64 %128
store i8 %126, i8* %129
%130 = load i64, i64* %16
%131 = add nsw i64 %130, 2
store i64 %131, i64* %16
br label %109
132: ; preds = %109
store i32 0, i32* %4
br label %468
133: ; preds = %3
%134 = load i64, i64* %7
%135 = sub nsw i64 %134, 12
store i64 %135, i64* %7
br label %136
136: ; preds = %140, %133
%137 = load i64, i64* %16
%138 = load i64, i64* %7
%139 = icmp slt i64 %137, %138
br i1 %139, label %140, label %245
140: ; preds = %136
%141 = load i8*, i8** %12
%142 = load i64, i64* %16
%143 = getelementptr inbounds i8, i8* %141, i64 %142
%144 = load i8, i8* %143
store i8 %144, i8* %8
%145 = load i8*, i8** %13
%146 = load i64, i64* %16
%147 = getelementptr inbounds i8, i8* %145, i64 %146
%148 = load i8, i8* %147
store i8 %148, i8* %9
%149 = load i8*, i8** %14
%150 = load i64, i64* %16
%151 = getelementptr inbounds i8, i8* %149, i64 %150
%152 = load i8, i8* %151
store i8 %152, i8* %10
%153 = load i8, i8* %10
%154 = load i8*, i8** %12
%155 = load i64, i64* %16
%156 = getelementptr inbounds i8, i8* %154, i64 %155
store i8 %153, i8* %156
%157 = load i8, i8* %9
%158 = load i8*, i8** %13
%159 = load i64, i64* %16
%160 = getelementptr inbounds i8, i8* %158, i64 %159
store i8 %157, i8* %160
%161 = load i8, i8* %8
%162 = load i8*, i8** %14
%163 = load i64, i64* %16
%164 = getelementptr inbounds i8, i8* %162, i64 %163
store i8 %161, i8* %164
%165 = load i64, i64* %16
%166 = add nsw i64 %165, 3
store i64 %166, i64* %16
%167 = load i8*, i8** %12
%168 = load i64, i64* %16
%169 = getelementptr inbounds i8, i8* %167, i64 %168
%170 = load i8, i8* %169
store i8 %170, i8* %8
%171 = load i8*, i8** %13
%172 = load i64, i64* %16
%173 = getelementptr inbounds i8, i8* %171, i64 %172
%174 = load i8, i8* %173
store i8 %174, i8* %9
%175 = load i8*, i8** %14
%176 = load i64, i64* %16
%177 = getelementptr inbounds i8, i8* %175, i64 %176
%178 = load i8, i8* %177
store i8 %178, i8* %10
%179 = load i8, i8* %10
%180 = load i8*, i8** %12
%181 = load i64, i64* %16
%182 = getelementptr inbounds i8, i8* %180, i64 %181
store i8 %179, i8* %182
%183 = load i8, i8* %9
%184 = load i8*, i8** %13
%185 = load i64, i64* %16
%186 = getelementptr inbounds i8, i8* %184, i64 %185
store i8 %183, i8* %186
%187 = load i8, i8* %8
%188 = load i8*, i8** %14
%189 = load i64, i64* %16
%190 = getelementptr inbounds i8, i8* %188, i64 %189
store i8 %187, i8* %190
%191 = load i64, i64* %16
%192 = add nsw i64 %191, 3
store i64 %192, i64* %16
%193 = load i8*, i8** %12
%194 = load i64, i64* %16
%195 = getelementptr inbounds i8, i8* %193, i64 %194
%196 = load i8, i8* %195
store i8 %196, i8* %8
%197 = load i8*, i8** %13
%198 = load i64, i64* %16
%199 = getelementptr inbounds i8, i8* %197, i64 %198
%200 = load i8, i8* %199
store i8 %200, i8* %9
%201 = load i8*, i8** %14
%202 = load i64, i64* %16
%203 = getelementptr inbounds i8, i8* %201, i64 %202
%204 = load i8, i8* %203
store i8 %204, i8* %10
%205 = load i8, i8* %10
%206 = load i8*, i8** %12
%207 = load i64, i64* %16
%208 = getelementptr inbounds i8, i8* %206, i64 %207
store i8 %205, i8* %208
%209 = load i8, i8* %9
%210 = load i8*, i8** %13
%211 = load i64, i64* %16
%212 = getelementptr inbounds i8, i8* %210, i64 %211
store i8 %209, i8* %212
%213 = load i8, i8* %8
%214 = load i8*, i8** %14
%215 = load i64, i64* %16
%216 = getelementptr inbounds i8, i8* %214, i64 %215
store i8 %213, i8* %216
%217 = load i64, i64* %16
%218 = add nsw i64 %217, 3
store i64 %218, i64* %16
%219 = load i8*, i8** %12
%220 = load i64, i64* %16
%221 = getelementptr inbounds i8, i8* %219, i64 %220
%222 = load i8, i8* %221
store i8 %222, i8* %8
%223 = load i8*, i8** %13
%224 = load i64, i64* %16
%225 = getelementptr inbounds i8, i8* %223, i64 %224
%226 = load i8, i8* %225
store i8 %226, i8* %9
%227 = load i8*, i8** %14
%228 = load i64, i64* %16
%229 = getelementptr inbounds i8, i8* %227, i64 %228
%230 = load i8, i8* %229
store i8 %230, i8* %10
%231 = load i8, i8* %10
%232 = load i8*, i8** %12
%233 = load i64, i64* %16
%234 = getelementptr inbounds i8, i8* %232, i64 %233
store i8 %231, i8* %234
%235 = load i8, i8* %9
%236 = load i8*, i8** %13
%237 = load i64, i64* %16
%238 = getelementptr inbounds i8, i8* %236, i64 %237
store i8 %235, i8* %238
%239 = load i8, i8* %8
%240 = load i8*, i8** %14
%241 = load i64, i64* %16
%242 = getelementptr inbounds i8, i8* %240, i64 %241
store i8 %239, i8* %242
%243 = load i64, i64* %16
%244 = add nsw i64 %243, 3
store i64 %244, i64* %16
br label %136
245: ; preds = %136
%246 = load i64, i64* %7
%247 = add nsw i64 %246, 12
store i64 %247, i64* %7
br label %248
248: ; preds = %252, %245
%249 = load i64, i64* %16
%250 = load i64, i64* %7
%251 = icmp slt i64 %249, %250
br i1 %251, label %252, label %279
252: ; preds = %248
%253 = load i8*, i8** %12
%254 = load i64, i64* %16
%255 = getelementptr inbounds i8, i8* %253, i64 %254
%256 = load i8, i8* %255
store i8 %256, i8* %8
%257 = load i8*, i8** %13
%258 = load i64, i64* %16
%259 = getelementptr inbounds i8, i8* %257, i64 %258
%260 = load i8, i8* %259
store i8 %260, i8* %9
%261 = load i8*, i8** %14
%262 = load i64, i64* %16
%263 = getelementptr inbounds i8, i8* %261, i64 %262
%264 = load i8, i8* %263
store i8 %264, i8* %10
%265 = load i8, i8* %10
%266 = load i8*, i8** %12
%267 = load i64, i64* %16
%268 = getelementptr inbounds i8, i8* %266, i64 %267
store i8 %265, i8* %268
%269 = load i8, i8* %9
%270 = load i8*, i8** %13
%271 = load i64, i64* %16
%272 = getelementptr inbounds i8, i8* %270, i64 %271
store i8 %269, i8* %272
%273 = load i8, i8* %8
%274 = load i8*, i8** %14
%275 = load i64, i64* %16
%276 = getelementptr inbounds i8, i8* %274, i64 %275
store i8 %273, i8* %276
%277 = load i64, i64* %16
%278 = add nsw i64 %277, 3
store i64 %278, i64* %16
br label %248
279: ; preds = %248
store i32 0, i32* %4
br label %468
280: ; preds = %3
%281 = load i64, i64* %7
%282 = sub nsw i64 %281, 16
store i64 %282, i64* %7
br label %283
283: ; preds = %287, %280
%284 = load i64, i64* %16
%285 = load i64, i64* %7
%286 = icmp slt i64 %284, %285
br i1 %286, label %287, label %424
287: ; preds = %283
%288 = load i8*, i8** %12
%289 = load i64, i64* %16
%290 = getelementptr inbounds i8, i8* %288, i64 %289
%291 = load i8, i8* %290
store i8 %291, i8* %8
%292 = load i8*, i8** %13
%293 = load i64, i64* %16
%294 = getelementptr inbounds i8, i8* %292, i64 %293
%295 = load i8, i8* %294
store i8 %295, i8* %9
%296 = load i8*, i8** %14
%297 = load i64, i64* %16
%298 = getelementptr inbounds i8, i8* %296, i64 %297
%299 = load i8, i8* %298
store i8 %299, i8* %10
%300 = load i8*, i8** %15
%301 = load i64, i64* %16
%302 = getelementptr inbounds i8, i8* %300, i64 %301
%303 = load i8, i8* %302
store i8 %303, i8* %11
%304 = load i8, i8* %11
%305 = load i8*, i8** %12
%306 = load i64, i64* %16
%307 = getelementptr inbounds i8, i8* %305, i64 %306
store i8 %304, i8* %307
%308 = load i8, i8* %8
%309 = load i8*, i8** %13
%310 = load i64, i64* %16
%311 = getelementptr inbounds i8, i8* %309, i64 %310
store i8 %308, i8* %311
%312 = load i8, i8* %9
%313 = load i8*, i8** %14
%314 = load i64, i64* %16
%315 = getelementptr inbounds i8, i8* %313, i64 %314
store i8 %312, i8* %315
%316 = load i8, i8* %10
%317 = load i8*, i8** %15
%318 = load i64, i64* %16
%319 = getelementptr inbounds i8, i8* %317, i64 %318
store i8 %316, i8* %319
%320 = load i64, i64* %16
%321 = add nsw i64 %320, 4
store i64 %321, i64* %16
%322 = load i8*, i8** %12
%323 = load i64, i64* %16
%324 = getelementptr inbounds i8, i8* %322, i64 %323
%325 = load i8, i8* %324
store i8 %325, i8* %8
%326 = load i8*, i8** %13
%327 = load i64, i64* %16
%328 = getelementptr inbounds i8, i8* %326, i64 %327
%329 = load i8, i8* %328
store i8 %329, i8* %9
%330 = load i8*, i8** %14
%331 = load i64, i64* %16
%332 = getelementptr inbounds i8, i8* %330, i64 %331
%333 = load i8, i8* %332
store i8 %333, i8* %10
%334 = load i8*, i8** %15
%335 = load i64, i64* %16
%336 = getelementptr inbounds i8, i8* %334, i64 %335
%337 = load i8, i8* %336
store i8 %337, i8* %11
%338 = load i8, i8* %11
%339 = load i8*, i8** %12
%340 = load i64, i64* %16
%341 = getelementptr inbounds i8, i8* %339, i64 %340
store i8 %338, i8* %341
%342 = load i8, i8* %8
%343 = load i8*, i8** %13
%344 = load i64, i64* %16
%345 = getelementptr inbounds i8, i8* %343, i64 %344
store i8 %342, i8* %345
%346 = load i8, i8* %9
%347 = load i8*, i8** %14
%348 = load i64, i64* %16
%349 = getelementptr inbounds i8, i8* %347, i64 %348
store i8 %346, i8* %349
%350 = load i8, i8* %10
%351 = load i8*, i8** %15
%352 = load i64, i64* %16
%353 = getelementptr inbounds i8, i8* %351, i64 %352
store i8 %350, i8* %353
%354 = load i64, i64* %16
%355 = add nsw i64 %354, 4
store i64 %355, i64* %16
%356 = load i8*, i8** %12
%357 = load i64, i64* %16
%358 = getelementptr inbounds i8, i8* %356, i64 %357
%359 = load i8, i8* %358
store i8 %359, i8* %8
%360 = load i8*, i8** %13
%361 = load i64, i64* %16
%362 = getelementptr inbounds i8, i8* %360, i64 %361
%363 = load i8, i8* %362
store i8 %363, i8* %9
%364 = load i8*, i8** %14
%365 = load i64, i64* %16
%366 = getelementptr inbounds i8, i8* %364, i64 %365
%367 = load i8, i8* %366
store i8 %367, i8* %10
%368 = load i8*, i8** %15
%369 = load i64, i64* %16
%370 = getelementptr inbounds i8, i8* %368, i64 %369
%371 = load i8, i8* %370
store i8 %371, i8* %11
%372 = load i8, i8* %11
%373 = load i8*, i8** %12
%374 = load i64, i64* %16
%375 = getelementptr inbounds i8, i8* %373, i64 %374
store i8 %372, i8* %375
%376 = load i8, i8* %8
%377 = load i8*, i8** %13
%378 = load i64, i64* %16
%379 = getelementptr inbounds i8, i8* %377, i64 %378
store i8 %376, i8* %379
%380 = load i8, i8* %9
%381 = load i8*, i8** %14
%382 = load i64, i64* %16
%383 = getelementptr inbounds i8, i8* %381, i64 %382
store i8 %380, i8* %383
%384 = load i8, i8* %10
%385 = load i8*, i8** %15
%386 = load i64, i64* %16
%387 = getelementptr inbounds i8, i8* %385, i64 %386
store i8 %384, i8* %387
%388 = load i64, i64* %16
%389 = add nsw i64 %388, 4
store i64 %389, i64* %16
%390 = load i8*, i8** %12
%391 = load i64, i64* %16
%392 = getelementptr inbounds i8, i8* %390, i64 %391
%393 = load i8, i8* %392
store i8 %393, i8* %8
%394 = load i8*, i8** %13
%395 = load i64, i64* %16
%396 = getelementptr inbounds i8, i8* %394, i64 %395
%397 = load i8, i8* %396
store i8 %397, i8* %9
%398 = load i8*, i8** %14
%399 = load i64, i64* %16
%400 = getelementptr inbounds i8, i8* %398, i64 %399
%401 = load i8, i8* %400
store i8 %401, i8* %10
%402 = load i8*, i8** %15
%403 = load i64, i64* %16
%404 = getelementptr inbounds i8, i8* %402, i64 %403
%405 = load i8, i8* %404
store i8 %405, i8* %11
%406 = load i8, i8* %11
%407 = load i8*, i8** %12
%408 = load i64, i64* %16
%409 = getelementptr inbounds i8, i8* %407, i64 %408
store i8 %406, i8* %409
%410 = load i8, i8* %8
%411 = load i8*, i8** %13
%412 = load i64, i64* %16
%413 = getelementptr inbounds i8, i8* %411, i64 %412
store i8 %410, i8* %413
%414 = load i8, i8* %9
%415 = load i8*, i8** %14
%416 = load i64, i64* %16
%417 = getelementptr inbounds i8, i8* %415, i64 %416
store i8 %414, i8* %417
%418 = load i8, i8* %10
%419 = load i8*, i8** %15
%420 = load i64, i64* %16
%421 = getelementptr inbounds i8, i8* %419, i64 %420
store i8 %418, i8* %421
%422 = load i64, i64* %16
%423 = add nsw i64 %422, 4
store i64 %423, i64* %16
br label %283
424: ; preds = %283
%425 = load i64, i64* %7
%426 = add nsw i64 %425, 16
store i64 %426, i64* %7
br label %427
427: ; preds = %431, %424
%428 = load i64, i64* %16
%429 = load i64, i64* %7
%430 = icmp slt i64 %428, %429
br i1 %430, label %431, label %466
431: ; preds = %427
%432 = load i8*, i8** %12
%433 = load i64, i64* %16
%434 = getelementptr inbounds i8, i8* %432, i64 %433
%435 = load i8, i8* %434
store i8 %435, i8* %8
%436 = load i8*, i8** %13
%437 = load i64, i64* %16
%438 = getelementptr inbounds i8, i8* %436, i64 %437
%439 = load i8, i8* %438
store i8 %439, i8* %9
%440 = load i8*, i8** %14
%441 = load i64, i64* %16
%442 = getelementptr inbounds i8, i8* %440, i64 %441
%443 = load i8, i8* %442
store i8 %443, i8* %10
%444 = load i8*, i8** %15
%445 = load i64, i64* %16
%446 = getelementptr inbounds i8, i8* %444, i64 %445
%447 = load i8, i8* %446
store i8 %447, i8* %11
%448 = load i8, i8* %11
%449 = load i8*, i8** %12
%450 = load i64, i64* %16
%451 = getelementptr inbounds i8, i8* %449, i64 %450
store i8 %448, i8* %451
%452 = load i8, i8* %8
%453 = load i8*, i8** %13
%454 = load i64, i64* %16
%455 = getelementptr inbounds i8, i8* %453, i64 %454
store i8 %452, i8* %455
%456 = load i8, i8* %9
%457 = load i8*, i8** %14
%458 = load i64, i64* %16
%459 = getelementptr inbounds i8, i8* %457, i64 %458
store i8 %456, i8* %459
%460 = load i8, i8* %10
%461 = load i8*, i8** %15
%462 = load i64, i64* %16
%463 = getelementptr inbounds i8, i8* %461, i64 %462
store i8 %460, i8* %463
%464 = load i64, i64* %16
%465 = add nsw i64 %464, 4
store i64 %465, i64* %16
br label %427
466: ; preds = %427
store i32 0, i32* %4
br label %468
467: ; preds = %3
store i32 1, i32* %4
br label %468
468: ; preds = %467, %466, %279, %132, %25
%469 = load i32, i32* %4
ret i32 %469
}

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