int unpack3to4(int *in, int *out, int start_in, int stop_in, int start_out,
               int stop_out, int mode) {
  unsigned char *pin, *pout;
  int i, size, size_in, size_out;
  size_in = stop_in - start_in + 1;
  size = size_in * 4 / 3;
  if (start_out <= 0)
    start_out = 1;
  if (stop_out <= 0)
    stop_out = start_out + size - 1;
  size_out = stop_out - start_out + 1;
  if (size > size_out)
    size = size_out;
  in += start_in - 1;
  out += start_out - 1;
  pin = (unsigned char *)in;
  pout = (unsigned char *)out;
  if (mode == 0) {
    for (i = 0; i < size; i++) {
      pout[0] = 0;
      pout[1] = pin[0];
      pout[2] = pin[1];
      pout[3] = pin[2];
      pin += 3;
      pout += 4;
    }
  } else if (mode == 1) {
    for (i = 0; i < size; i++) {
      pout[0] = pin[2];
      pout[1] = pin[1];
      pout[2] = pin[0];
      pout[3] = 0;
      pin += 3;
      pout += 4;
    }
  } else if (mode == 2) {
    for (i = 0; i < size; i++) {
      pout[0] = 0;
      pout[1] = pin[2];
      pout[2] = pin[1];
      pout[3] = pin[0];
      pin += 3;
      pout += 4;
    }
  } else if (mode == 3) {
    for (i = 0; i < size; i++) {
      pout[0] = pin[0];
      pout[1] = pin[1];
      pout[2] = pin[2];
      pout[3] = 0;
      pin += 3;
      pout += 4;
    }
  } else
    return size * 3 / 4;
  return size;
}


x86 assembly (clang, -O0):
<unpack3to4>:
push   %rbp
mov    %rsp,%rbp
mov    0x10(%rbp),%eax
mov    %rdi,-0x10(%rbp)
mov    %rsi,-0x18(%rbp)
mov    %edx,-0x1c(%rbp)
mov    %ecx,-0x20(%rbp)
mov    %r8d,-0x24(%rbp)
mov    %r9d,-0x28(%rbp)
mov    -0x20(%rbp),%eax
sub    -0x1c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x44(%rbp)
mov    -0x44(%rbp),%eax
shl    $0x2,%eax
mov    $0x3,%ecx
cltd
idiv   %ecx
mov    %eax,-0x40(%rbp)
cmpl   $0x0,-0x24(%rbp)
jg     114b <unpack3to4+0x4b>
movl   $0x1,-0x24(%rbp)
cmpl   $0x0,-0x28(%rbp)
jg     1161 <unpack3to4+0x61>
mov    -0x24(%rbp),%eax
add    -0x40(%rbp),%eax
sub    $0x1,%eax
mov    %eax,-0x28(%rbp)
mov    -0x28(%rbp),%eax
sub    -0x24(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x48(%rbp)
mov    -0x40(%rbp),%eax
cmp    -0x48(%rbp),%eax
jle    117f <unpack3to4+0x7f>
mov    -0x48(%rbp),%eax
mov    %eax,-0x40(%rbp)
mov    -0x1c(%rbp),%ecx
sub    $0x1,%ecx
mov    -0x10(%rbp),%rax
movslq %ecx,%rcx
shl    $0x2,%rcx
add    %rcx,%rax
mov    %rax,-0x10(%rbp)
mov    -0x24(%rbp),%ecx
sub    $0x1,%ecx
mov    -0x18(%rbp),%rax
movslq %ecx,%rcx
shl    $0x2,%rcx
add    %rcx,%rax
mov    %rax,-0x18(%rbp)
mov    -0x10(%rbp),%rax
mov    %rax,-0x30(%rbp)
mov    -0x18(%rbp),%rax
mov    %rax,-0x38(%rbp)
cmpl   $0x0,0x10(%rbp)
jne    1237 <unpack3to4+0x137>
movl   $0x0,-0x3c(%rbp)
mov    -0x3c(%rbp),%eax
cmp    -0x40(%rbp),%eax
jge    1232 <unpack3to4+0x132>
mov    -0x38(%rbp),%rax
movb   $0x0,(%rax)
mov    -0x30(%rbp),%rax
mov    (%rax),%cl
mov    -0x38(%rbp),%rax
mov    %cl,0x1(%rax)
mov    -0x30(%rbp),%rax
mov    0x1(%rax),%cl
mov    -0x38(%rbp),%rax
mov    %cl,0x2(%rax)
mov    -0x30(%rbp),%rax
mov    0x2(%rax),%cl
mov    -0x38(%rbp),%rax
mov    %cl,0x3(%rax)
mov    -0x30(%rbp),%rax
add    $0x3,%rax
mov    %rax,-0x30(%rbp)
mov    -0x38(%rbp),%rax
add    $0x4,%rax
mov    %rax,-0x38(%rbp)
mov    -0x3c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x3c(%rbp)
jmp    11d0 <unpack3to4+0xd0>
jmp    13c2 <unpack3to4+0x2c2>
cmpl   $0x1,0x10(%rbp)
jne    12af <unpack3to4+0x1af>
movl   $0x0,-0x3c(%rbp)
mov    -0x3c(%rbp),%eax
cmp    -0x40(%rbp),%eax
jge    12aa <unpack3to4+0x1aa>
mov    -0x30(%rbp),%rax
mov    0x2(%rax),%cl
mov    -0x38(%rbp),%rax
mov    %cl,(%rax)
mov    -0x30(%rbp),%rax
mov    0x1(%rax),%cl
mov    -0x38(%rbp),%rax
mov    %cl,0x1(%rax)
mov    -0x30(%rbp),%rax
mov    (%rax),%cl
mov    -0x38(%rbp),%rax
mov    %cl,0x2(%rax)
mov    -0x38(%rbp),%rax
movb   $0x0,0x3(%rax)
mov    -0x30(%rbp),%rax
add    $0x3,%rax
mov    %rax,-0x30(%rbp)
mov    -0x38(%rbp),%rax
add    $0x4,%rax
mov    %rax,-0x38(%rbp)
mov    -0x3c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x3c(%rbp)
jmp    1248 <unpack3to4+0x148>
jmp    13bd <unpack3to4+0x2bd>
cmpl   $0x2,0x10(%rbp)
jne    1327 <unpack3to4+0x227>
movl   $0x0,-0x3c(%rbp)
mov    -0x3c(%rbp),%eax
cmp    -0x40(%rbp),%eax
jge    1322 <unpack3to4+0x222>
mov    -0x38(%rbp),%rax
movb   $0x0,(%rax)
mov    -0x30(%rbp),%rax
mov    0x2(%rax),%cl
mov    -0x38(%rbp),%rax
mov    %cl,0x1(%rax)
mov    -0x30(%rbp),%rax
mov    0x1(%rax),%cl
mov    -0x38(%rbp),%rax
mov    %cl,0x2(%rax)
mov    -0x30(%rbp),%rax
mov    (%rax),%cl
mov    -0x38(%rbp),%rax
mov    %cl,0x3(%rax)
mov    -0x30(%rbp),%rax
add    $0x3,%rax
mov    %rax,-0x30(%rbp)
mov    -0x38(%rbp),%rax
add    $0x4,%rax
mov    %rax,-0x38(%rbp)
mov    -0x3c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x3c(%rbp)
jmp    12c0 <unpack3to4+0x1c0>
jmp    13b8 <unpack3to4+0x2b8>
cmpl   $0x3,0x10(%rbp)
jne    139f <unpack3to4+0x29f>
movl   $0x0,-0x3c(%rbp)
mov    -0x3c(%rbp),%eax
cmp    -0x40(%rbp),%eax
jge    139a <unpack3to4+0x29a>
mov    -0x30(%rbp),%rax
mov    (%rax),%cl
mov    -0x38(%rbp),%rax
mov    %cl,(%rax)
mov    -0x30(%rbp),%rax
mov    0x1(%rax),%cl
mov    -0x38(%rbp),%rax
mov    %cl,0x1(%rax)
mov    -0x30(%rbp),%rax
mov    0x2(%rax),%cl
mov    -0x38(%rbp),%rax
mov    %cl,0x2(%rax)
mov    -0x38(%rbp),%rax
movb   $0x0,0x3(%rax)
mov    -0x30(%rbp),%rax
add    $0x3,%rax
mov    %rax,-0x30(%rbp)
mov    -0x38(%rbp),%rax
add    $0x4,%rax
mov    %rax,-0x38(%rbp)
mov    -0x3c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x3c(%rbp)
jmp    1338 <unpack3to4+0x238>
jmp    13b3 <unpack3to4+0x2b3>
imul   $0x3,-0x40(%rbp),%eax
mov    $0x4,%ecx
cltd
idiv   %ecx
mov    %eax,-0x4(%rbp)
jmp    13c8 <unpack3to4+0x2c8>
jmp    13b8 <unpack3to4+0x2b8>
jmp    13bd <unpack3to4+0x2bd>
jmp    13c2 <unpack3to4+0x2c2>
mov    -0x40(%rbp),%eax
mov    %eax,-0x4(%rbp)
mov    -0x4(%rbp),%eax
pop    %rbp
ret

x86 assembly (clang, -O2):
<unpack3to4>:
mov    0x8(%rsp),%r10d
sub    %edx,%ecx
lea    0x4(,%rcx,4),%eax
cltq
imul   $0x55555556,%rax,%rcx
mov    %rcx,%rax
shr    $0x3f,%rax
shr    $0x20,%rcx
add    %eax,%ecx
test   %r8d,%r8d
mov    $0x1,%r11d
cmovg  %r8d,%r11d
test   %r9d,%r9d
lea    -0x1(%r11,%rcx,1),%eax
cmovg  %r9d,%eax
sub    %r11d,%eax
add    $0x1,%eax
cmp    %eax,%ecx
cmovle %ecx,%eax
cmp    $0x3,%r10
ja     11f4 <unpack3to4+0xf4>
add    $0xffffffff,%r11d
movslq %edx,%rcx
lea    (%rdi,%rcx,4),%r8
add    $0xfffffffffffffffc,%r8
lea    (%rsi,%r11,4),%rcx
lea    0xe94(%rip),%rsi
movslq (%rsi,%r10,4),%rdi
add    %rsi,%rdi
jmp    *%rdi
test   %eax,%eax
jle    1357 <unpack3to4+0x257>
cmp    $0x1,%eax
je     11d3 <unpack3to4+0xd3>
mov    %eax,%esi
and    $0xfffffffe,%esi
nopw   0x0(%rax,%rax,1)
movb   $0x0,(%rcx)
movzbl (%r8),%edx
mov    %dl,0x1(%rcx)
movzbl 0x1(%r8),%edx
mov    %dl,0x2(%rcx)
movzbl 0x2(%r8),%edx
mov    %dl,0x3(%rcx)
movb   $0x0,0x4(%rcx)
movzbl 0x3(%r8),%edx
mov    %dl,0x5(%rcx)
movzbl 0x4(%r8),%edx
mov    %dl,0x6(%rcx)
movzbl 0x5(%r8),%edx
mov    %dl,0x7(%rcx)
add    $0x6,%r8
add    $0x8,%rcx
add    $0xfffffffe,%esi
jne    1190 <unpack3to4+0x90>
test   $0x1,%al
je     1357 <unpack3to4+0x257>
movb   $0x0,(%rcx)
mov    (%r8),%dl
mov    %dl,0x1(%rcx)
mov    0x1(%r8),%dl
mov    %dl,0x2(%rcx)
mov    0x2(%r8),%dl
jmp    12fb <unpack3to4+0x1fb>
lea    (%rax,%rax,2),%ecx
lea    (%rax,%rax,2),%eax
add    $0x3,%eax
test   %ecx,%ecx
cmovns %ecx,%eax
sar    $0x2,%eax
ret
test   %eax,%eax
jle    1357 <unpack3to4+0x257>
cmp    $0x1,%eax
je     1263 <unpack3to4+0x163>
mov    %eax,%esi
and    $0xfffffffe,%esi
nopl   0x0(%rax,%rax,1)
movzbl 0x2(%r8),%edx
mov    %dl,(%rcx)
movzbl 0x1(%r8),%edx
mov    %dl,0x1(%rcx)
movzbl (%r8),%edx
mov    %dl,0x2(%rcx)
movb   $0x0,0x3(%rcx)
movzbl 0x5(%r8),%edx
mov    %dl,0x4(%rcx)
movzbl 0x4(%r8),%edx
mov    %dl,0x5(%rcx)
movzbl 0x3(%r8),%edx
mov    %dl,0x6(%rcx)
movb   $0x0,0x7(%rcx)
add    $0x6,%r8
add    $0x8,%rcx
add    $0xfffffffe,%esi
jne    1220 <unpack3to4+0x120>
test   $0x1,%al
je     1357 <unpack3to4+0x257>
mov    0x2(%r8),%dl
mov    %dl,(%rcx)
mov    0x1(%r8),%dl
mov    %dl,0x1(%rcx)
mov    (%r8),%dl
jmp    1368 <unpack3to4+0x268>
test   %eax,%eax
jle    1357 <unpack3to4+0x257>
cmp    $0x1,%eax
je     12e3 <unpack3to4+0x1e3>
mov    %eax,%esi
and    $0xfffffffe,%esi
cs nopw 0x0(%rax,%rax,1)
nopl   0x0(%rax)
movb   $0x0,(%rcx)
movzbl 0x2(%r8),%edx
mov    %dl,0x1(%rcx)
movzbl 0x1(%r8),%edx
mov    %dl,0x2(%rcx)
movzbl (%r8),%edx
mov    %dl,0x3(%rcx)
movb   $0x0,0x4(%rcx)
movzbl 0x5(%r8),%edx
mov    %dl,0x5(%rcx)
movzbl 0x4(%r8),%edx
mov    %dl,0x6(%rcx)
movzbl 0x3(%r8),%edx
mov    %dl,0x7(%rcx)
add    $0x6,%r8
add    $0x8,%rcx
add    $0xfffffffe,%esi
jne    12a0 <unpack3to4+0x1a0>
test   $0x1,%al
je     1357 <unpack3to4+0x257>
movb   $0x0,(%rcx)
mov    0x2(%r8),%dl
mov    %dl,0x1(%rcx)
mov    0x1(%r8),%dl
mov    %dl,0x2(%rcx)
mov    (%r8),%dl
mov    %dl,0x3(%rcx)
jmp    1357 <unpack3to4+0x257>
test   %eax,%eax
jle    1357 <unpack3to4+0x257>
cmp    $0x1,%eax
je     1353 <unpack3to4+0x253>
mov    %eax,%esi
and    $0xfffffffe,%esi
xchg   %ax,%ax
movzbl (%r8),%edx
mov    %dl,(%rcx)
movzbl 0x1(%r8),%edx
mov    %dl,0x1(%rcx)
movzbl 0x2(%r8),%edx
mov    %dl,0x2(%rcx)
movb   $0x0,0x3(%rcx)
movzbl 0x3(%r8),%edx
mov    %dl,0x4(%rcx)
movzbl 0x4(%r8),%edx
mov    %dl,0x5(%rcx)
movzbl 0x5(%r8),%edx
mov    %dl,0x6(%rcx)
movb   $0x0,0x7(%rcx)
add    $0x6,%r8
add    $0x8,%rcx
add    $0xfffffffe,%esi
jne    1310 <unpack3to4+0x210>
test   $0x1,%al
jne    1358 <unpack3to4+0x258>
ret
mov    (%r8),%dl
mov    %dl,(%rcx)
mov    0x1(%r8),%dl
mov    %dl,0x1(%rcx)
mov    0x2(%r8),%dl
mov    %dl,0x2(%rcx)
movb   $0x0,0x3(%rcx)
ret

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

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