#define NULL ((void *)0)
typedef unsigned long size_t; // Customize by platform.
typedef long intptr_t;
typedef unsigned long uintptr_t;
typedef long scalar_t__; // Either arithmetic or pointer type.
/* By default, we understand bool (as a convenience). */
typedef int bool;
#define false 0
#define true 1

/* Forward declarations */

/* Type definitions */

/* Variables and functions */
int BitswapAudio(unsigned char *pDest, unsigned char *pSrc, size_t len) {
  static const unsigned char Lookup[256] = {
      0x00, 0x80, 0x40, 0xC0, 0x20, 0xA0, 0x60, 0xE0, 0x10, 0x90, 0x50, 0xD0,
      0x30, 0xB0, 0x70, 0xF0, 0x08, 0x88, 0x48, 0xC8, 0x28, 0xA8, 0x68, 0xE8,
      0x18, 0x98, 0x58, 0xD8, 0x38, 0xB8, 0x78, 0xF8, 0x04, 0x84, 0x44, 0xC4,
      0x24, 0xA4, 0x64, 0xE4, 0x14, 0x94, 0x54, 0xD4, 0x34, 0xB4, 0x74, 0xF4,
      0x0C, 0x8C, 0x4C, 0xCC, 0x2C, 0xAC, 0x6C, 0xEC, 0x1C, 0x9C, 0x5C, 0xDC,
      0x3C, 0xBC, 0x7C, 0xFC, 0x02, 0x82, 0x42, 0xC2, 0x22, 0xA2, 0x62, 0xE2,
      0x12, 0x92, 0x52, 0xD2, 0x32, 0xB2, 0x72, 0xF2, 0x0A, 0x8A, 0x4A, 0xCA,
      0x2A, 0xAA, 0x6A, 0xEA, 0x1A, 0x9A, 0x5A, 0xDA, 0x3A, 0xBA, 0x7A, 0xFA,
      0x06, 0x86, 0x46, 0xC6, 0x26, 0xA6, 0x66, 0xE6, 0x16, 0x96, 0x56, 0xD6,
      0x36, 0xB6, 0x76, 0xF6, 0x0E, 0x8E, 0x4E, 0xCE, 0x2E, 0xAE, 0x6E, 0xEE,
      0x1E, 0x9E, 0x5E, 0xDE, 0x3E, 0xBE, 0x7E, 0xFE, 0x01, 0x81, 0x41, 0xC1,
      0x21, 0xA1, 0x61, 0xE1, 0x11, 0x91, 0x51, 0xD1, 0x31, 0xB1, 0x71, 0xF1,
      0x09, 0x89, 0x49, 0xC9, 0x29, 0xA9, 0x69, 0xE9, 0x19, 0x99, 0x59, 0xD9,
      0x39, 0xB9, 0x79, 0xF9, 0x05, 0x85, 0x45, 0xC5, 0x25, 0xA5, 0x65, 0xE5,
      0x15, 0x95, 0x55, 0xD5, 0x35, 0xB5, 0x75, 0xF5, 0x0D, 0x8D, 0x4D, 0xCD,
      0x2D, 0xAD, 0x6D, 0xED, 0x1D, 0x9D, 0x5D, 0xDD, 0x3D, 0xBD, 0x7D, 0xFD,
      0x03, 0x83, 0x43, 0xC3, 0x23, 0xA3, 0x63, 0xE3, 0x13, 0x93, 0x53, 0xD3,
      0x33, 0xB3, 0x73, 0xF3, 0x0B, 0x8B, 0x4B, 0xCB, 0x2B, 0xAB, 0x6B, 0xEB,
      0x1B, 0x9B, 0x5B, 0xDB, 0x3B, 0xBB, 0x7B, 0xFB, 0x07, 0x87, 0x47, 0xC7,
      0x27, 0xA7, 0x67, 0xE7, 0x17, 0x97, 0x57, 0xD7, 0x37, 0xB7, 0x77, 0xF7,
      0x0F, 0x8F, 0x4F, 0xCF, 0x2F, 0xAF, 0x6F, 0xEF, 0x1F, 0x9F, 0x5F, 0xDF,
      0x3F, 0xBF, 0x7F, 0xFF,
  };
  while (len--)
    *pDest++ = Lookup[*pSrc++];
  return 0;
}


x86 assembly (clang, -O0):
<BitswapAudio>:
push   %rbp
mov    %rsp,%rbp
mov    %rdi,-0x8(%rbp)
mov    %rsi,-0x10(%rbp)
mov    %rdx,-0x18(%rbp)
mov    -0x18(%rbp),%rax
mov    %rax,%rcx
add    $0xffffffffffffffff,%rcx
mov    %rcx,-0x18(%rbp)
cmp    $0x0,%rax
je     115d <BitswapAudio+0x5d>
mov    -0x10(%rbp),%rax
mov    %rax,%rcx
add    $0x1,%rcx
mov    %rcx,-0x10(%rbp)
movzbl (%rax),%eax
mov    %eax,%ecx
lea    0xebc(%rip),%rax
mov    (%rax,%rcx,1),%cl
mov    -0x8(%rbp),%rax
mov    %rax,%rdx
add    $0x1,%rdx
mov    %rdx,-0x8(%rbp)
mov    %cl,(%rax)
jmp    1110 <BitswapAudio+0x10>
xor    %eax,%eax
pop    %rbp
ret

x86 assembly (clang, -O2):
<BitswapAudio>:
test   %rdx,%rdx
je     118f <BitswapAudio+0x8f>
lea    -0x1(%rdx),%r8
mov    %rdx,%r10
and    $0x3,%r10
je     113e <BitswapAudio+0x3e>
xor    %ecx,%ecx
lea    0xee1(%rip),%r9
nop
movzbl (%rsi,%rcx,1),%eax
movzbl (%rax,%r9,1),%eax
mov    %al,(%rdi,%rcx,1)
add    $0x1,%rcx
cmp    %rcx,%r10
jne    1120 <BitswapAudio+0x20>
sub    %rcx,%rdx
add    %rcx,%rsi
add    %rcx,%rdi
cmp    $0x3,%r8
jb     118f <BitswapAudio+0x8f>
xor    %eax,%eax
lea    0xeb3(%rip),%r8
nopl   (%rax)
movzbl (%rsi,%rax,1),%ecx
movzbl (%rcx,%r8,1),%ecx
mov    %cl,(%rdi,%rax,1)
movzbl 0x1(%rsi,%rax,1),%ecx
movzbl (%rcx,%r8,1),%ecx
mov    %cl,0x1(%rdi,%rax,1)
movzbl 0x2(%rsi,%rax,1),%ecx
movzbl (%rcx,%r8,1),%ecx
mov    %cl,0x2(%rdi,%rax,1)
movzbl 0x3(%rsi,%rax,1),%ecx
movzbl (%rcx,%r8,1),%ecx
mov    %cl,0x3(%rdi,%rax,1)
add    $0x4,%rax
cmp    %rax,%rdx
jne    1150 <BitswapAudio+0x50>
xor    %eax,%eax
ret

LLVM IR (-O0):
@BitswapAudio.Lookup = internal constant [256 x i8] c"\00\80@\C0 \A0`\E0\10\90P\D00\B0p\F0\08\88H\C8(\A8h\E8\18\98X\D88\B8x\F8\04\84D\C4$\A4d\E4\14\94T\D44\B4t\F4\0C\8CL\CC,\ACl\EC\1C\9C\\\DC<\BC|\FC\02\82B\C2\22\A2b\E2\12\92R\D22\B2r\F2\0A\8AJ\CA*\AAj\EA\1A\9AZ\DA:\BAz\FA\06\86F\C6&\A6f\E6\16\96V\D66\B6v\F6\0E\8EN\CE.\AEn\EE\1E\9E^\DE>\BE~\FE\01\81A\C1!\A1a\E1\11\91Q\D11\B1q\F1\09\89I\C9)\A9i\E9\19\99Y\D99\B9y\F9\05\85E\C5%\A5e\E5\15\95U\D55\B5u\F5\0D\8DM\CD-\ADm\ED\1D\9D]\DD=\BD}\FD\03\83C\C3#\A3c\E3\13\93S\D33\B3s\F3\0B\8BK\CB+\ABk\EB\1B\9B[\DB;\BB{\FB\07\87G\C7'\A7g\E7\17\97W\D77\B7w\F7\0F\8FO\CF/\AFo\EF\1F\9F_\DF?\BF\7F\FF"
define i32 @BitswapAudio(i8* %0, i8* %1, i64 %2) {
%4 = alloca i8*
%5 = alloca i8*
%6 = alloca i64
store i8* %0, i8** %4
store i8* %1, i8** %5
store i64 %2, i64* %6
br label %7
7: ; preds = %11, %3
%8 = load i64, i64* %6
%9 = add i64 %8, -1
store i64 %9, i64* %6
%10 = icmp ne i64 %8, 0
br i1 %10, label %11, label %20
11: ; preds = %7
%12 = load i8*, i8** %5
%13 = getelementptr inbounds i8, i8* %12, i32 1
store i8* %13, i8** %5
%14 = load i8, i8* %12
%15 = zext i8 %14 to i64
%16 = getelementptr inbounds [256 x i8], [256 x i8]* @BitswapAudio.Lookup, i64 0, i64 %15
%17 = load i8, i8* %16
%18 = load i8*, i8** %4
%19 = getelementptr inbounds i8, i8* %18, i32 1
store i8* %19, i8** %4
store i8 %17, i8* %18
br label %7
20: ; preds = %7
ret i32 0
}

LLVM IR (-O2):
@BitswapAudio.Lookup = internal unnamed_addr constant [256 x i8] c"\00\80@\C0 \A0`\E0\10\90P\D00\B0p\F0\08\88H\C8(\A8h\E8\18\98X\D88\B8x\F8\04\84D\C4$\A4d\E4\14\94T\D44\B4t\F4\0C\8CL\CC,\ACl\EC\1C\9C\\\DC<\BC|\FC\02\82B\C2\22\A2b\E2\12\92R\D22\B2r\F2\0A\8AJ\CA*\AAj\EA\1A\9AZ\DA:\BAz\FA\06\86F\C6&\A6f\E6\16\96V\D66\B6v\F6\0E\8EN\CE.\AEn\EE\1E\9E^\DE>\BE~\FE\01\81A\C1!\A1a\E1\11\91Q\D11\B1q\F1\09\89I\C9)\A9i\E9\19\99Y\D99\B9y\F9\05\85E\C5%\A5e\E5\15\95U\D55\B5u\F5\0D\8DM\CD-\ADm\ED\1D\9D]\DD=\BD}\FD\03\83C\C3#\A3c\E3\13\93S\D33\B3s\F3\0B\8BK\CB+\ABk\EB\1B\9B[\DB;\BB{\FB\07\87G\C7'\A7g\E7\17\97W\D77\B7w\F7\0F\8FO\CF/\AFo\EF\1F\9F_\DF?\BF\7F\FF"
define i32 @BitswapAudio(i8* nocapture writeonly %0, i8* nocapture %1, i64 %2) {
%4 = icmp eq i64 %2, 0
br i1 %4, label %58, label %5
5: ; preds = %3
%6 = add i64 %2, -1
%7 = and i64 %2, 3
%8 = icmp eq i64 %7, 0
br i1 %8, label %23, label %9
9: ; preds = %5, %9
%10 = phi i64 [ %14, %9 ], [ %2, %5 ]
%11 = phi i8* [ %15, %9 ], [ %1, %5 ]
%12 = phi i8* [ %20, %9 ], [ %0, %5 ]
%13 = phi i64 [ %21, %9 ], [ 0, %5 ]
%14 = add i64 %10, -1
%15 = getelementptr inbounds i8, i8* %11, i64 1
%16 = load i8, i8* %11
%17 = zext i8 %16 to i64
%18 = getelementptr inbounds [256 x i8], [256 x i8]* @BitswapAudio.Lookup, i64 0, i64 %17
%19 = load i8, i8* %18
%20 = getelementptr inbounds i8, i8* %12, i64 1
store i8 %19, i8* %12
%21 = add i64 %13, 1
%22 = icmp eq i64 %21, %7
br i1 %22, label %23, label %9
23: ; preds = %9, %5
%24 = phi i64 [ %2, %5 ], [ %14, %9 ]
%25 = phi i8* [ %1, %5 ], [ %15, %9 ]
%26 = phi i8* [ %0, %5 ], [ %20, %9 ]
%27 = icmp ult i64 %6, 3
br i1 %27, label %58, label %28
28: ; preds = %23, %28
%29 = phi i64 [ %50, %28 ], [ %24, %23 ]
%30 = phi i8* [ %51, %28 ], [ %25, %23 ]
%31 = phi i8* [ %56, %28 ], [ %26, %23 ]
%32 = getelementptr inbounds i8, i8* %30, i64 1
%33 = load i8, i8* %30
%34 = zext i8 %33 to i64
%35 = getelementptr inbounds [256 x i8], [256 x i8]* @BitswapAudio.Lookup, i64 0, i64 %34
%36 = load i8, i8* %35
%37 = getelementptr inbounds i8, i8* %31, i64 1
store i8 %36, i8* %31
%38 = getelementptr inbounds i8, i8* %30, i64 2
%39 = load i8, i8* %32
%40 = zext i8 %39 to i64
%41 = getelementptr inbounds [256 x i8], [256 x i8]* @BitswapAudio.Lookup, i64 0, i64 %40
%42 = load i8, i8* %41
%43 = getelementptr inbounds i8, i8* %31, i64 2
store i8 %42, i8* %37
%44 = getelementptr inbounds i8, i8* %30, i64 3
%45 = load i8, i8* %38
%46 = zext i8 %45 to i64
%47 = getelementptr inbounds [256 x i8], [256 x i8]* @BitswapAudio.Lookup, i64 0, i64 %46
%48 = load i8, i8* %47
%49 = getelementptr inbounds i8, i8* %31, i64 3
store i8 %48, i8* %43
%50 = add i64 %29, -4
%51 = getelementptr inbounds i8, i8* %30, i64 4
%52 = load i8, i8* %44
%53 = zext i8 %52 to i64
%54 = getelementptr inbounds [256 x i8], [256 x i8]* @BitswapAudio.Lookup, i64 0, i64 %53
%55 = load i8, i8* %54
%56 = getelementptr inbounds i8, i8* %31, i64 4
store i8 %55, i8* %49
%57 = icmp eq i64 %50, 0
br i1 %57, label %58, label %28
58: ; preds = %23, %28, %3
ret i32 0
}