void MV_8BitReverbFast(signed char *src, signed char *dest, int count,
                       int shift) {
  unsigned char sample0, c;
  c = 128 - (128 >> shift);
  do {
    sample0 = *((unsigned char *)src) >> shift;
    *dest = sample0 + c + ((sample0 ^ 128) >> 7);
    src++;
    dest++;
  } while (count-- > 0);
}


x86 assembly (clang, -O0):
<MV_8BitReverbFast>:
push   %rbp
mov    %rsp,%rbp
mov    %rdi,-0x8(%rbp)
mov    %rsi,-0x10(%rbp)
mov    %edx,-0x14(%rbp)
mov    %ecx,-0x18(%rbp)
mov    -0x18(%rbp),%ecx
mov    $0x80,%eax
sar    %cl,%eax
mov    %eax,%ecx
mov    $0x80,%eax
sub    %ecx,%eax
mov    %al,-0x1a(%rbp)
mov    -0x8(%rbp),%rax
movzbl (%rax),%eax
mov    -0x18(%rbp),%ecx
sar    %cl,%eax
mov    %al,-0x19(%rbp)
movzbl -0x19(%rbp),%eax
movzbl -0x1a(%rbp),%ecx
add    %ecx,%eax
movzbl -0x19(%rbp),%ecx
xor    $0x80,%ecx
sar    $0x7,%ecx
add    %ecx,%eax
mov    %al,%cl
mov    -0x10(%rbp),%rax
mov    %cl,(%rax)
mov    -0x8(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x8(%rbp)
mov    -0x10(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x10(%rbp)
mov    -0x14(%rbp),%eax
mov    %eax,%ecx
add    $0xffffffff,%ecx
mov    %ecx,-0x14(%rbp)
cmp    $0x0,%eax
jg     1128 <MV_8BitReverbFast+0x28>
pop    %rbp
ret

x86 assembly (clang, -O2):
<MV_8BitReverbFast>:
push   %r15
push   %r14
push   %r12
push   %rbx
mov    $0x80,%r9d
mov    $0x80,%eax
shr    %cl,%eax
sub    %eax,%r9d
xor    %eax,%eax
test   %edx,%edx
mov    $0x0,%ebx
cmovs  %edx,%ebx
mov    %edx,%r10d
sub    %ebx,%r10d
cmp    $0x7,%r10d
jb     1152 <MV_8BitReverbFast+0x52>
test   %edx,%edx
cmovs  %edx,%eax
mov    %edx,%ebx
sub    %eax,%ebx
lea    (%rdi,%rbx,1),%rax
add    $0x1,%rax
cmp    %rsi,%rax
jbe    1189 <MV_8BitReverbFast+0x89>
lea    (%rsi,%rbx,1),%rax
add    $0x1,%rax
cmp    %rdi,%rax
jbe    1189 <MV_8BitReverbFast+0x89>
mov    %rsi,%r11
mov    %rdi,%rax
add    $0x1,%edx
xor    %esi,%esi
nopl   (%rax)
movzbl (%rax,%rsi,1),%edi
shr    %cl,%edi
lea    (%r9,%rdi,1),%ebx
shr    $0x7,%edi
xor    $0x1,%edi
add    %ebx,%edi
mov    %dil,(%r11,%rsi,1)
add    $0xffffffff,%edx
add    $0x1,%rsi
test   %edx,%edx
jg     1160 <MV_8BitReverbFast+0x60>
pop    %rbx
pop    %r12
pop    %r14
pop    %r15
ret
movabs $0x1fffffff0,%r8
xor    %r11d,%r11d
movd   %ecx,%xmm9
movd   %r9d,%xmm8
cmp    $0xf,%r10d
jae    11ae <MV_8BitReverbFast+0xae>
xor    %r12d,%r12d
jmp    1487 <MV_8BitReverbFast+0x387>
add    $0x1,%r10
mov    %r10,%r12
and    %r8,%r12
pshufd $0x0,%xmm8,%xmm12
lea    -0x10(%r12),%rax
mov    %rax,%r14
shr    $0x4,%r14
add    $0x1,%r14
test   %rax,%rax
je     1547 <MV_8BitReverbFast+0x447>
mov    %r14,%r15
and    $0xfffffffffffffffe,%r15
xor    %ebx,%ebx
pxor   %xmm13,%xmm13
xorps  %xmm14,%xmm14
movss  %xmm9,%xmm14
movdqa 0xe09(%rip),%xmm10
movdqa 0xe10(%rip),%xmm11
movdqu (%rdi,%rbx,1),%xmm7
movdqa %xmm7,%xmm1
punpckhbw %xmm13,%xmm1
movdqa %xmm1,%xmm5
punpcklwd %xmm13,%xmm1
punpcklbw %xmm13,%xmm7
movdqa %xmm7,%xmm0
punpckhwd %xmm13,%xmm0
punpcklwd %xmm13,%xmm7
psrld  %xmm14,%xmm7
psrld  %xmm14,%xmm0
psrld  %xmm14,%xmm1
punpckhwd %xmm13,%xmm5
psrld  %xmm14,%xmm5
movdqa %xmm12,%xmm2
paddd  %xmm5,%xmm2
movdqa %xmm12,%xmm6
paddd  %xmm1,%xmm6
movdqa %xmm12,%xmm3
paddd  %xmm0,%xmm3
movdqa %xmm12,%xmm4
paddd  %xmm7,%xmm4
psrld  $0x7,%xmm7
psrld  $0x7,%xmm0
psrld  $0x7,%xmm1
psrld  $0x7,%xmm5
pxor   %xmm10,%xmm5
paddd  %xmm2,%xmm5
pxor   %xmm10,%xmm1
paddd  %xmm6,%xmm1
pxor   %xmm10,%xmm0
paddd  %xmm3,%xmm0
pxor   %xmm10,%xmm7
paddd  %xmm4,%xmm7
pand   %xmm11,%xmm5
pand   %xmm11,%xmm1
packuswb %xmm5,%xmm1
pand   %xmm11,%xmm0
pand   %xmm11,%xmm7
packuswb %xmm0,%xmm7
packuswb %xmm1,%xmm7
movdqu %xmm7,(%rsi,%rbx,1)
movdqu 0x10(%rdi,%rbx,1),%xmm7
movdqa %xmm7,%xmm1
punpckhbw %xmm13,%xmm1
movdqa %xmm1,%xmm5
punpckhwd %xmm13,%xmm5
punpcklwd %xmm13,%xmm1
punpcklbw %xmm13,%xmm7
movdqa %xmm7,%xmm0
punpckhwd %xmm13,%xmm0
punpcklwd %xmm13,%xmm7
psrld  %xmm14,%xmm7
psrld  %xmm14,%xmm0
psrld  %xmm14,%xmm1
psrld  %xmm14,%xmm5
movdqa %xmm12,%xmm2
paddd  %xmm5,%xmm2
movdqa %xmm12,%xmm3
paddd  %xmm1,%xmm3
movdqa %xmm12,%xmm4
paddd  %xmm0,%xmm4
movdqa %xmm12,%xmm6
paddd  %xmm7,%xmm6
psrld  $0x7,%xmm7
psrld  $0x7,%xmm0
psrld  $0x7,%xmm1
psrld  $0x7,%xmm5
pxor   %xmm10,%xmm5
paddd  %xmm2,%xmm5
pxor   %xmm10,%xmm1
paddd  %xmm3,%xmm1
pxor   %xmm10,%xmm0
paddd  %xmm4,%xmm0
pxor   %xmm10,%xmm7
paddd  %xmm6,%xmm7
pand   %xmm11,%xmm5
pand   %xmm11,%xmm1
packuswb %xmm5,%xmm1
pand   %xmm11,%xmm0
pand   %xmm11,%xmm7
packuswb %xmm0,%xmm7
packuswb %xmm1,%xmm7
movdqu %xmm7,0x10(%rsi,%rbx,1)
add    $0x20,%rbx
add    $0xfffffffffffffffe,%r15
jne    1200 <MV_8BitReverbFast+0x100>
test   $0x1,%r14b
je     146a <MV_8BitReverbFast+0x36a>
movdqu (%rdi,%rbx,1),%xmm3
pxor   %xmm0,%xmm0
movdqa %xmm3,%xmm4
punpckhbw %xmm0,%xmm4
movdqa %xmm4,%xmm5
punpckhwd %xmm0,%xmm5
punpcklwd %xmm0,%xmm4
punpcklbw %xmm0,%xmm3
movdqa %xmm3,%xmm1
punpckhwd %xmm0,%xmm1
punpcklwd %xmm0,%xmm3
movss  %xmm9,%xmm0
psrld  %xmm0,%xmm3
psrld  %xmm0,%xmm1
psrld  %xmm0,%xmm4
psrld  %xmm0,%xmm5
movdqa %xmm12,%xmm0
paddd  %xmm5,%xmm0
movdqa %xmm12,%xmm2
paddd  %xmm4,%xmm2
movdqa %xmm12,%xmm6
paddd  %xmm1,%xmm6
paddd  %xmm3,%xmm12
psrld  $0x7,%xmm3
psrld  $0x7,%xmm1
psrld  $0x7,%xmm4
psrld  $0x7,%xmm5
movdqa 0xbe0(%rip),%xmm7
pxor   %xmm7,%xmm5
paddd  %xmm0,%xmm5
pxor   %xmm7,%xmm4
paddd  %xmm2,%xmm4
pxor   %xmm7,%xmm1
paddd  %xmm6,%xmm1
pxor   %xmm7,%xmm3
paddd  %xmm12,%xmm3
movdqa 0xbc7(%rip),%xmm0
pand   %xmm0,%xmm5
pand   %xmm0,%xmm4
packuswb %xmm5,%xmm4
pand   %xmm0,%xmm1
pand   %xmm0,%xmm3
packuswb %xmm1,%xmm3
packuswb %xmm4,%xmm3
movdqu %xmm3,(%rsi,%rbx,1)
cmp    %r12,%r10
je     1181 <MV_8BitReverbFast+0x81>
test   $0x8,%r10b
jne    1487 <MV_8BitReverbFast+0x387>
add    %r12,%rdi
add    %r12,%rsi
sub    %r12d,%edx
jmp    1152 <MV_8BitReverbFast+0x52>
test   %edx,%edx
cmovs  %edx,%r11d
mov    %edx,%r10d
sub    %r11d,%r10d
add    $0x1,%r10
add    $0x8,%r8
and    %r10,%r8
sub    %r8d,%edx
lea    (%rsi,%r8,1),%r11
lea    (%rdi,%r8,1),%rax
pshufd $0x0,%xmm8,%xmm3
pxor   %xmm1,%xmm1
pxor   %xmm2,%xmm2
movss  %xmm9,%xmm2
movdqa 0xb3b(%rip),%xmm8
movdqa 0xb43(%rip),%xmm4
nopl   (%rax)
movq   (%rdi,%r12,1),%xmm5
punpcklbw %xmm1,%xmm5
movdqa %xmm5,%xmm6
punpckhwd %xmm1,%xmm6
punpcklwd %xmm1,%xmm5
psrld  %xmm2,%xmm5
psrld  %xmm2,%xmm6
movdqa %xmm3,%xmm7
paddd  %xmm6,%xmm7
movdqa %xmm3,%xmm0
paddd  %xmm5,%xmm0
psrld  $0x7,%xmm5
psrld  $0x7,%xmm6
pxor   %xmm8,%xmm6
paddd  %xmm7,%xmm6
pxor   %xmm8,%xmm5
paddd  %xmm0,%xmm5
pand   %xmm4,%xmm6
pand   %xmm4,%xmm5
packuswb %xmm6,%xmm5
packuswb %xmm5,%xmm5
movq   %xmm5,(%rsi,%r12,1)
add    $0x8,%r12
cmp    %r12,%r8
jne    14d0 <MV_8BitReverbFast+0x3d0>
cmp    %r8,%r10
jne    1158 <MV_8BitReverbFast+0x58>
jmp    1181 <MV_8BitReverbFast+0x81>
xor    %ebx,%ebx
test   $0x1,%r14b
jne    13a2 <MV_8BitReverbFast+0x2a2>
jmp    146a <MV_8BitReverbFast+0x36a>

LLVM IR (-O0):
define void @MV_8BitReverbFast(i8* %0, i8* %1, i32 %2, i32 %3) {
%5 = alloca i8*
%6 = alloca i8*
%7 = alloca i32
%8 = alloca i32
%9 = alloca i8
%10 = alloca i8
store i8* %0, i8** %5
store i8* %1, i8** %6
store i32 %2, i32* %7
store i32 %3, i32* %8
%11 = load i32, i32* %8
%12 = ashr i32 128, %11
%13 = sub nsw i32 128, %12
%14 = trunc i32 %13 to i8
store i8 %14, i8* %10
br label %15
15: ; preds = %38, %4
%16 = load i8*, i8** %5
%17 = load i8, i8* %16
%18 = zext i8 %17 to i32
%19 = load i32, i32* %8
%20 = ashr i32 %18, %19
%21 = trunc i32 %20 to i8
store i8 %21, i8* %9
%22 = load i8, i8* %9
%23 = zext i8 %22 to i32
%24 = load i8, i8* %10
%25 = zext i8 %24 to i32
%26 = add nsw i32 %23, %25
%27 = load i8, i8* %9
%28 = zext i8 %27 to i32
%29 = xor i32 %28, 128
%30 = ashr i32 %29, 7
%31 = add nsw i32 %26, %30
%32 = trunc i32 %31 to i8
%33 = load i8*, i8** %6
store i8 %32, i8* %33
%34 = load i8*, i8** %5
%35 = getelementptr inbounds i8, i8* %34, i32 1
store i8* %35, i8** %5
%36 = load i8*, i8** %6
%37 = getelementptr inbounds i8, i8* %36, i32 1
store i8* %37, i8** %6
br label %38
38: ; preds = %15
%39 = load i32, i32* %7
%40 = add nsw i32 %39, -1
store i32 %40, i32* %7
%41 = icmp sgt i32 %39, 0
br i1 %41, label %15, label %42
42: ; preds = %38
ret void
}

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