int XingHeaderUpdate(int frames, int bs_bytes, int vbr_scale,
                     unsigned char *toc, unsigned char *buf,
                     unsigned char *buf20, unsigned char *buf20B) {
  int i, head_flags;
  int h_id, h_mode;
  h_id = (buf[1] >> 3) & 1;
  h_mode = (buf[3] >> 6) & 3;
  if (h_id) {
    if (h_mode != 3)
      buf += (32 + 4);
    else
      buf += (17 + 4);
  } else {
    if (h_mode != 3)
      buf += (17 + 4);
    else
      buf += (9 + 4);
  }
  if (buf[0] != 'X')
    return 0;
  if (buf[1] != 'i')
    return 0;
  if (buf[2] != 'n')
    return 0;
  if (buf[3] != 'g')
    return 0;
  buf += 4;
  head_flags = ExtractI4(buf);
  buf += 4;
  if (head_flags & 0x0001) {
    InsertI4(buf, frames);
    buf += 4;
  }
  if (head_flags & 0x0002) {
    InsertI4(buf, bs_bytes);
    buf += 4;
  }
  if (head_flags & 0x0004) {
    if (toc != ((void *)0)) {
      for (i = 0; i < 100; i++)
        buf[i] = toc[i];
    } else {
      BuildTOC(frames, bs_bytes, buf);
    }
    buf += 100;
  }
  if (head_flags & 0x0008) {
    InsertI4(buf, vbr_scale);
    buf += 4;
  }
  if (head_flags & 0x0010) {
    if (buf20 != ((void *)0)) {
      for (i = 0; i < 20; i++)
        buf[i] = buf20[i];
    } else {
      for (i = 0; i < 20; i++)
        buf[i] = 0;
    }
    buf += 20;
  }
  if (head_flags & 0x0020) {
    if (buf20 != ((void *)0)) {
      for (i = 0; i < 20; i++)
        buf[i] = buf20B[i];
    } else {
      for (i = 0; i < 20; i++)
        buf[i] = 0;
    }
    buf += 20;
  }
  return 1;
}


x86 assembly (clang, -O0):
<XingHeaderUpdate>:
push   %rbp
mov    %rsp,%rbp
sub    $0x40,%rsp
mov    0x10(%rbp),%rax
mov    %edi,-0x8(%rbp)
mov    %esi,-0xc(%rbp)
mov    %edx,-0x10(%rbp)
mov    %rcx,-0x18(%rbp)
mov    %r8,-0x20(%rbp)
mov    %r9,-0x28(%rbp)
mov    -0x20(%rbp),%rax
movzbl 0x1(%rax),%eax
sar    $0x3,%eax
and    $0x1,%eax
mov    %eax,-0x34(%rbp)
mov    -0x20(%rbp),%rax
movzbl 0x3(%rax),%eax
sar    $0x6,%eax
and    $0x3,%eax
mov    %eax,-0x38(%rbp)
cmpl   $0x0,-0x34(%rbp)
je     11a9 <XingHeaderUpdate+0x79>
cmpl   $0x3,-0x38(%rbp)
je     1198 <XingHeaderUpdate+0x68>
mov    -0x20(%rbp),%rax
add    $0x24,%rax
mov    %rax,-0x20(%rbp)
jmp    11a4 <XingHeaderUpdate+0x74>
mov    -0x20(%rbp),%rax
add    $0x15,%rax
mov    %rax,-0x20(%rbp)
jmp    11d5 <XingHeaderUpdate+0xa5>
cmpl   $0x3,-0x38(%rbp)
je     11c4 <XingHeaderUpdate+0x94>
mov    -0x20(%rbp),%rax
add    $0x15,%rax
mov    %rax,-0x20(%rbp)
jmp    11d0 <XingHeaderUpdate+0xa0>
mov    -0x20(%rbp),%rax
add    $0xd,%rax
mov    %rax,-0x20(%rbp)
jmp    11d5 <XingHeaderUpdate+0xa5>
mov    -0x20(%rbp),%rax
movzbl (%rax),%eax
cmp    $0x58,%eax
je     11f1 <XingHeaderUpdate+0xc1>
movl   $0x0,-0x4(%rbp)
jmp    1481 <XingHeaderUpdate+0x351>
mov    -0x20(%rbp),%rax
movzbl 0x1(%rax),%eax
cmp    $0x69,%eax
je     120e <XingHeaderUpdate+0xde>
movl   $0x0,-0x4(%rbp)
jmp    1481 <XingHeaderUpdate+0x351>
mov    -0x20(%rbp),%rax
movzbl 0x2(%rax),%eax
cmp    $0x6e,%eax
je     122b <XingHeaderUpdate+0xfb>
movl   $0x0,-0x4(%rbp)
jmp    1481 <XingHeaderUpdate+0x351>
mov    -0x20(%rbp),%rax
movzbl 0x3(%rax),%eax
cmp    $0x67,%eax
je     1248 <XingHeaderUpdate+0x118>
movl   $0x0,-0x4(%rbp)
jmp    1481 <XingHeaderUpdate+0x351>
mov    -0x20(%rbp),%rax
add    $0x4,%rax
mov    %rax,-0x20(%rbp)
mov    -0x20(%rbp),%rdi
mov    $0x0,%al
call   1030 <ExtractI4@plt>
mov    %eax,-0x30(%rbp)
mov    -0x20(%rbp),%rax
add    $0x4,%rax
mov    %rax,-0x20(%rbp)
mov    -0x30(%rbp),%eax
and    $0x1,%eax
cmp    $0x0,%eax
je     1297 <XingHeaderUpdate+0x167>
mov    -0x20(%rbp),%rdi
mov    -0x8(%rbp),%esi
mov    $0x0,%al
call   1050 <InsertI4@plt>
mov    -0x20(%rbp),%rax
add    $0x4,%rax
mov    %rax,-0x20(%rbp)
mov    -0x30(%rbp),%eax
and    $0x2,%eax
cmp    $0x0,%eax
je     12c0 <XingHeaderUpdate+0x190>
mov    -0x20(%rbp),%rdi
mov    -0xc(%rbp),%esi
mov    $0x0,%al
call   1050 <InsertI4@plt>
mov    -0x20(%rbp),%rax
add    $0x4,%rax
mov    %rax,-0x20(%rbp)
mov    -0x30(%rbp),%eax
and    $0x4,%eax
cmp    $0x0,%eax
je     1331 <XingHeaderUpdate+0x201>
cmpq   $0x0,-0x18(%rbp)
je     1314 <XingHeaderUpdate+0x1e4>
movl   $0x0,-0x2c(%rbp)
cmpl   $0x64,-0x2c(%rbp)
jge    130f <XingHeaderUpdate+0x1df>
mov    -0x18(%rbp),%rax
movslq -0x2c(%rbp),%rcx
mov    (%rax,%rcx,1),%dl
mov    -0x20(%rbp),%rax
movslq -0x2c(%rbp),%rcx
mov    %dl,(%rax,%rcx,1)
mov    -0x2c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x2c(%rbp)
jmp    12e1 <XingHeaderUpdate+0x1b1>
jmp    1325 <XingHeaderUpdate+0x1f5>
mov    -0x8(%rbp),%edi
mov    -0xc(%rbp),%esi
mov    -0x20(%rbp),%rdx
mov    $0x0,%al
call   1040 <BuildTOC@plt>
mov    -0x20(%rbp),%rax
add    $0x64,%rax
mov    %rax,-0x20(%rbp)
mov    -0x30(%rbp),%eax
and    $0x8,%eax
cmp    $0x0,%eax
je     135a <XingHeaderUpdate+0x22a>
mov    -0x20(%rbp),%rdi
mov    -0x10(%rbp),%esi
mov    $0x0,%al
call   1050 <InsertI4@plt>
mov    -0x20(%rbp),%rax
add    $0x4,%rax
mov    %rax,-0x20(%rbp)
mov    -0x30(%rbp),%eax
and    $0x10,%eax
cmp    $0x0,%eax
je     13ea <XingHeaderUpdate+0x2ba>
cmpq   $0x0,-0x28(%rbp)
je     13ae <XingHeaderUpdate+0x27e>
movl   $0x0,-0x2c(%rbp)
cmpl   $0x14,-0x2c(%rbp)
jge    13a9 <XingHeaderUpdate+0x279>
mov    -0x28(%rbp),%rax
movslq -0x2c(%rbp),%rcx
mov    (%rax,%rcx,1),%dl
mov    -0x20(%rbp),%rax
movslq -0x2c(%rbp),%rcx
mov    %dl,(%rax,%rcx,1)
mov    -0x2c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x2c(%rbp)
jmp    137b <XingHeaderUpdate+0x24b>
jmp    13de <XingHeaderUpdate+0x2ae>
movl   $0x0,-0x2c(%rbp)
cmpl   $0x14,-0x2c(%rbp)
jge    13d9 <XingHeaderUpdate+0x2a9>
mov    -0x20(%rbp),%rax
movslq -0x2c(%rbp),%rcx
movb   $0x0,(%rax,%rcx,1)
mov    -0x2c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x2c(%rbp)
jmp    13b5 <XingHeaderUpdate+0x285>
jmp    13de <XingHeaderUpdate+0x2ae>
mov    -0x20(%rbp),%rax
add    $0x14,%rax
mov    %rax,-0x20(%rbp)
mov    -0x30(%rbp),%eax
and    $0x20,%eax
cmp    $0x0,%eax
je     147a <XingHeaderUpdate+0x34a>
cmpq   $0x0,-0x28(%rbp)
je     143e <XingHeaderUpdate+0x30e>
movl   $0x0,-0x2c(%rbp)
cmpl   $0x14,-0x2c(%rbp)
jge    1439 <XingHeaderUpdate+0x309>
mov    0x10(%rbp),%rax
movslq -0x2c(%rbp),%rcx
mov    (%rax,%rcx,1),%dl
mov    -0x20(%rbp),%rax
movslq -0x2c(%rbp),%rcx
mov    %dl,(%rax,%rcx,1)
mov    -0x2c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x2c(%rbp)
jmp    140b <XingHeaderUpdate+0x2db>
jmp    146e <XingHeaderUpdate+0x33e>
movl   $0x0,-0x2c(%rbp)
cmpl   $0x14,-0x2c(%rbp)
jge    1469 <XingHeaderUpdate+0x339>
mov    -0x20(%rbp),%rax
movslq -0x2c(%rbp),%rcx
movb   $0x0,(%rax,%rcx,1)
mov    -0x2c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x2c(%rbp)
jmp    1445 <XingHeaderUpdate+0x315>
jmp    146e <XingHeaderUpdate+0x33e>
mov    -0x20(%rbp),%rax
add    $0x14,%rax
mov    %rax,-0x20(%rbp)
movl   $0x1,-0x4(%rbp)
mov    -0x4(%rbp),%eax
add    $0x40,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<XingHeaderUpdate>:
push   %rbp
push   %r15
push   %r14
push   %r13
push   %r12
push   %rbx
sub    $0x18,%rsp
xor    %eax,%eax
cmpb   $0xc0,0x3(%r8)
setb   %al
mov    $0x15,%ebp
mov    $0x24,%ebx
cmovae %rbp,%rbx
testb  $0x8,0x1(%r8)
lea    0xd(,%rax,8),%rbp
cmovne %rbx,%rbp
xor    %eax,%eax
cmpb   $0x58,(%r8,%rbp,1)
jne    13a4 <XingHeaderUpdate+0x274>
mov    %r8,%r14
add    %rbp,%r14
cmpb   $0x69,0x1(%r14)
jne    13a4 <XingHeaderUpdate+0x274>
cmpb   $0x6e,0x2(%r14)
jne    13a4 <XingHeaderUpdate+0x274>
cmpb   $0x67,0x3(%r14)
jne    13a4 <XingHeaderUpdate+0x274>
mov    %rcx,%r12
mov    %esi,%r13d
mov    %edi,%r15d
mov    %edx,0xc(%rsp)
mov    %r9,0x10(%rsp)
lea    0x4(%r14),%rdi
xor    %eax,%eax
call   1030 <ExtractI4@plt>
lea    0x8(%r14),%rbx
mov    %eax,%ebp
test   $0x1,%al
je     11d6 <XingHeaderUpdate+0xa6>
mov    %rbx,%rdi
mov    %r15d,%esi
xor    %eax,%eax
call   1050 <InsertI4@plt>
add    $0xc,%r14
mov    %r14,%rbx
mov    %ebp,%r14d
test   $0x2,%r14b
jne    1296 <XingHeaderUpdate+0x166>
test   $0x4,%r14b
jne    12b1 <XingHeaderUpdate+0x181>
test   $0x8,%r14b
je     1205 <XingHeaderUpdate+0xd5>
mov    %rbx,%rdi
mov    0xc(%rsp),%esi
xor    %eax,%eax
call   1050 <InsertI4@plt>
add    $0x4,%rbx
mov    0x10(%rsp),%rbp
test   $0x10,%r14b
je     12ed <XingHeaderUpdate+0x1bd>
test   %rbp,%rbp
je     12dc <XingHeaderUpdate+0x1ac>
mov    0x0(%rbp),%al
mov    %al,(%rbx)
mov    0x1(%rbp),%al
mov    %al,0x1(%rbx)
mov    0x2(%rbp),%al
mov    %al,0x2(%rbx)
mov    0x3(%rbp),%al
mov    %al,0x3(%rbx)
mov    0x4(%rbp),%al
mov    %al,0x4(%rbx)
mov    0x5(%rbp),%al
mov    %al,0x5(%rbx)
mov    0x6(%rbp),%al
mov    %al,0x6(%rbx)
mov    0x7(%rbp),%al
mov    %al,0x7(%rbx)
mov    0x8(%rbp),%al
mov    %al,0x8(%rbx)
mov    0x9(%rbp),%al
mov    %al,0x9(%rbx)
mov    0xa(%rbp),%al
mov    %al,0xa(%rbx)
mov    0xb(%rbp),%al
mov    %al,0xb(%rbx)
mov    0xc(%rbp),%al
mov    %al,0xc(%rbx)
mov    0xd(%rbp),%al
mov    %al,0xd(%rbx)
mov    0xe(%rbp),%al
mov    %al,0xe(%rbx)
mov    0xf(%rbp),%al
mov    %al,0xf(%rbx)
mov    0x10(%rbp),%al
mov    %al,0x10(%rbx)
mov    0x11(%rbp),%al
mov    %al,0x11(%rbx)
mov    0x12(%rbp),%al
mov    %al,0x12(%rbx)
mov    0x13(%rbp),%al
mov    %al,0x13(%rbx)
jmp    12e9 <XingHeaderUpdate+0x1b9>
mov    %rbx,%rdi
mov    %r13d,%esi
xor    %eax,%eax
call   1050 <InsertI4@plt>
add    $0x4,%rbx
test   $0x4,%r14b
je     11ed <XingHeaderUpdate+0xbd>
test   %r12,%r12
je     1382 <XingHeaderUpdate+0x252>
lea    0x64(%r12),%rax
cmp    %rax,%rbx
jae    13b3 <XingHeaderUpdate+0x283>
lea    0x64(%rbx),%rax
cmp    %r12,%rax
jbe    13b3 <XingHeaderUpdate+0x283>
xor    %eax,%eax
jmp    1400 <XingHeaderUpdate+0x2d0>
xorps  %xmm0,%xmm0
movups %xmm0,(%rbx)
movl   $0x0,0x10(%rbx)
add    $0x14,%rbx
mov    $0x1,%eax
test   $0x20,%r14b
je     13a4 <XingHeaderUpdate+0x274>
test   %rbp,%rbp
je     1397 <XingHeaderUpdate+0x267>
mov    0x50(%rsp),%rcx
mov    (%rcx),%dl
mov    %dl,(%rbx)
mov    0x1(%rcx),%dl
mov    %dl,0x1(%rbx)
mov    0x2(%rcx),%dl
mov    %dl,0x2(%rbx)
mov    0x3(%rcx),%dl
mov    %dl,0x3(%rbx)
mov    0x4(%rcx),%dl
mov    %dl,0x4(%rbx)
mov    0x5(%rcx),%dl
mov    %dl,0x5(%rbx)
mov    0x6(%rcx),%dl
mov    %dl,0x6(%rbx)
mov    0x7(%rcx),%dl
mov    %dl,0x7(%rbx)
mov    0x8(%rcx),%dl
mov    %dl,0x8(%rbx)
mov    0x9(%rcx),%dl
mov    %dl,0x9(%rbx)
mov    0xa(%rcx),%dl
mov    %dl,0xa(%rbx)
mov    0xb(%rcx),%dl
mov    %dl,0xb(%rbx)
mov    0xc(%rcx),%dl
mov    %dl,0xc(%rbx)
mov    0xd(%rcx),%dl
mov    %dl,0xd(%rbx)
mov    0xe(%rcx),%dl
mov    %dl,0xe(%rbx)
mov    0xf(%rcx),%dl
mov    %dl,0xf(%rbx)
mov    0x10(%rcx),%dl
mov    %dl,0x10(%rbx)
mov    0x11(%rcx),%dl
mov    %dl,0x11(%rbx)
mov    0x12(%rcx),%dl
mov    %dl,0x12(%rbx)
mov    0x13(%rcx),%cl
mov    %cl,0x13(%rbx)
jmp    13a4 <XingHeaderUpdate+0x274>
mov    %r15d,%edi
mov    %r13d,%esi
mov    %rbx,%rdx
xor    %eax,%eax
call   1040 <BuildTOC@plt>
jmp    1430 <XingHeaderUpdate+0x300>
xorps  %xmm0,%xmm0
movups %xmm0,(%rbx)
movl   $0x0,0x10(%rbx)
add    $0x18,%rsp
pop    %rbx
pop    %r12
pop    %r13
pop    %r14
pop    %r15
pop    %rbp
ret
movups (%r12),%xmm0
movups %xmm0,(%rbx)
movups 0x10(%r12),%xmm0
movups %xmm0,0x10(%rbx)
movups 0x20(%r12),%xmm0
movups %xmm0,0x20(%rbx)
movups 0x30(%r12),%xmm0
movups %xmm0,0x30(%rbx)
movups 0x40(%r12),%xmm0
movups %xmm0,0x40(%rbx)
movups 0x50(%r12),%xmm0
movups %xmm0,0x50(%rbx)
mov    $0x60,%eax
cs nopw 0x0(%rax,%rax,1)
nopl   0x0(%rax)
movzbl (%r12,%rax,1),%ecx
mov    %cl,(%rbx,%rax,1)
movzbl 0x1(%r12,%rax,1),%ecx
mov    %cl,0x1(%rbx,%rax,1)
movzbl 0x2(%r12,%rax,1),%ecx
mov    %cl,0x2(%rbx,%rax,1)
movzbl 0x3(%r12,%rax,1),%ecx
mov    %cl,0x3(%rbx,%rax,1)
add    $0x4,%rax
cmp    $0x64,%rax
jne    1400 <XingHeaderUpdate+0x2d0>
add    $0x64,%rbx
test   $0x8,%r14b
jne    11f3 <XingHeaderUpdate+0xc3>
jmp    1205 <XingHeaderUpdate+0xd5>

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

LLVM IR (-O2):
define i32 @XingHeaderUpdate(i32 %0, i32 %1, i32 %2, i8* %3, i8* %4, i8* %5, i8* nocapture %6) {
%8 = getelementptr inbounds i8, i8* %4, i64 1
%9 = load i8, i8* %8
%10 = getelementptr inbounds i8, i8* %4, i64 3
%11 = load i8, i8* %10
%12 = and i8 %9, 8
%13 = icmp eq i8 %12, 0
%14 = icmp ugt i8 %11, -65
%15 = select i1 %14, i64 21, i64 36
%16 = select i1 %14, i64 13, i64 21
%17 = select i1 %13, i64 %16, i64 %15
%18 = getelementptr inbounds i8, i8* %4, i64 %17
%19 = load i8, i8* %18
%20 = icmp eq i8 %19, 88
br i1 %20, label %21, label %256
21: ; preds = %7
%22 = getelementptr inbounds i8, i8* %18, i64 1
%23 = load i8, i8* %22
%24 = icmp eq i8 %23, 105
br i1 %24, label %25, label %256
25: ; preds = %21
%26 = getelementptr inbounds i8, i8* %18, i64 2
%27 = load i8, i8* %26
%28 = icmp eq i8 %27, 110
br i1 %28, label %29, label %256
29: ; preds = %25
%30 = getelementptr inbounds i8, i8* %18, i64 3
%31 = load i8, i8* %30
%32 = icmp eq i8 %31, 103
br i1 %32, label %33, label %256
33: ; preds = %29
%34 = getelementptr inbounds i8, i8* %18, i64 4
%35 = tail call i32 (i8*, ...) bitcast (i32 (...)* @ExtractI4 to i32 (i8*, ...)*)(i8* %34)
%36 = getelementptr inbounds i8, i8* %18, i64 8
%37 = and i32 %35, 1
%38 = icmp eq i32 %37, 0
br i1 %38, label %42, label %39
39: ; preds = %33
%40 = tail call i32 (i8*, i32, ...) bitcast (i32 (...)* @InsertI4 to i32 (i8*, i32, ...)*)(i8* %36, i32 %0)
%41 = getelementptr inbounds i8, i8* %18, i64 12
br label %42
42: ; preds = %39, %33
%43 = phi i8* [ %41, %39 ], [ %36, %33 ]
%44 = and i32 %35, 2
%45 = icmp eq i32 %44, 0
br i1 %45, label %49, label %46
46: ; preds = %42
%47 = tail call i32 (i8*, i32, ...) bitcast (i32 (...)* @InsertI4 to i32 (i8*, i32, ...)*)(i8* %43, i32 %1)
%48 = getelementptr inbounds i8, i8* %43, i64 4
br label %49
49: ; preds = %46, %42
%50 = phi i8* [ %48, %46 ], [ %43, %42 ]
%51 = and i32 %35, 4
%52 = icmp eq i32 %51, 0
br i1 %52, label %115, label %53
53: ; preds = %49
%54 = icmp eq i8* %3, null
br i1 %54, label %111, label %55
55: ; preds = %53
%56 = getelementptr i8, i8* %50, i64 100
%57 = getelementptr i8, i8* %3, i64 100
%58 = icmp ult i8* %50, %57
%59 = icmp ugt i8* %56, %3
%60 = and i1 %58, %59
br i1 %60, label %90, label %61
61: ; preds = %55
%62 = bitcast i8* %3 to <16 x i8>*
%63 = load <16 x i8>, <16 x i8>* %62
%64 = bitcast i8* %50 to <16 x i8>*
store <16 x i8> %63, <16 x i8>* %64
%65 = getelementptr inbounds i8, i8* %3, i64 16
%66 = bitcast i8* %65 to <16 x i8>*
%67 = load <16 x i8>, <16 x i8>* %66
%68 = getelementptr inbounds i8, i8* %50, i64 16
%69 = bitcast i8* %68 to <16 x i8>*
store <16 x i8> %67, <16 x i8>* %69
%70 = getelementptr inbounds i8, i8* %3, i64 32
%71 = bitcast i8* %70 to <16 x i8>*
%72 = load <16 x i8>, <16 x i8>* %71
%73 = getelementptr inbounds i8, i8* %50, i64 32
%74 = bitcast i8* %73 to <16 x i8>*
store <16 x i8> %72, <16 x i8>* %74
%75 = getelementptr inbounds i8, i8* %3, i64 48
%76 = bitcast i8* %75 to <16 x i8>*
%77 = load <16 x i8>, <16 x i8>* %76
%78 = getelementptr inbounds i8, i8* %50, i64 48
%79 = bitcast i8* %78 to <16 x i8>*
store <16 x i8> %77, <16 x i8>* %79
%80 = getelementptr inbounds i8, i8* %3, i64 64
%81 = bitcast i8* %80 to <16 x i8>*
%82 = load <16 x i8>, <16 x i8>* %81
%83 = getelementptr inbounds i8, i8* %50, i64 64
%84 = bitcast i8* %83 to <16 x i8>*
store <16 x i8> %82, <16 x i8>* %84
%85 = getelementptr inbounds i8, i8* %3, i64 80
%86 = bitcast i8* %85 to <16 x i8>*
%87 = load <16 x i8>, <16 x i8>* %86
%88 = getelementptr inbounds i8, i8* %50, i64 80
%89 = bitcast i8* %88 to <16 x i8>*
store <16 x i8> %87, <16 x i8>* %89
br label %90
90: ; preds = %61, %55
%91 = phi i64 [ 0, %55 ], [ 96, %61 ]
br label %92
92: ; preds = %92, %90
%93 = phi i64 [ %91, %90 ], [ %109, %92 ]
%94 = getelementptr inbounds i8, i8* %3, i64 %93
%95 = load i8, i8* %94
%96 = getelementptr inbounds i8, i8* %50, i64 %93
store i8 %95, i8* %96
%97 = or i64 %93, 1
%98 = getelementptr inbounds i8, i8* %3, i64 %97
%99 = load i8, i8* %98
%100 = getelementptr inbounds i8, i8* %50, i64 %97
store i8 %99, i8* %100
%101 = or i64 %93, 2
%102 = getelementptr inbounds i8, i8* %3, i64 %101
%103 = load i8, i8* %102
%104 = getelementptr inbounds i8, i8* %50, i64 %101
store i8 %103, i8* %104
%105 = or i64 %93, 3
%106 = getelementptr inbounds i8, i8* %3, i64 %105
%107 = load i8, i8* %106
%108 = getelementptr inbounds i8, i8* %50, i64 %105
store i8 %107, i8* %108
%109 = add nuw nsw i64 %93, 4
%110 = icmp eq i64 %109, 100
br i1 %110, label %113, label %92
111: ; preds = %53
%112 = tail call i32 (i32, i32, i8*, ...) bitcast (i32 (...)* @BuildTOC to i32 (i32, i32, i8*, ...)*)(i32 %0, i32 %1, i8* %50)
br label %113
113: ; preds = %92, %111
%114 = getelementptr inbounds i8, i8* %50, i64 100
br label %115
115: ; preds = %113, %49
%116 = phi i8* [ %114, %113 ], [ %50, %49 ]
%117 = and i32 %35, 8
%118 = icmp eq i32 %117, 0
br i1 %118, label %122, label %119
119: ; preds = %115
%120 = tail call i32 (i8*, i32, ...) bitcast (i32 (...)* @InsertI4 to i32 (i8*, i32, ...)*)(i8* %116, i32 %2)
%121 = getelementptr inbounds i8, i8* %116, i64 4
br label %122
122: ; preds = %119, %115
%123 = phi i8* [ %121, %119 ], [ %116, %115 ]
%124 = and i32 %35, 16
%125 = icmp eq i32 %124, 0
br i1 %125, label %190, label %126
126: ; preds = %122
%127 = icmp eq i8* %5, null
br i1 %127, label %187, label %128
128: ; preds = %126
%129 = load i8, i8* %5
store i8 %129, i8* %123
%130 = getelementptr inbounds i8, i8* %5, i64 1
%131 = load i8, i8* %130
%132 = getelementptr inbounds i8, i8* %123, i64 1
store i8 %131, i8* %132
%133 = getelementptr inbounds i8, i8* %5, i64 2
%134 = load i8, i8* %133
%135 = getelementptr inbounds i8, i8* %123, i64 2
store i8 %134, i8* %135
%136 = getelementptr inbounds i8, i8* %5, i64 3
%137 = load i8, i8* %136
%138 = getelementptr inbounds i8, i8* %123, i64 3
store i8 %137, i8* %138
%139 = getelementptr inbounds i8, i8* %5, i64 4
%140 = load i8, i8* %139
%141 = getelementptr inbounds i8, i8* %123, i64 4
store i8 %140, i8* %141
%142 = getelementptr inbounds i8, i8* %5, i64 5
%143 = load i8, i8* %142
%144 = getelementptr inbounds i8, i8* %123, i64 5
store i8 %143, i8* %144
%145 = getelementptr inbounds i8, i8* %5, i64 6
%146 = load i8, i8* %145
%147 = getelementptr inbounds i8, i8* %123, i64 6
store i8 %146, i8* %147
%148 = getelementptr inbounds i8, i8* %5, i64 7
%149 = load i8, i8* %148
%150 = getelementptr inbounds i8, i8* %123, i64 7
store i8 %149, i8* %150
%151 = getelementptr inbounds i8, i8* %5, i64 8
%152 = load i8, i8* %151
%153 = getelementptr inbounds i8, i8* %123, i64 8
store i8 %152, i8* %153
%154 = getelementptr inbounds i8, i8* %5, i64 9
%155 = load i8, i8* %154
%156 = getelementptr inbounds i8, i8* %123, i64 9
store i8 %155, i8* %156
%157 = getelementptr inbounds i8, i8* %5, i64 10
%158 = load i8, i8* %157
%159 = getelementptr inbounds i8, i8* %123, i64 10
store i8 %158, i8* %159
%160 = getelementptr inbounds i8, i8* %5, i64 11
%161 = load i8, i8* %160
%162 = getelementptr inbounds i8, i8* %123, i64 11
store i8 %161, i8* %162
%163 = getelementptr inbounds i8, i8* %5, i64 12
%164 = load i8, i8* %163
%165 = getelementptr inbounds i8, i8* %123, i64 12
store i8 %164, i8* %165
%166 = getelementptr inbounds i8, i8* %5, i64 13
%167 = load i8, i8* %166
%168 = getelementptr inbounds i8, i8* %123, i64 13
store i8 %167, i8* %168
%169 = getelementptr inbounds i8, i8* %5, i64 14
%170 = load i8, i8* %169
%171 = getelementptr inbounds i8, i8* %123, i64 14
store i8 %170, i8* %171
%172 = getelementptr inbounds i8, i8* %5, i64 15
%173 = load i8, i8* %172
%174 = getelementptr inbounds i8, i8* %123, i64 15
store i8 %173, i8* %174
%175 = getelementptr inbounds i8, i8* %5, i64 16
%176 = load i8, i8* %175
%177 = getelementptr inbounds i8, i8* %123, i64 16
store i8 %176, i8* %177
%178 = getelementptr inbounds i8, i8* %5, i64 17
%179 = load i8, i8* %178
%180 = getelementptr inbounds i8, i8* %123, i64 17
store i8 %179, i8* %180
%181 = getelementptr inbounds i8, i8* %5, i64 18
%182 = load i8, i8* %181
%183 = getelementptr inbounds i8, i8* %123, i64 18
store i8 %182, i8* %183
%184 = getelementptr inbounds i8, i8* %5, i64 19
%185 = load i8, i8* %184
%186 = getelementptr inbounds i8, i8* %123, i64 19
store i8 %185, i8* %186
br label %188
187: ; preds = %126
br label %188
188: ; preds = %128, %187
%189 = getelementptr inbounds i8, i8* %123, i64 20
br label %190
190: ; preds = %188, %122
%191 = phi i8* [ %189, %188 ], [ %123, %122 ]
%192 = and i32 %35, 32
%193 = icmp eq i32 %192, 0
br i1 %193, label %256, label %194
194: ; preds = %190
%195 = icmp eq i8* %5, null
br i1 %195, label %255, label %196
196: ; preds = %194
%197 = load i8, i8* %6
store i8 %197, i8* %191
%198 = getelementptr inbounds i8, i8* %6, i64 1
%199 = load i8, i8* %198
%200 = getelementptr inbounds i8, i8* %191, i64 1
store i8 %199, i8* %200
%201 = getelementptr inbounds i8, i8* %6, i64 2
%202 = load i8, i8* %201
%203 = getelementptr inbounds i8, i8* %191, i64 2
store i8 %202, i8* %203
%204 = getelementptr inbounds i8, i8* %6, i64 3
%205 = load i8, i8* %204
%206 = getelementptr inbounds i8, i8* %191, i64 3
store i8 %205, i8* %206
%207 = getelementptr inbounds i8, i8* %6, i64 4
%208 = load i8, i8* %207
%209 = getelementptr inbounds i8, i8* %191, i64 4
store i8 %208, i8* %209
%210 = getelementptr inbounds i8, i8* %6, i64 5
%211 = load i8, i8* %210
%212 = getelementptr inbounds i8, i8* %191, i64 5
store i8 %211, i8* %212
%213 = getelementptr inbounds i8, i8* %6, i64 6
%214 = load i8, i8* %213
%215 = getelementptr inbounds i8, i8* %191, i64 6
store i8 %214, i8* %215
%216 = getelementptr inbounds i8, i8* %6, i64 7
%217 = load i8, i8* %216
%218 = getelementptr inbounds i8, i8* %191, i64 7
store i8 %217, i8* %218
%219 = getelementptr inbounds i8, i8* %6, i64 8
%220 = load i8, i8* %219
%221 = getelementptr inbounds i8, i8* %191, i64 8
store i8 %220, i8* %221
%222 = getelementptr inbounds i8, i8* %6, i64 9
%223 = load i8, i8* %222
%224 = getelementptr inbounds i8, i8* %191, i64 9
store i8 %223, i8* %224
%225 = getelementptr inbounds i8, i8* %6, i64 10
%226 = load i8, i8* %225
%227 = getelementptr inbounds i8, i8* %191, i64 10
store i8 %226, i8* %227
%228 = getelementptr inbounds i8, i8* %6, i64 11
%229 = load i8, i8* %228
%230 = getelementptr inbounds i8, i8* %191, i64 11
store i8 %229, i8* %230
%231 = getelementptr inbounds i8, i8* %6, i64 12
%232 = load i8, i8* %231
%233 = getelementptr inbounds i8, i8* %191, i64 12
store i8 %232, i8* %233
%234 = getelementptr inbounds i8, i8* %6, i64 13
%235 = load i8, i8* %234
%236 = getelementptr inbounds i8, i8* %191, i64 13
store i8 %235, i8* %236
%237 = getelementptr inbounds i8, i8* %6, i64 14
%238 = load i8, i8* %237
%239 = getelementptr inbounds i8, i8* %191, i64 14
store i8 %238, i8* %239
%240 = getelementptr inbounds i8, i8* %6, i64 15
%241 = load i8, i8* %240
%242 = getelementptr inbounds i8, i8* %191, i64 15
store i8 %241, i8* %242
%243 = getelementptr inbounds i8, i8* %6, i64 16
%244 = load i8, i8* %243
%245 = getelementptr inbounds i8, i8* %191, i64 16
store i8 %244, i8* %245
%246 = getelementptr inbounds i8, i8* %6, i64 17
%247 = load i8, i8* %246
%248 = getelementptr inbounds i8, i8* %191, i64 17
store i8 %247, i8* %248
%249 = getelementptr inbounds i8, i8* %6, i64 18
%250 = load i8, i8* %249
%251 = getelementptr inbounds i8, i8* %191, i64 18
store i8 %250, i8* %251
%252 = getelementptr inbounds i8, i8* %6, i64 19
%253 = load i8, i8* %252
%254 = getelementptr inbounds i8, i8* %191, i64 19
store i8 %253, i8* %254
br label %256
255: ; preds = %194
br label %256
256: ; preds = %196, %255, %190, %29, %25, %21, %7
%257 = phi i32 [ 0, %7 ], [ 0, %21 ], [ 0, %25 ], [ 0, %29 ], [ 1, %190 ], [ 1, %255 ], [ 1, %196 ]
ret i32 %257
}