void hw_fixspisamples(char *inbuf, long inlen, char *outbuf, long outlen) {
  long inpos, outpos;
  unsigned char c, o, olen, bitpos;
  outpos = 0;
  o = 0;
  olen = 0;
  for (inpos = 0; inpos < inlen; inpos++) {
    c = inbuf[inpos];
    o = (o << 1) | ((c & 0x80) >> 7);
    olen++;
    if (olen == 8) {
      if (outpos < outlen)
        outbuf[outpos++] = o;
      olen = 0;
      o = 0;
    }
    for (bitpos = 0; bitpos < 8; bitpos++) {
      o = (o << 1) | ((c & 0x80) >> 7);
      olen++;
      if (olen == 8) {
        if (outpos < outlen)
          outbuf[outpos++] = o;
        olen = 0;
        o = 0;
      }
      c = c << 1;
    }
    if (outpos >= outlen)
      return;
  }
}


x86 assembly (clang, -O0):
<hw_fixspisamples>:
push   %rbp
mov    %rsp,%rbp
mov    %rdi,-0x8(%rbp)
mov    %rsi,-0x10(%rbp)
mov    %rdx,-0x18(%rbp)
mov    %rcx,-0x20(%rbp)
movq   $0x0,-0x30(%rbp)
movb   $0x0,-0x32(%rbp)
movb   $0x0,-0x33(%rbp)
movq   $0x0,-0x28(%rbp)
mov    -0x28(%rbp),%rax
cmp    -0x10(%rbp),%rax
jge    1253 <hw_fixspisamples+0x153>
mov    -0x8(%rbp),%rax
mov    -0x28(%rbp),%rcx
mov    (%rax,%rcx,1),%al
mov    %al,-0x31(%rbp)
movzbl -0x32(%rbp),%eax
shl    $0x1,%eax
movzbl -0x31(%rbp),%ecx
and    $0x80,%ecx
sar    $0x7,%ecx
or     %ecx,%eax
mov    %al,-0x32(%rbp)
mov    -0x33(%rbp),%al
add    $0x1,%al
mov    %al,-0x33(%rbp)
movzbl -0x33(%rbp),%eax
cmp    $0x8,%eax
jne    11a5 <hw_fixspisamples+0xa5>
mov    -0x30(%rbp),%rax
cmp    -0x20(%rbp),%rax
jge    119d <hw_fixspisamples+0x9d>
mov    -0x32(%rbp),%dl
mov    -0x18(%rbp),%rax
mov    -0x30(%rbp),%rcx
mov    %rcx,%rsi
add    $0x1,%rsi
mov    %rsi,-0x30(%rbp)
mov    %dl,(%rax,%rcx,1)
movb   $0x0,-0x33(%rbp)
movb   $0x0,-0x32(%rbp)
movb   $0x0,-0x34(%rbp)
movzbl -0x34(%rbp),%eax
cmp    $0x8,%eax
jge    122a <hw_fixspisamples+0x12a>
movzbl -0x32(%rbp),%eax
shl    $0x1,%eax
movzbl -0x31(%rbp),%ecx
and    $0x80,%ecx
sar    $0x7,%ecx
or     %ecx,%eax
mov    %al,-0x32(%rbp)
mov    -0x33(%rbp),%al
add    $0x1,%al
mov    %al,-0x33(%rbp)
movzbl -0x33(%rbp),%eax
cmp    $0x8,%eax
jne    1213 <hw_fixspisamples+0x113>
mov    -0x30(%rbp),%rax
cmp    -0x20(%rbp),%rax
jge    120b <hw_fixspisamples+0x10b>
mov    -0x32(%rbp),%dl
mov    -0x18(%rbp),%rax
mov    -0x30(%rbp),%rcx
mov    %rcx,%rsi
add    $0x1,%rsi
mov    %rsi,-0x30(%rbp)
mov    %dl,(%rax,%rcx,1)
movb   $0x0,-0x33(%rbp)
movb   $0x0,-0x32(%rbp)
movzbl -0x31(%rbp),%eax
shl    $0x1,%eax
mov    %al,-0x31(%rbp)
mov    -0x34(%rbp),%al
add    $0x1,%al
mov    %al,-0x34(%rbp)
jmp    11a9 <hw_fixspisamples+0xa9>
mov    -0x30(%rbp),%rax
cmp    -0x20(%rbp),%rax
jl     123d <hw_fixspisamples+0x13d>
jmp    1253 <hw_fixspisamples+0x153>
jmp    1242 <hw_fixspisamples+0x142>
mov    -0x28(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x28(%rbp)
jmp    112c <hw_fixspisamples+0x2c>
pop    %rbp
ret

x86 assembly (clang, -O2):
<hw_fixspisamples>:
push   %rbp
push   %rbx
test   %rsi,%rsi
jle    1315 <hw_fixspisamples+0x215>
mov    $0x1,%r8d
xor    %r11d,%r11d
xor    %eax,%eax
xor    %r9d,%r9d
nopl   0x0(%rax)
movzbl -0x1(%rdi,%r8,1),%r10d
mov    %r10d,%ebx
shr    $0x7,%bl
add    %al,%al
or     %bl,%al
cmp    $0x7,%r11b
jne    1150 <hw_fixspisamples+0x50>
cmp    %rcx,%r9
jge    1143 <hw_fixspisamples+0x43>
mov    %al,(%rdx,%r9,1)
add    $0x1,%r9
mov    $0x2,%r11b
jmp    1170 <hw_fixspisamples+0x70>
nopl   0x0(%rax,%rax,1)
add    %al,%al
or     %bl,%al
cmp    $0x6,%r11b
jne    11f0 <hw_fixspisamples+0xf0>
mov    $0x1,%r11b
cmp    %rcx,%r9
jge    116e <hw_fixspisamples+0x6e>
mov    %al,(%rdx,%r9,1)
add    $0x1,%r9
xor    %ebx,%ebx
lea    (%r10,%r10,1),%ebp
add    %bl,%bl
shr    $0x7,%bpl
or     %bl,%bpl
lea    0x0(,%r10,4),%ebx
add    %bpl,%bpl
shr    $0x7,%bl
or     %bpl,%bl
cmp    $0x7,%r11b
jne    11b0 <hw_fixspisamples+0xb0>
mov    $0x1,%r11b
cmp    %rcx,%r9
jge    11a4 <hw_fixspisamples+0xa4>
mov    %bl,(%rdx,%r9,1)
add    $0x1,%r9
xor    %ebx,%ebx
jmp    1224 <hw_fixspisamples+0x124>
nopl   0x0(%rax,%rax,1)
lea    0x0(,%r10,8),%ebp
add    %bl,%bl
shr    $0x7,%bpl
or     %bl,%bpl
add    $0x2,%r11b
cmp    $0x8,%r11b
jne    1235 <hw_fixspisamples+0x135>
cmp    %rcx,%r9
jge    11d8 <hw_fixspisamples+0xd8>
mov    %bpl,(%rdx,%r9,1)
add    $0x1,%r9
mov    %r10d,%eax
shr    $0x3,%al
and    $0x1,%al
mov    $0x2,%r11b
jmp    125c <hw_fixspisamples+0x15c>
cs nopw 0x0(%rax,%rax,1)
nop
lea    (%r10,%r10,1),%ebp
add    %al,%al
shr    $0x7,%bpl
or     %al,%bpl
add    $0x3,%r11b
cmp    $0x8,%r11b
jne    117d <hw_fixspisamples+0x7d>
cmp    %rcx,%r9
jge    1218 <hw_fixspisamples+0x118>
mov    %bpl,(%rdx,%r9,1)
add    $0x1,%r9
mov    %r10d,%ebx
shr    $0x5,%bl
and    $0x1,%bl
mov    $0x2,%r11b
lea    0x0(,%r10,8),%ebp
add    %bl,%bl
shr    $0x7,%bpl
or     %bl,%bpl
mov    %r10d,%eax
shl    $0x4,%al
add    %bpl,%bpl
shr    $0x7,%al
or     %bpl,%al
cmp    $0x7,%r11b
jne    1270 <hw_fixspisamples+0x170>
mov    $0x1,%r11b
cmp    %rcx,%r9
jge    125a <hw_fixspisamples+0x15a>
mov    %al,(%rdx,%r9,1)
add    $0x1,%r9
xor    %eax,%eax
mov    %r10d,%ebx
shl    $0x5,%bl
add    %al,%al
shr    $0x7,%bl
or     %al,%bl
jmp    12a0 <hw_fixspisamples+0x1a0>
nopl   0x0(%rax,%rax,1)
mov    %r10d,%ebx
shl    $0x5,%bl
add    %al,%al
shr    $0x7,%bl
or     %al,%bl
add    $0x2,%r11b
cmp    $0x8,%r11b
jne    12a0 <hw_fixspisamples+0x1a0>
cmp    %rcx,%r9
jge    1294 <hw_fixspisamples+0x194>
mov    %bl,(%rdx,%r9,1)
add    $0x1,%r9
mov    %r10d,%eax
shr    %al
and    $0x1,%al
mov    $0x2,%r11b
jmp    12c5 <hw_fixspisamples+0x1c5>
mov    %r10d,%eax
shl    $0x6,%al
add    %bl,%bl
shr    $0x7,%al
or     %bl,%al
cmp    $0x7,%r11b
jne    12d0 <hw_fixspisamples+0x1d0>
mov    $0x1,%r11b
cmp    %rcx,%r9
jge    12c3 <hw_fixspisamples+0x1c3>
mov    %al,(%rdx,%r9,1)
add    $0x1,%r9
xor    %eax,%eax
and    $0x1,%r10b
add    %al,%al
or     %r10b,%al
jmp    1300 <hw_fixspisamples+0x200>
and    $0x1,%r10b
add    %al,%al
or     %r10b,%al
add    $0x2,%r11b
cmp    $0x8,%r11b
jne    1300 <hw_fixspisamples+0x200>
cmp    %rcx,%r9
jge    12f0 <hw_fixspisamples+0x1f0>
mov    %al,(%rdx,%r9,1)
add    $0x1,%r9
xor    %eax,%eax
xor    %r11d,%r11d
cs nopw 0x0(%rax,%rax,1)
nop
cmp    %rcx,%r9
jge    1315 <hw_fixspisamples+0x215>
lea    0x1(%r8),%rbp
cmp    %rsi,%r8
mov    %rbp,%r8
jl     1120 <hw_fixspisamples+0x20>
pop    %rbx
pop    %rbp
ret

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

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