int ibitmap_blitmc(char *dst, long pitch1, const char *src, long pitch2, int w,
                   int h, int pixelbyte, long linesize, unsigned long mask) {
  static unsigned long endian = 0x11223344;
  unsigned char *p1, *p2;
  unsigned long key24, c;
  unsigned char key08;
  unsigned short key16;
  unsigned int imask, k;
  long inc1, inc2, i;
  long longsize, isize;
  inc1 = pitch1 - linesize;
  inc2 = pitch2 - linesize;
  longsize = sizeof(long);
  isize = sizeof(int);
  switch (pixelbyte) {
  case 1:
    key08 = (unsigned char)mask;
    for (; h; h--) {
      for (i = w; i; i--) {
        if (*(unsigned char *)src != key08)
          *dst = *src;
        src++;
        dst++;
      }
      dst += inc1;
      src += inc2;
    }
    break;
  case 2:
    key16 = (unsigned short)mask;
    for (; h; h--) {
      for (i = w; i; i--) {
        if (*(unsigned short *)src != key16)
          *(unsigned short *)dst = *(unsigned short *)src;
        src += 2;
        dst += 2;
      }
      dst += inc1;
      src += inc2;
    }
    break;
  case 3:
    if (((unsigned char *)&endian)[0] != 0x44)
      key24 = mask;
    else
      key24 = ((mask & 0xFFFF) << 8) | ((mask >> 16) & 0xFF);
    p1 = (unsigned char *)dst;
    p2 = (unsigned char *)src;
    if (longsize == 4) {
      for (; h; h--) {
        for (i = w; i; i--) {
          c = (((unsigned long)(*(unsigned short *)p2)) << 8);
          if ((c | p2[2]) != key24) {
            p1[0] = p2[0];
            p1[1] = p2[1];
            p1[2] = p2[2];
          }
          p1 += 3;
          p2 += 3;
        }
        p1 += inc1;
        p2 += inc2;
      }
    } else if (isize == 4) {
      imask = (unsigned int)(key24 & 0xffffffff);
      for (; h; h--) {
        for (i = w; i; i--) {
          k = (((unsigned int)(*(unsigned short *)p2)) << 8);
          if ((k | p2[2]) != imask) {
            p1[0] = p2[0];
            p1[1] = p2[1];
            p1[2] = p2[2];
          }
          p1 += 3;
          p2 += 3;
        }
        p1 += inc1;
        p2 += inc2;
      }
    }
    break;
  case 4:
    if (longsize == 4) {
      for (; h; h--) {
        for (i = w; i; i--) {
          if (*(unsigned long *)src != mask)
            *(unsigned long *)dst = *(unsigned long *)src;
          src += 4;
          dst += 4;
        }
        dst += inc1;
        src += inc2;
      }
    } else if (isize == 4) {
      imask = (unsigned int)(mask & 0xffffffff);
      for (; h; h--) {
        for (i = w; i; i--) {
          if (*(unsigned int *)src != imask)
            *(unsigned int *)dst = *(unsigned int *)src;
          src += 4;
          dst += 4;
        }
        dst += inc1;
        src += inc2;
      }
    }
    break;
  }
  return 0;
}


x86 assembly (clang, -O0):
<ibitmap_blitmc>:
push   %rbp
mov    %rsp,%rbp
push   %rax
mov    0x20(%rbp),%rax
mov    0x18(%rbp),%rax
mov    0x10(%rbp),%eax
mov    %rdi,-0x8(%rbp)
mov    %rsi,-0x10(%rbp)
mov    %rdx,-0x18(%rbp)
mov    %rcx,-0x20(%rbp)
mov    %r8d,-0x24(%rbp)
mov    %r9d,-0x28(%rbp)
mov    -0x10(%rbp),%rax
mov    0x18(%rbp),%rcx
sub    %rcx,%rax
mov    %rax,-0x60(%rbp)
mov    -0x20(%rbp),%rax
mov    0x18(%rbp),%rcx
sub    %rcx,%rax
mov    %rax,-0x68(%rbp)
movq   $0x8,-0x78(%rbp)
movq   $0x4,-0x80(%rbp)
mov    0x10(%rbp),%eax
add    $0xffffffff,%eax
mov    %eax,%ecx
mov    %rcx,-0x88(%rbp)
sub    $0x3,%eax
ja     160c <ibitmap_blitmc+0x50c>
mov    -0x88(%rbp),%rax
lea    0xe84(%rip),%rcx
movslq (%rcx,%rax,4),%rax
add    %rcx,%rax
jmp    *%rax
mov    0x20(%rbp),%rax
mov    %al,-0x49(%rbp)
cmpl   $0x0,-0x28(%rbp)
je     1217 <ibitmap_blitmc+0x117>
movslq -0x24(%rbp),%rax
mov    %rax,-0x70(%rbp)
cmpq   $0x0,-0x70(%rbp)
je     11f1 <ibitmap_blitmc+0xf1>
mov    -0x18(%rbp),%rax
movzbl (%rax),%eax
movzbl -0x49(%rbp),%ecx
cmp    %ecx,%eax
je     11c8 <ibitmap_blitmc+0xc8>
mov    -0x18(%rbp),%rax
mov    (%rax),%cl
mov    -0x8(%rbp),%rax
mov    %cl,(%rax)
mov    -0x18(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x18(%rbp)
mov    -0x8(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x8(%rbp)
mov    -0x70(%rbp),%rax
add    $0xffffffffffffffff,%rax
mov    %rax,-0x70(%rbp)
jmp    119e <ibitmap_blitmc+0x9e>
mov    -0x60(%rbp),%rax
add    -0x8(%rbp),%rax
mov    %rax,-0x8(%rbp)
mov    -0x68(%rbp),%rax
add    -0x18(%rbp),%rax
mov    %rax,-0x18(%rbp)
mov    -0x28(%rbp),%eax
add    $0xffffffff,%eax
mov    %eax,-0x28(%rbp)
jmp    118c <ibitmap_blitmc+0x8c>
jmp    160c <ibitmap_blitmc+0x50c>
mov    0x20(%rbp),%rax
mov    %ax,-0x4c(%rbp)
cmpl   $0x0,-0x28(%rbp)
je     12b1 <ibitmap_blitmc+0x1b1>
movslq -0x24(%rbp),%rax
mov    %rax,-0x70(%rbp)
cmpq   $0x0,-0x70(%rbp)
je     128b <ibitmap_blitmc+0x18b>
mov    -0x18(%rbp),%rax
movzwl (%rax),%eax
movzwl -0x4c(%rbp),%ecx
cmp    %ecx,%eax
je     1262 <ibitmap_blitmc+0x162>
mov    -0x18(%rbp),%rax
mov    (%rax),%cx
mov    -0x8(%rbp),%rax
mov    %cx,(%rax)
mov    -0x18(%rbp),%rax
add    $0x2,%rax
mov    %rax,-0x18(%rbp)
mov    -0x8(%rbp),%rax
add    $0x2,%rax
mov    %rax,-0x8(%rbp)
mov    -0x70(%rbp),%rax
add    $0xffffffffffffffff,%rax
mov    %rax,-0x70(%rbp)
jmp    1236 <ibitmap_blitmc+0x136>
mov    -0x60(%rbp),%rax
add    -0x8(%rbp),%rax
mov    %rax,-0x8(%rbp)
mov    -0x68(%rbp),%rax
add    -0x18(%rbp),%rax
mov    %rax,-0x18(%rbp)
mov    -0x28(%rbp),%eax
add    $0xffffffff,%eax
mov    %eax,-0x28(%rbp)
jmp    1224 <ibitmap_blitmc+0x124>
jmp    160c <ibitmap_blitmc+0x50c>
movzbl 0x2d63(%rip),%eax
cmp    $0x44,%eax
je     12d3 <ibitmap_blitmc+0x1d3>
mov    0x20(%rbp),%rax
mov    %rax,-0x40(%rbp)
jmp    12f7 <ibitmap_blitmc+0x1f7>
mov    0x20(%rbp),%rax
and    $0xffff,%rax
shl    $0x8,%rax
mov    0x20(%rbp),%rcx
shr    $0x10,%rcx
and    $0xff,%rcx
or     %rcx,%rax
mov    %rax,-0x40(%rbp)
mov    -0x8(%rbp),%rax
mov    %rax,-0x30(%rbp)
mov    -0x18(%rbp),%rax
mov    %rax,-0x38(%rbp)
cmpq   $0x4,-0x78(%rbp)
jne    13d8 <ibitmap_blitmc+0x2d8>
jmp    1317 <ibitmap_blitmc+0x217>
cmpl   $0x0,-0x28(%rbp)
je     13d3 <ibitmap_blitmc+0x2d3>
movslq -0x24(%rbp),%rax
mov    %rax,-0x70(%rbp)
cmpq   $0x0,-0x70(%rbp)
je     13ad <ibitmap_blitmc+0x2ad>
mov    -0x38(%rbp),%rax
movzwl (%rax),%eax
shl    $0x8,%rax
mov    %rax,-0x48(%rbp)
mov    -0x48(%rbp),%rax
mov    -0x38(%rbp),%rcx
movzbl 0x2(%rcx),%ecx
or     %rcx,%rax
cmp    -0x40(%rbp),%rax
je     1384 <ibitmap_blitmc+0x284>
mov    -0x38(%rbp),%rax
mov    (%rax),%cl
mov    -0x30(%rbp),%rax
mov    %cl,(%rax)
mov    -0x38(%rbp),%rax
mov    0x1(%rax),%cl
mov    -0x30(%rbp),%rax
mov    %cl,0x1(%rax)
mov    -0x38(%rbp),%rax
mov    0x2(%rax),%cl
mov    -0x30(%rbp),%rax
mov    %cl,0x2(%rax)
mov    -0x30(%rbp),%rax
add    $0x3,%rax
mov    %rax,-0x30(%rbp)
mov    -0x38(%rbp),%rax
add    $0x3,%rax
mov    %rax,-0x38(%rbp)
mov    -0x70(%rbp),%rax
add    $0xffffffffffffffff,%rax
mov    %rax,-0x70(%rbp)
jmp    1329 <ibitmap_blitmc+0x229>
mov    -0x60(%rbp),%rax
add    -0x30(%rbp),%rax
mov    %rax,-0x30(%rbp)
mov    -0x68(%rbp),%rax
add    -0x38(%rbp),%rax
mov    %rax,-0x38(%rbp)
mov    -0x28(%rbp),%eax
add    $0xffffffff,%eax
mov    %eax,-0x28(%rbp)
jmp    1317 <ibitmap_blitmc+0x217>
jmp    14b5 <ibitmap_blitmc+0x3b5>
cmpq   $0x4,-0x80(%rbp)
jne    14b0 <ibitmap_blitmc+0x3b0>
movabs $0xffffffff,%rax
and    -0x40(%rbp),%rax
mov    %eax,-0x50(%rbp)
cmpl   $0x0,-0x28(%rbp)
je     14ab <ibitmap_blitmc+0x3ab>
movslq -0x24(%rbp),%rax
mov    %rax,-0x70(%rbp)
cmpq   $0x0,-0x70(%rbp)
je     1485 <ibitmap_blitmc+0x385>
mov    -0x38(%rbp),%rax
movzwl (%rax),%eax
shl    $0x8,%eax
mov    %eax,-0x54(%rbp)
mov    -0x54(%rbp),%eax
mov    -0x38(%rbp),%rcx
movzbl 0x2(%rcx),%ecx
or     %ecx,%eax
cmp    -0x50(%rbp),%eax
je     145c <ibitmap_blitmc+0x35c>
mov    -0x38(%rbp),%rax
mov    (%rax),%cl
mov    -0x30(%rbp),%rax
mov    %cl,(%rax)
mov    -0x38(%rbp),%rax
mov    0x1(%rax),%cl
mov    -0x30(%rbp),%rax
mov    %cl,0x1(%rax)
mov    -0x38(%rbp),%rax
mov    0x2(%rax),%cl
mov    -0x30(%rbp),%rax
mov    %cl,0x2(%rax)
mov    -0x30(%rbp),%rax
add    $0x3,%rax
mov    %rax,-0x30(%rbp)
mov    -0x38(%rbp),%rax
add    $0x3,%rax
mov    %rax,-0x38(%rbp)
mov    -0x70(%rbp),%rax
add    $0xffffffffffffffff,%rax
mov    %rax,-0x70(%rbp)
jmp    1406 <ibitmap_blitmc+0x306>
mov    -0x60(%rbp),%rax
add    -0x30(%rbp),%rax
mov    %rax,-0x30(%rbp)
mov    -0x68(%rbp),%rax
add    -0x38(%rbp),%rax
mov    %rax,-0x38(%rbp)
mov    -0x28(%rbp),%eax
add    $0xffffffff,%eax
mov    %eax,-0x28(%rbp)
jmp    13f4 <ibitmap_blitmc+0x2f4>
jmp    14b0 <ibitmap_blitmc+0x3b0>
jmp    14b5 <ibitmap_blitmc+0x3b5>
jmp    160c <ibitmap_blitmc+0x50c>
cmpq   $0x4,-0x78(%rbp)
jne    155a <ibitmap_blitmc+0x45a>
jmp    14ca <ibitmap_blitmc+0x3ca>
cmpl   $0x0,-0x28(%rbp)
je     1555 <ibitmap_blitmc+0x455>
movslq -0x24(%rbp),%rax
mov    %rax,-0x70(%rbp)
cmpq   $0x0,-0x70(%rbp)
je     152f <ibitmap_blitmc+0x42f>
mov    -0x18(%rbp),%rax
mov    (%rax),%rax
cmp    0x20(%rbp),%rax
je     1506 <ibitmap_blitmc+0x406>
mov    -0x18(%rbp),%rax
mov    (%rax),%rcx
mov    -0x8(%rbp),%rax
mov    %rcx,(%rax)
mov    -0x18(%rbp),%rax
add    $0x4,%rax
mov    %rax,-0x18(%rbp)
mov    -0x8(%rbp),%rax
add    $0x4,%rax
mov    %rax,-0x8(%rbp)
mov    -0x70(%rbp),%rax
add    $0xffffffffffffffff,%rax
mov    %rax,-0x70(%rbp)
jmp    14dc <ibitmap_blitmc+0x3dc>
mov    -0x60(%rbp),%rax
add    -0x8(%rbp),%rax
mov    %rax,-0x8(%rbp)
mov    -0x68(%rbp),%rax
add    -0x18(%rbp),%rax
mov    %rax,-0x18(%rbp)
mov    -0x28(%rbp),%eax
add    $0xffffffff,%eax
mov    %eax,-0x28(%rbp)
jmp    14ca <ibitmap_blitmc+0x3ca>
jmp    1607 <ibitmap_blitmc+0x507>
cmpq   $0x4,-0x80(%rbp)
jne    1602 <ibitmap_blitmc+0x502>
movabs $0xffffffff,%rax
and    0x20(%rbp),%rax
mov    %eax,-0x50(%rbp)
cmpl   $0x0,-0x28(%rbp)
je     15fd <ibitmap_blitmc+0x4fd>
movslq -0x24(%rbp),%rax
mov    %rax,-0x70(%rbp)
cmpq   $0x0,-0x70(%rbp)
je     15d7 <ibitmap_blitmc+0x4d7>
mov    -0x18(%rbp),%rax
mov    (%rax),%eax
cmp    -0x50(%rbp),%eax
je     15ae <ibitmap_blitmc+0x4ae>
mov    -0x18(%rbp),%rax
mov    (%rax),%ecx
mov    -0x8(%rbp),%rax
mov    %ecx,(%rax)
mov    -0x18(%rbp),%rax
add    $0x4,%rax
mov    %rax,-0x18(%rbp)
mov    -0x8(%rbp),%rax
add    $0x4,%rax
mov    %rax,-0x8(%rbp)
mov    -0x70(%rbp),%rax
add    $0xffffffffffffffff,%rax
mov    %rax,-0x70(%rbp)
jmp    1588 <ibitmap_blitmc+0x488>
mov    -0x60(%rbp),%rax
add    -0x8(%rbp),%rax
mov    %rax,-0x8(%rbp)
mov    -0x68(%rbp),%rax
add    -0x18(%rbp),%rax
mov    %rax,-0x18(%rbp)
mov    -0x28(%rbp),%eax
add    $0xffffffff,%eax
mov    %eax,-0x28(%rbp)
jmp    1576 <ibitmap_blitmc+0x476>
jmp    1602 <ibitmap_blitmc+0x502>
jmp    1607 <ibitmap_blitmc+0x507>
jmp    160c <ibitmap_blitmc+0x50c>
xor    %eax,%eax
add    $0x8,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<ibitmap_blitmc>:
push   %rbp
push   %r15
push   %r14
push   %r13
push   %r12
push   %rbx
mov    0x38(%rsp),%eax
add    $0xffffffff,%eax
cmp    $0x3,%eax
ja     1781 <ibitmap_blitmc+0x681>
mov    %rcx,%r15
mov    0x48(%rsp),%r12
mov    0x40(%rsp),%rcx
sub    %rcx,%rsi
sub    %rcx,%r15
lea    0xecc(%rip),%rcx
movslq (%rcx,%rax,4),%rax
add    %rcx,%rax
jmp    *%rax
test   %r9d,%r9d
je     1781 <ibitmap_blitmc+0x681>
movslq %r8d,%r10
mov    %r10,%r11
and    $0xfffffffffffffff8,%r11
mov    %r8d,%r14d
and    $0x7,%r14d
movd   %r12d,%xmm0
punpcklbw %xmm0,%xmm0
pshuflw $0x0,%xmm0,%xmm0
pcmpeqd %xmm1,%xmm1
jmp    118c <ibitmap_blitmc+0x8c>
nopl   0x0(%rax,%rax,1)
mov    %rdx,%rax
mov    %rdi,%r13
add    %rsi,%r13
add    %r15,%rax
mov    %r13,%rdi
mov    %rax,%rdx
add    $0xffffffff,%r9d
je     1781 <ibitmap_blitmc+0x681>
test   %r8d,%r8d
je     1170 <ibitmap_blitmc+0x70>
cmp    $0x8,%r8d
jb     11b1 <ibitmap_blitmc+0xb1>
lea    (%rdx,%r10,1),%rax
cmp    %rax,%rdi
jae    1257 <ibitmap_blitmc+0x157>
lea    (%rdi,%r10,1),%rax
cmp    %rax,%rdx
jae    1257 <ibitmap_blitmc+0x157>
mov    %rdi,%r13
mov    %rdx,%rax
mov    %r10,%rdx
lea    -0x1(%rdx),%rdi
mov    %rdx,%rbp
and    $0x3,%rbp
je     11f9 <ibitmap_blitmc+0xf9>
xor    %ecx,%ecx
jmp    11d9 <ibitmap_blitmc+0xd9>
nopl   0x0(%rax,%rax,1)
add    $0x1,%rcx
cmp    %rcx,%rbp
je     11f0 <ibitmap_blitmc+0xf0>
movzbl (%rax,%rcx,1),%ebx
cmp    %r12b,%bl
je     11d0 <ibitmap_blitmc+0xd0>
mov    %bl,0x0(%r13,%rcx,1)
jmp    11d0 <ibitmap_blitmc+0xd0>
nopl   0x0(%rax)
add    %rcx,%r13
add    %rcx,%rax
sub    %rcx,%rdx
cmp    $0x3,%rdi
jae    1222 <ibitmap_blitmc+0x122>
jmp    1176 <ibitmap_blitmc+0x76>
cs nopw 0x0(%rax,%rax,1)
xchg   %ax,%ax
add    $0x4,%rax
add    $0x4,%r13
add    $0xfffffffffffffffc,%rdx
je     1176 <ibitmap_blitmc+0x76>
movzbl (%rax),%ecx
cmp    %r12b,%cl
je     122e <ibitmap_blitmc+0x12e>
mov    %cl,0x0(%r13)
movzbl 0x1(%rax),%ecx
cmp    %r12b,%cl
je     123b <ibitmap_blitmc+0x13b>
mov    %cl,0x1(%r13)
movzbl 0x2(%rax),%ecx
cmp    %r12b,%cl
je     1248 <ibitmap_blitmc+0x148>
mov    %cl,0x2(%r13)
movzbl 0x3(%rax),%ecx
cmp    %r12b,%cl
je     1210 <ibitmap_blitmc+0x110>
mov    %cl,0x3(%r13)
jmp    1210 <ibitmap_blitmc+0x110>
lea    (%rdi,%r11,1),%r13
lea    (%rdx,%r11,1),%rax
xor    %ebp,%ebp
jmp    127d <ibitmap_blitmc+0x17d>
cs nopw 0x0(%rax,%rax,1)
nopl   (%rax)
add    $0x8,%rbp
cmp    %rbp,%r11
je     1355 <ibitmap_blitmc+0x255>
movq   (%rdx,%rbp,1),%xmm2
movdqa %xmm2,%xmm4
pcmpeqb %xmm0,%xmm4
movd   %xmm4,%ebx
not    %bl
movd   %xmm2,%ecx
test   $0x1,%bl
je     129c <ibitmap_blitmc+0x19c>
mov    %cl,(%rdi,%rbp,1)
movdqa %xmm4,%xmm3
pxor   %xmm1,%xmm3
movdqa %xmm3,%xmm5
pslld  $0x8,%xmm5
movd   %xmm5,%ebx
shr    $0x10,%ebx
test   $0x1,%bl
je     12bd <ibitmap_blitmc+0x1bd>
mov    %ch,0x1(%rdi,%rbp,1)
pshuflw $0x55,%xmm4,%xmm5
pxor   %xmm1,%xmm5
pextrw $0x2,%xmm5,%ebx
test   $0x1,%bl
je     12d9 <ibitmap_blitmc+0x1d9>
mov    %ecx,%ebx
shr    $0x10,%ebx
mov    %bl,0x2(%rdi,%rbp,1)
movdqa %xmm3,%xmm5
psllq  $0x18,%xmm5
pextrw $0x3,%xmm5,%ebx
test   $0x1,%bl
je     12f3 <ibitmap_blitmc+0x1f3>
shr    $0x18,%ecx
mov    %cl,0x3(%rdi,%rbp,1)
pshufd $0x55,%xmm4,%xmm4
pxor   %xmm1,%xmm4
pextrw $0x4,%xmm4,%ebx
pextrw $0x2,%xmm2,%ecx
test   $0x1,%bl
je     130f <ibitmap_blitmc+0x20f>
mov    %cl,0x4(%rdi,%rbp,1)
movdqa %xmm3,%xmm4
pslldq $0x5,%xmm4
pextrw $0x5,%xmm4,%ebx
test   $0x1,%bl
je     1326 <ibitmap_blitmc+0x226>
mov    %ch,0x5(%rdi,%rbp,1)
pextrw $0x3,%xmm3,%ebx
pextrw $0x3,%xmm2,%ecx
test   $0x1,%bl
je     1339 <ibitmap_blitmc+0x239>
mov    %cl,0x6(%rdi,%rbp,1)
pslldq $0x7,%xmm3
pextrw $0x7,%xmm3,%ebx
test   $0x1,%bl
je     1270 <ibitmap_blitmc+0x170>
mov    %ch,0x7(%rdi,%rbp,1)
jmp    1270 <ibitmap_blitmc+0x170>
mov    %r14,%rdx
cmp    %r10,%r11
je     1176 <ibitmap_blitmc+0x76>
jmp    11ba <ibitmap_blitmc+0xba>
test   %r9d,%r9d
je     1781 <ibitmap_blitmc+0x681>
movslq %r8d,%r11
lea    (%r11,%r11,1),%r14
mov    %r11,%r13
and    $0xfffffffffffffff8,%r13
mov    %r13,%rax
add    %r13,%rax
mov    %rax,-0x8(%rsp)
mov    %r8d,%eax
and    $0x7,%eax
mov    %rax,-0x10(%rsp)
movd   %r12d,%xmm0
pshuflw $0x0,%xmm0,%xmm0
pshufd $0x0,%xmm0,%xmm0
pcmpeqd %xmm1,%xmm1
jmp    13cc <ibitmap_blitmc+0x2cc>
nopl   0x0(%rax,%rax,1)
mov    %rdx,%rbx
mov    %rdi,%r10
add    %rsi,%r10
add    %r15,%rbx
mov    %r10,%rdi
mov    %rbx,%rdx
add    $0xffffffff,%r9d
je     1781 <ibitmap_blitmc+0x681>
test   %r8d,%r8d
je     13b0 <ibitmap_blitmc+0x2b0>
cmp    $0x8,%r8d
jb     13f1 <ibitmap_blitmc+0x2f1>
lea    (%rdx,%r14,1),%rax
cmp    %rax,%rdi
jae    14cb <ibitmap_blitmc+0x3cb>
lea    (%rdi,%r14,1),%rax
cmp    %rax,%rdx
jae    14cb <ibitmap_blitmc+0x3cb>
mov    %rdi,%r10
mov    %rdx,%rbx
mov    %r11,%rdx
lea    -0x1(%rdx),%rdi
mov    %rdx,%rbp
and    $0x3,%rbp
je     1446 <ibitmap_blitmc+0x346>
mov    %r14,%rax
xor    %ecx,%ecx
jmp    1421 <ibitmap_blitmc+0x321>
xchg   %ax,%ax
add    $0x2,%rbx
add    $0x2,%r10
add    $0x1,%rcx
cmp    %rcx,%rbp
je     1440 <ibitmap_blitmc+0x340>
movzwl (%rbx),%r14d
cmp    %r12w,%r14w
je     1410 <ibitmap_blitmc+0x310>
mov    %r14w,(%r10)
jmp    1410 <ibitmap_blitmc+0x310>
cs nopw 0x0(%rax,%rax,1)
nopl   0x0(%rax,%rax,1)
sub    %rcx,%rdx
mov    %rax,%r14
cmp    $0x3,%rdi
jb     13b6 <ibitmap_blitmc+0x2b6>
xor    %ebp,%ebp
xor    %edi,%edi
jmp    146d <ibitmap_blitmc+0x36d>
cs nopw 0x0(%rax,%rax,1)
add    $0xfffffffffffffff8,%rdi
add    $0x4,%rbp
cmp    %rbp,%rdx
je     14c0 <ibitmap_blitmc+0x3c0>
movzwl (%rbx,%rbp,2),%ecx
cmp    %r12w,%cx
je     147c <ibitmap_blitmc+0x37c>
mov    %cx,(%r10,%rbp,2)
movzwl 0x2(%rbx,%rbp,2),%ecx
cmp    %r12w,%cx
je     148d <ibitmap_blitmc+0x38d>
mov    %cx,0x2(%r10,%rbp,2)
movzwl 0x4(%rbx,%rbp,2),%ecx
cmp    %r12w,%cx
je     149e <ibitmap_blitmc+0x39e>
mov    %cx,0x4(%r10,%rbp,2)
movzwl 0x6(%rbx,%rbp,2),%ecx
cmp    %r12w,%cx
je     1460 <ibitmap_blitmc+0x360>
mov    %cx,0x6(%r10,%rbp,2)
jmp    1460 <ibitmap_blitmc+0x360>
cs nopw 0x0(%rax,%rax,1)
nopl   0x0(%rax,%rax,1)
sub    %rdi,%r10
sub    %rdi,%rbx
jmp    13b6 <ibitmap_blitmc+0x2b6>
mov    -0x8(%rsp),%rax
lea    (%rdi,%rax,1),%r10
lea    (%rdx,%rax,1),%rbx
xor    %ebp,%ebp
jmp    14ed <ibitmap_blitmc+0x3ed>
nopl   0x0(%rax)
add    $0x8,%rbp
cmp    %rbp,%r13
je     159e <ibitmap_blitmc+0x49e>
movdqu (%rdx,%rbp,2),%xmm2
movdqa %xmm2,%xmm3
pcmpeqw %xmm0,%xmm3
movd   %xmm3,%ecx
not    %ecx
test   $0x1,%cl
je     150d <ibitmap_blitmc+0x40d>
movd   %xmm2,%eax
mov    %ax,(%rdi,%rbp,2)
shr    $0x10,%ecx
test   $0x1,%cl
je     151f <ibitmap_blitmc+0x41f>
pextrw $0x1,%xmm2,%eax
mov    %ax,0x2(%rdi,%rbp,2)
pxor   %xmm1,%xmm3
pextrw $0x2,%xmm3,%eax
test   $0x1,%al
je     1536 <ibitmap_blitmc+0x436>
pextrw $0x2,%xmm2,%eax
mov    %ax,0x4(%rdi,%rbp,2)
pextrw $0x3,%xmm3,%eax
test   $0x1,%al
je     1549 <ibitmap_blitmc+0x449>
pextrw $0x3,%xmm2,%eax
mov    %ax,0x6(%rdi,%rbp,2)
pextrw $0x4,%xmm3,%eax
test   $0x1,%al
je     155c <ibitmap_blitmc+0x45c>
pextrw $0x4,%xmm2,%eax
mov    %ax,0x8(%rdi,%rbp,2)
pextrw $0x5,%xmm3,%eax
test   $0x1,%al
je     156f <ibitmap_blitmc+0x46f>
pextrw $0x5,%xmm2,%eax
mov    %ax,0xa(%rdi,%rbp,2)
pextrw $0x6,%xmm3,%eax
test   $0x1,%al
je     1582 <ibitmap_blitmc+0x482>
pextrw $0x6,%xmm2,%eax
mov    %ax,0xc(%rdi,%rbp,2)
pextrw $0x7,%xmm3,%eax
test   $0x1,%al
je     14e0 <ibitmap_blitmc+0x3e0>
pextrw $0x7,%xmm2,%eax
mov    %ax,0xe(%rdi,%rbp,2)
jmp    14e0 <ibitmap_blitmc+0x3e0>
mov    -0x10(%rsp),%rdx
cmp    %r11,%r13
je     13b6 <ibitmap_blitmc+0x2b6>
jmp    13fa <ibitmap_blitmc+0x2fa>
test   %r9d,%r9d
je     1781 <ibitmap_blitmc+0x681>
movzwl %r12w,%ecx
shl    $0x8,%ecx
shr    $0x10,%r12d
movzbl %r12b,%r14d
or     %ecx,%r14d
movslq %r8d,%r11
lea    -0x1(%r11),%r10
jmp    15f0 <ibitmap_blitmc+0x4f0>
cs nopw 0x0(%rax,%rax,1)
nop
add    %rsi,%rdi
add    %r15,%rdx
add    $0xffffffff,%r9d
je     1781 <ibitmap_blitmc+0x681>
test   %r8d,%r8d
je     15e0 <ibitmap_blitmc+0x4e0>
test   $0x1,%r11b
jne    1610 <ibitmap_blitmc+0x510>
mov    %r11,%rbx
cmp    $0x1,%r8d
jne    165e <ibitmap_blitmc+0x55e>
jmp    15e0 <ibitmap_blitmc+0x4e0>
cs nopw 0x0(%rax,%rax,1)
movzwl (%rdx),%ebx
mov    %ebx,%ecx
shl    $0x8,%ecx
movzbl 0x2(%rdx),%ebp
or     %ecx,%ebp
cmp    %r14d,%ebp
je     1631 <ibitmap_blitmc+0x531>
mov    %bl,(%rdi)
mov    0x1(%rdx),%cl
mov    %cl,0x1(%rdi)
mov    0x2(%rdx),%cl
mov    %cl,0x2(%rdi)
add    $0x3,%rdi
add    $0x3,%rdx
mov    %r10,%rbx
cmp    $0x1,%r8d
jne    165e <ibitmap_blitmc+0x55e>
jmp    15e0 <ibitmap_blitmc+0x4e0>
cs nopw 0x0(%rax,%rax,1)
xchg   %ax,%ax
add    $0x6,%rdi
add    $0x6,%rdx
add    $0xfffffffffffffffe,%rbx
je     15e0 <ibitmap_blitmc+0x4e0>
movzwl (%rdx),%ecx
mov    %ecx,%ebp
shl    $0x8,%ebp
movzbl 0x2(%rdx),%eax
or     %ebp,%eax
cmp    %r14d,%eax
je     1681 <ibitmap_blitmc+0x581>
mov    %cl,(%rdi)
movzbl 0x1(%rdx),%eax
mov    %al,0x1(%rdi)
movzbl 0x2(%rdx),%eax
mov    %al,0x2(%rdi)
movzwl 0x3(%rdx),%ecx
mov    %ecx,%eax
shl    $0x8,%eax
movzbl 0x5(%rdx),%ebp
or     %eax,%ebp
cmp    %r14d,%ebp
je     1650 <ibitmap_blitmc+0x550>
mov    %cl,0x3(%rdi)
movzbl 0x4(%rdx),%eax
mov    %al,0x4(%rdi)
movzbl 0x5(%rdx),%eax
mov    %al,0x5(%rdi)
jmp    1650 <ibitmap_blitmc+0x550>
test   %r9d,%r9d
je     1781 <ibitmap_blitmc+0x681>
movslq %r8d,%r11
lea    -0x1(%r11),%r10
mov    %r8d,%r14d
and    $0x3,%r14d
jmp    16e6 <ibitmap_blitmc+0x5e6>
cs nopw 0x0(%rax,%rax,1)
nopl   0x0(%rax,%rax,1)
sub    %rcx,%rdi
sub    %rcx,%rdx
add    %rsi,%rdi
add    %r15,%rdx
add    $0xffffffff,%r9d
je     1781 <ibitmap_blitmc+0x681>
test   %r8d,%r8d
je     16d6 <ibitmap_blitmc+0x5d6>
test   %r14,%r14
je     1730 <ibitmap_blitmc+0x630>
xor    %ecx,%ecx
jmp    1711 <ibitmap_blitmc+0x611>
cs nopw 0x0(%rax,%rax,1)
xchg   %ax,%ax
add    $0x4,%rdx
add    $0x4,%rdi
add    $0x1,%rcx
cmp    %rcx,%r14
je     1720 <ibitmap_blitmc+0x620>
mov    (%rdx),%eax
cmp    %r12d,%eax
je     1700 <ibitmap_blitmc+0x600>
mov    %eax,(%rdi)
jmp    1700 <ibitmap_blitmc+0x600>
nopl   0x0(%rax)
mov    %r11,%rax
sub    %rcx,%rax
cmp    $0x3,%r10
jb     16d6 <ibitmap_blitmc+0x5d6>
jmp    1739 <ibitmap_blitmc+0x639>
xchg   %ax,%ax
mov    %r11,%rax
cmp    $0x3,%r10
jb     16d6 <ibitmap_blitmc+0x5d6>
xor    %ebp,%ebp
xor    %ecx,%ecx
jmp    174d <ibitmap_blitmc+0x64d>
nop
add    $0xfffffffffffffff0,%rcx
add    $0x4,%rbp
cmp    %rbp,%rax
je     16d0 <ibitmap_blitmc+0x5d0>
mov    (%rdx,%rbp,4),%ebx
cmp    %r12d,%ebx
je     1758 <ibitmap_blitmc+0x658>
mov    %ebx,(%rdi,%rbp,4)
mov    0x4(%rdx,%rbp,4),%ebx
cmp    %r12d,%ebx
je     1765 <ibitmap_blitmc+0x665>
mov    %ebx,0x4(%rdi,%rbp,4)
mov    0x8(%rdx,%rbp,4),%ebx
cmp    %r12d,%ebx
je     1772 <ibitmap_blitmc+0x672>
mov    %ebx,0x8(%rdi,%rbp,4)
mov    0xc(%rdx,%rbp,4),%ebx
cmp    %r12d,%ebx
je     1740 <ibitmap_blitmc+0x640>
mov    %ebx,0xc(%rdi,%rbp,4)
jmp    1740 <ibitmap_blitmc+0x640>
xor    %eax,%eax
pop    %rbx
pop    %r12
pop    %r13
pop    %r14
pop    %r15
pop    %rbp
ret

LLVM IR (-O0):
@ibitmap_blitmc.endian = internal global i64 287454020
define i32 @ibitmap_blitmc(i8* %0, i64 %1, i8* %2, i64 %3, i32 %4, i32 %5, i32 %6, i64 %7, i64 %8) {
%10 = alloca i8*
%11 = alloca i64
%12 = alloca i8*
%13 = alloca i64
%14 = alloca i32
%15 = alloca i32
%16 = alloca i32
%17 = alloca i64
%18 = alloca i64
%19 = alloca i8*
%20 = alloca i8*
%21 = alloca i64
%22 = alloca i64
%23 = alloca i8
%24 = alloca i16
%25 = alloca i32
%26 = alloca i32
%27 = alloca i64
%28 = alloca i64
%29 = alloca i64
%30 = alloca i64
%31 = alloca i64
store i8* %0, i8** %10
store i64 %1, i64* %11
store i8* %2, i8** %12
store i64 %3, i64* %13
store i32 %4, i32* %14
store i32 %5, i32* %15
store i32 %6, i32* %16
store i64 %7, i64* %17
store i64 %8, i64* %18
%32 = load i64, i64* %11
%33 = load i64, i64* %17
%34 = sub nsw i64 %32, %33
store i64 %34, i64* %27
%35 = load i64, i64* %13
%36 = load i64, i64* %17
%37 = sub nsw i64 %35, %36
store i64 %37, i64* %28
store i64 8, i64* %30
store i64 4, i64* %31
%38 = load i32, i32* %16
switch i32 %38, label %364 [
i32 1, label %39
i32 2, label %81
i32 3, label %126
i32 4, label %271
]
39: ; preds = %9
%40 = load i64, i64* %18
%41 = trunc i64 %40 to i8
store i8 %41, i8* %23
br label %42
42: ; preds = %77, %39
%43 = load i32, i32* %15
%44 = icmp ne i32 %43, 0
br i1 %44, label %45, label %80
45: ; preds = %42
%46 = load i32, i32* %14
%47 = sext i32 %46 to i64
store i64 %47, i64* %29
br label %48
48: ; preds = %67, %45
%49 = load i64, i64* %29
%50 = icmp ne i64 %49, 0
br i1 %50, label %51, label %70
51: ; preds = %48
%52 = load i8*, i8** %12
%53 = load i8, i8* %52
%54 = zext i8 %53 to i32
%55 = load i8, i8* %23
%56 = zext i8 %55 to i32
%57 = icmp ne i32 %54, %56
br i1 %57, label %58, label %62
58: ; preds = %51
%59 = load i8*, i8** %12
%60 = load i8, i8* %59
%61 = load i8*, i8** %10
store i8 %60, i8* %61
br label %62
62: ; preds = %58, %51
%63 = load i8*, i8** %12
%64 = getelementptr inbounds i8, i8* %63, i32 1
store i8* %64, i8** %12
%65 = load i8*, i8** %10
%66 = getelementptr inbounds i8, i8* %65, i32 1
store i8* %66, i8** %10
br label %67
67: ; preds = %62
%68 = load i64, i64* %29
%69 = add nsw i64 %68, -1
store i64 %69, i64* %29
br label %48
70: ; preds = %48
%71 = load i64, i64* %27
%72 = load i8*, i8** %10
%73 = getelementptr inbounds i8, i8* %72, i64 %71
store i8* %73, i8** %10
%74 = load i64, i64* %28
%75 = load i8*, i8** %12
%76 = getelementptr inbounds i8, i8* %75, i64 %74
store i8* %76, i8** %12
br label %77
77: ; preds = %70
%78 = load i32, i32* %15
%79 = add nsw i32 %78, -1
store i32 %79, i32* %15
br label %42
80: ; preds = %42
br label %364
81: ; preds = %9
%82 = load i64, i64* %18
%83 = trunc i64 %82 to i16
store i16 %83, i16* %24
br label %84
84: ; preds = %122, %81
%85 = load i32, i32* %15
%86 = icmp ne i32 %85, 0
br i1 %86, label %87, label %125
87: ; preds = %84
%88 = load i32, i32* %14
%89 = sext i32 %88 to i64
store i64 %89, i64* %29
br label %90
90: ; preds = %112, %87
%91 = load i64, i64* %29
%92 = icmp ne i64 %91, 0
br i1 %92, label %93, label %115
93: ; preds = %90
%94 = load i8*, i8** %12
%95 = bitcast i8* %94 to i16*
%96 = load i16, i16* %95
%97 = zext i16 %96 to i32
%98 = load i16, i16* %24
%99 = zext i16 %98 to i32
%100 = icmp ne i32 %97, %99
br i1 %100, label %101, label %107
101: ; preds = %93
%102 = load i8*, i8** %12
%103 = bitcast i8* %102 to i16*
%104 = load i16, i16* %103
%105 = load i8*, i8** %10
%106 = bitcast i8* %105 to i16*
store i16 %104, i16* %106
br label %107
107: ; preds = %101, %93
%108 = load i8*, i8** %12
%109 = getelementptr inbounds i8, i8* %108, i64 2
store i8* %109, i8** %12
%110 = load i8*, i8** %10
%111 = getelementptr inbounds i8, i8* %110, i64 2
store i8* %111, i8** %10
br label %112
112: ; preds = %107
%113 = load i64, i64* %29
%114 = add nsw i64 %113, -1
store i64 %114, i64* %29
br label %90
115: ; preds = %90
%116 = load i64, i64* %27
%117 = load i8*, i8** %10
%118 = getelementptr inbounds i8, i8* %117, i64 %116
store i8* %118, i8** %10
%119 = load i64, i64* %28
%120 = load i8*, i8** %12
%121 = getelementptr inbounds i8, i8* %120, i64 %119
store i8* %121, i8** %12
br label %122
122: ; preds = %115
%123 = load i32, i32* %15
%124 = add nsw i32 %123, -1
store i32 %124, i32* %15
br label %84
125: ; preds = %84
br label %364
126: ; preds = %9
%127 = load i8, i8* bitcast (i64* @ibitmap_blitmc.endian to i8*)
%128 = zext i8 %127 to i32
%129 = icmp ne i32 %128, 68
br i1 %129, label %130, label %132
130: ; preds = %126
%131 = load i64, i64* %18
store i64 %131, i64* %21
br label %140
132: ; preds = %126
%133 = load i64, i64* %18
%134 = and i64 %133, 65535
%135 = shl i64 %134, 8
%136 = load i64, i64* %18
%137 = lshr i64 %136, 16
%138 = and i64 %137, 255
%139 = or i64 %135, %138
store i64 %139, i64* %21
br label %140
140: ; preds = %132, %130
%141 = load i8*, i8** %10
store i8* %141, i8** %19
%142 = load i8*, i8** %12
store i8* %142, i8** %20
%143 = load i64, i64* %30
%144 = icmp eq i64 %143, 4
br i1 %144, label %145, label %204
145: ; preds = %140
br label %146
146: ; preds = %200, %145
%147 = load i32, i32* %15
%148 = icmp ne i32 %147, 0
br i1 %148, label %149, label %203
149: ; preds = %146
%150 = load i32, i32* %14
%151 = sext i32 %150 to i64
store i64 %151, i64* %29
br label %152
152: ; preds = %190, %149
%153 = load i64, i64* %29
%154 = icmp ne i64 %153, 0
br i1 %154, label %155, label %193
155: ; preds = %152
%156 = load i8*, i8** %20
%157 = bitcast i8* %156 to i16*
%158 = load i16, i16* %157
%159 = zext i16 %158 to i64
%160 = shl i64 %159, 8
store i64 %160, i64* %22
%161 = load i64, i64* %22
%162 = load i8*, i8** %20
%163 = getelementptr inbounds i8, i8* %162, i64 2
%164 = load i8, i8* %163
%165 = zext i8 %164 to i64
%166 = or i64 %161, %165
%167 = load i64, i64* %21
%168 = icmp ne i64 %166, %167
br i1 %168, label %169, label %185
169: ; preds = %155
%170 = load i8*, i8** %20
%171 = getelementptr inbounds i8, i8* %170, i64 0
%172 = load i8, i8* %171
%173 = load i8*, i8** %19
%174 = getelementptr inbounds i8, i8* %173, i64 0
store i8 %172, i8* %174
%175 = load i8*, i8** %20
%176 = getelementptr inbounds i8, i8* %175, i64 1
%177 = load i8, i8* %176
%178 = load i8*, i8** %19
%179 = getelementptr inbounds i8, i8* %178, i64 1
store i8 %177, i8* %179
%180 = load i8*, i8** %20
%181 = getelementptr inbounds i8, i8* %180, i64 2
%182 = load i8, i8* %181
%183 = load i8*, i8** %19
%184 = getelementptr inbounds i8, i8* %183, i64 2
store i8 %182, i8* %184
br label %185
185: ; preds = %169, %155
%186 = load i8*, i8** %19
%187 = getelementptr inbounds i8, i8* %186, i64 3
store i8* %187, i8** %19
%188 = load i8*, i8** %20
%189 = getelementptr inbounds i8, i8* %188, i64 3
store i8* %189, i8** %20
br label %190
190: ; preds = %185
%191 = load i64, i64* %29
%192 = add nsw i64 %191, -1
store i64 %192, i64* %29
br label %152
193: ; preds = %152
%194 = load i64, i64* %27
%195 = load i8*, i8** %19
%196 = getelementptr inbounds i8, i8* %195, i64 %194
store i8* %196, i8** %19
%197 = load i64, i64* %28
%198 = load i8*, i8** %20
%199 = getelementptr inbounds i8, i8* %198, i64 %197
store i8* %199, i8** %20
br label %200
200: ; preds = %193
%201 = load i32, i32* %15
%202 = add nsw i32 %201, -1
store i32 %202, i32* %15
br label %146
203: ; preds = %146
br label %270
204: ; preds = %140
%205 = load i64, i64* %31
%206 = icmp eq i64 %205, 4
br i1 %206, label %207, label %269
207: ; preds = %204
%208 = load i64, i64* %21
%209 = and i64 %208, 4294967295
%210 = trunc i64 %209 to i32
store i32 %210, i32* %25
br label %211
211: ; preds = %265, %207
%212 = load i32, i32* %15
%213 = icmp ne i32 %212, 0
br i1 %213, label %214, label %268
214: ; preds = %211
%215 = load i32, i32* %14
%216 = sext i32 %215 to i64
store i64 %216, i64* %29
br label %217
217: ; preds = %255, %214
%218 = load i64, i64* %29
%219 = icmp ne i64 %218, 0
br i1 %219, label %220, label %258
220: ; preds = %217
%221 = load i8*, i8** %20
%222 = bitcast i8* %221 to i16*
%223 = load i16, i16* %222
%224 = zext i16 %223 to i32
%225 = shl i32 %224, 8
store i32 %225, i32* %26
%226 = load i32, i32* %26
%227 = load i8*, i8** %20
%228 = getelementptr inbounds i8, i8* %227, i64 2
%229 = load i8, i8* %228
%230 = zext i8 %229 to i32
%231 = or i32 %226, %230
%232 = load i32, i32* %25
%233 = icmp ne i32 %231, %232
br i1 %233, label %234, label %250
234: ; preds = %220
%235 = load i8*, i8** %20
%236 = getelementptr inbounds i8, i8* %235, i64 0
%237 = load i8, i8* %236
%238 = load i8*, i8** %19
%239 = getelementptr inbounds i8, i8* %238, i64 0
store i8 %237, i8* %239
%240 = load i8*, i8** %20
%241 = getelementptr inbounds i8, i8* %240, i64 1
%242 = load i8, i8* %241
%243 = load i8*, i8** %19
%244 = getelementptr inbounds i8, i8* %243, i64 1
store i8 %242, i8* %244
%245 = load i8*, i8** %20
%246 = getelementptr inbounds i8, i8* %245, i64 2
%247 = load i8, i8* %246
%248 = load i8*, i8** %19
%249 = getelementptr inbounds i8, i8* %248, i64 2
store i8 %247, i8* %249
br label %250
250: ; preds = %234, %220
%251 = load i8*, i8** %19
%252 = getelementptr inbounds i8, i8* %251, i64 3
store i8* %252, i8** %19
%253 = load i8*, i8** %20
%254 = getelementptr inbounds i8, i8* %253, i64 3
store i8* %254, i8** %20
br label %255
255: ; preds = %250
%256 = load i64, i64* %29
%257 = add nsw i64 %256, -1
store i64 %257, i64* %29
br label %217
258: ; preds = %217
%259 = load i64, i64* %27
%260 = load i8*, i8** %19
%261 = getelementptr inbounds i8, i8* %260, i64 %259
store i8* %261, i8** %19
%262 = load i64, i64* %28
%263 = load i8*, i8** %20
%264 = getelementptr inbounds i8, i8* %263, i64 %262
store i8* %264, i8** %20
br label %265
265: ; preds = %258
%266 = load i32, i32* %15
%267 = add nsw i32 %266, -1
store i32 %267, i32* %15
br label %211
268: ; preds = %211
br label %269
269: ; preds = %268, %204
br label %270
270: ; preds = %269, %203
br label %364
271: ; preds = %9
%272 = load i64, i64* %30
%273 = icmp eq i64 %272, 4
br i1 %273, label %274, label %315
274: ; preds = %271
br label %275
275: ; preds = %311, %274
%276 = load i32, i32* %15
%277 = icmp ne i32 %276, 0
br i1 %277, label %278, label %314
278: ; preds = %275
%279 = load i32, i32* %14
%280 = sext i32 %279 to i64
store i64 %280, i64* %29
br label %281
281: ; preds = %301, %278
%282 = load i64, i64* %29
%283 = icmp ne i64 %282, 0
br i1 %283, label %284, label %304
284: ; preds = %281
%285 = load i8*, i8** %12
%286 = bitcast i8* %285 to i64*
%287 = load i64, i64* %286
%288 = load i64, i64* %18
%289 = icmp ne i64 %287, %288
br i1 %289, label %290, label %296
290: ; preds = %284
%291 = load i8*, i8** %12
%292 = bitcast i8* %291 to i64*
%293 = load i64, i64* %292
%294 = load i8*, i8** %10
%295 = bitcast i8* %294 to i64*
store i64 %293, i64* %295
br label %296
296: ; preds = %290, %284
%297 = load i8*, i8** %12
%298 = getelementptr inbounds i8, i8* %297, i64 4
store i8* %298, i8** %12
%299 = load i8*, i8** %10
%300 = getelementptr inbounds i8, i8* %299, i64 4
store i8* %300, i8** %10
br label %301
301: ; preds = %296
%302 = load i64, i64* %29
%303 = add nsw i64 %302, -1
store i64 %303, i64* %29
br label %281
304: ; preds = %281
%305 = load i64, i64* %27
%306 = load i8*, i8** %10
%307 = getelementptr inbounds i8, i8* %306, i64 %305
store i8* %307, i8** %10
%308 = load i64, i64* %28
%309 = load i8*, i8** %12
%310 = getelementptr inbounds i8, i8* %309, i64 %308
store i8* %310, i8** %12
br label %311
311: ; preds = %304
%312 = load i32, i32* %15
%313 = add nsw i32 %312, -1
store i32 %313, i32* %15
br label %275
314: ; preds = %275
br label %363
315: ; preds = %271
%316 = load i64, i64* %31
%317 = icmp eq i64 %316, 4
br i1 %317, label %318, label %362
318: ; preds = %315
%319 = load i64, i64* %18
%320 = and i64 %319, 4294967295
%321 = trunc i64 %320 to i32
store i32 %321, i32* %25
br label %322
322: ; preds = %358, %318
%323 = load i32, i32* %15
%324 = icmp ne i32 %323, 0
br i1 %324, label %325, label %361
325: ; preds = %322
%326 = load i32, i32* %14
%327 = sext i32 %326 to i64
store i64 %327, i64* %29
br label %328
328: ; preds = %348, %325
%329 = load i64, i64* %29
%330 = icmp ne i64 %329, 0
br i1 %330, label %331, label %351
331: ; preds = %328
%332 = load i8*, i8** %12
%333 = bitcast i8* %332 to i32*
%334 = load i32, i32* %333
%335 = load i32, i32* %25
%336 = icmp ne i32 %334, %335
br i1 %336, label %337, label %343
337: ; preds = %331
%338 = load i8*, i8** %12
%339 = bitcast i8* %338 to i32*
%340 = load i32, i32* %339
%341 = load i8*, i8** %10
%342 = bitcast i8* %341 to i32*
store i32 %340, i32* %342
br label %343
343: ; preds = %337, %331
%344 = load i8*, i8** %12
%345 = getelementptr inbounds i8, i8* %344, i64 4
store i8* %345, i8** %12
%346 = load i8*, i8** %10
%347 = getelementptr inbounds i8, i8* %346, i64 4
store i8* %347, i8** %10
br label %348
348: ; preds = %343
%349 = load i64, i64* %29
%350 = add nsw i64 %349, -1
store i64 %350, i64* %29
br label %328
351: ; preds = %328
%352 = load i64, i64* %27
%353 = load i8*, i8** %10
%354 = getelementptr inbounds i8, i8* %353, i64 %352
store i8* %354, i8** %10
%355 = load i64, i64* %28
%356 = load i8*, i8** %12
%357 = getelementptr inbounds i8, i8* %356, i64 %355
store i8* %357, i8** %12
br label %358
358: ; preds = %351
%359 = load i32, i32* %15
%360 = add nsw i32 %359, -1
store i32 %360, i32* %15
br label %322
361: ; preds = %322
br label %362
362: ; preds = %361, %315
br label %363
363: ; preds = %362, %314
br label %364
364: ; preds = %9, %363, %270, %125, %80
ret i32 0
}

LLVM IR (-O2):
define i32 @ibitmap_blitmc(i8* nocapture writeonly %0, i64 %1, i8* nocapture %2, i64 %3, i32 %4, i32 %5, i32 %6, i64 %7, i64 %8) {
%10 = sub nsw i64 %1, %7
%11 = sub nsw i64 %3, %7
switch i32 %6, label %515 [
i32 1, label %27
i32 2, label %12
i32 3, label %336
i32 4, label %433
]
12: ; preds = %9
%13 = icmp eq i32 %5, 0
br i1 %13, label %515, label %14
14: ; preds = %12
%15 = sext i32 %4 to i64
%16 = icmp eq i32 %4, 0
%17 = trunc i64 %8 to i16
%18 = shl nsw i64 %15, 1
%19 = icmp ult i32 %4, 8
%20 = and i64 %15, -8
%21 = shl nsw i64 %20, 1
%22 = shl nsw i64 %20, 1
%23 = and i64 %15, 7
%24 = insertelement <8 x i16> poison, i16 %17, i64 0
%25 = shufflevector <8 x i16> %24, <8 x i16> poison, <8 x i32> zeroinitializer
%26 = icmp eq i64 %20, %15
br label %174
27: ; preds = %9
%28 = icmp eq i32 %5, 0
br i1 %28, label %515, label %29
29: ; preds = %27
%30 = sext i32 %4 to i64
%31 = icmp eq i32 %4, 0
%32 = trunc i64 %8 to i8
%33 = icmp ult i32 %4, 8
%34 = and i64 %30, -8
%35 = and i64 %30, 7
%36 = insertelement <8 x i8> poison, i8 %32, i64 0
%37 = shufflevector <8 x i8> %36, <8 x i8> poison, <8 x i32> zeroinitializer
%38 = icmp eq i64 %34, %30
br label %39
39: ; preds = %29, %167
%40 = phi i8* [ %0, %29 ], [ %170, %167 ]
%41 = phi i8* [ %2, %29 ], [ %171, %167 ]
%42 = phi i32 [ %5, %29 ], [ %172, %167 ]
br i1 %31, label %167, label %43
43: ; preds = %39
br i1 %33, label %109, label %44
44: ; preds = %43
%45 = getelementptr i8, i8* %40, i64 %30
%46 = getelementptr i8, i8* %41, i64 %30
%47 = icmp ult i8* %40, %46
%48 = icmp ult i8* %41, %45
%49 = and i1 %47, %48
br i1 %49, label %109, label %50
50: ; preds = %44
%51 = getelementptr i8, i8* %40, i64 %34
%52 = getelementptr i8, i8* %41, i64 %34
br label %53
53: ; preds = %105, %50
%54 = phi i64 [ 0, %50 ], [ %106, %105 ]
%55 = or i64 %54, 1
%56 = getelementptr i8, i8* %40, i64 %55
%57 = or i64 %54, 2
%58 = getelementptr i8, i8* %40, i64 %57
%59 = or i64 %54, 3
%60 = getelementptr i8, i8* %40, i64 %59
%61 = or i64 %54, 4
%62 = getelementptr i8, i8* %40, i64 %61
%63 = or i64 %54, 5
%64 = getelementptr i8, i8* %40, i64 %63
%65 = or i64 %54, 6
%66 = getelementptr i8, i8* %40, i64 %65
%67 = or i64 %54, 7
%68 = getelementptr i8, i8* %40, i64 %67
%69 = getelementptr i8, i8* %41, i64 %54
%70 = bitcast i8* %69 to <8 x i8>*
%71 = load <8 x i8>, <8 x i8>* %70
%72 = icmp ne <8 x i8> %71, %37
%73 = extractelement <8 x i1> %72, i64 0
br i1 %73, label %74, label %77
74: ; preds = %53
%75 = getelementptr i8, i8* %40, i64 %54
%76 = extractelement <8 x i8> %71, i64 0
store i8 %76, i8* %75
br label %77
77: ; preds = %74, %53
%78 = extractelement <8 x i1> %72, i64 1
br i1 %78, label %79, label %81
79: ; preds = %77
%80 = extractelement <8 x i8> %71, i64 1
store i8 %80, i8* %56
br label %81
81: ; preds = %79, %77
%82 = extractelement <8 x i1> %72, i64 2
br i1 %82, label %83, label %85
83: ; preds = %81
%84 = extractelement <8 x i8> %71, i64 2
store i8 %84, i8* %58
br label %85
85: ; preds = %83, %81
%86 = extractelement <8 x i1> %72, i64 3
br i1 %86, label %87, label %89
87: ; preds = %85
%88 = extractelement <8 x i8> %71, i64 3
store i8 %88, i8* %60
br label %89
89: ; preds = %87, %85
%90 = extractelement <8 x i1> %72, i64 4
br i1 %90, label %91, label %93
91: ; preds = %89
%92 = extractelement <8 x i8> %71, i64 4
store i8 %92, i8* %62
br label %93
93: ; preds = %91, %89
%94 = extractelement <8 x i1> %72, i64 5
br i1 %94, label %95, label %97
95: ; preds = %93
%96 = extractelement <8 x i8> %71, i64 5
store i8 %96, i8* %64
br label %97
97: ; preds = %95, %93
%98 = extractelement <8 x i1> %72, i64 6
br i1 %98, label %99, label %101
99: ; preds = %97
%100 = extractelement <8 x i8> %71, i64 6
store i8 %100, i8* %66
br label %101
101: ; preds = %99, %97
%102 = extractelement <8 x i1> %72, i64 7
br i1 %102, label %103, label %105
103: ; preds = %101
%104 = extractelement <8 x i8> %71, i64 7
store i8 %104, i8* %68
br label %105
105: ; preds = %103, %101
%106 = add nuw i64 %54, 8
%107 = icmp eq i64 %106, %34
br i1 %107, label %108, label %53
108: ; preds = %105
br i1 %38, label %167, label %109
109: ; preds = %44, %43, %108
%110 = phi i8* [ %40, %44 ], [ %40, %43 ], [ %51, %108 ]
%111 = phi i8* [ %41, %44 ], [ %41, %43 ], [ %52, %108 ]
%112 = phi i64 [ %30, %44 ], [ %30, %43 ], [ %35, %108 ]
%113 = add nsw i64 %112, -1
%114 = and i64 %112, 3
%115 = icmp eq i64 %114, 0
br i1 %115, label %130, label %116
116: ; preds = %109, %124
%117 = phi i8* [ %126, %124 ], [ %110, %109 ]
%118 = phi i8* [ %125, %124 ], [ %111, %109 ]
%119 = phi i64 [ %127, %124 ], [ %112, %109 ]
%120 = phi i64 [ %128, %124 ], [ 0, %109 ]
%121 = load i8, i8* %118
%122 = icmp eq i8 %121, %32
br i1 %122, label %124, label %123
123: ; preds = %116
store i8 %121, i8* %117
br label %124
124: ; preds = %123, %116
%125 = getelementptr inbounds i8, i8* %118, i64 1
%126 = getelementptr inbounds i8, i8* %117, i64 1
%127 = add nsw i64 %119, -1
%128 = add i64 %120, 1
%129 = icmp eq i64 %128, %114
br i1 %129, label %130, label %116
130: ; preds = %124, %109
%131 = phi i8* [ undef, %109 ], [ %125, %124 ]
%132 = phi i8* [ undef, %109 ], [ %126, %124 ]
%133 = phi i8* [ %110, %109 ], [ %126, %124 ]
%134 = phi i8* [ %111, %109 ], [ %125, %124 ]
%135 = phi i64 [ %112, %109 ], [ %127, %124 ]
%136 = icmp ult i64 %113, 3
br i1 %136, label %167, label %137
137: ; preds = %130, %162
%138 = phi i8* [ %164, %162 ], [ %133, %130 ]
%139 = phi i8* [ %163, %162 ], [ %134, %130 ]
%140 = phi i64 [ %165, %162 ], [ %135, %130 ]
%141 = load i8, i8* %139
%142 = icmp eq i8 %141, %32
br i1 %142, label %144, label %143
143: ; preds = %137
store i8 %141, i8* %138
br label %144
144: ; preds = %143, %137
%145 = getelementptr inbounds i8, i8* %139, i64 1
%146 = load i8, i8* %145
%147 = icmp eq i8 %146, %32
br i1 %147, label %150, label %148
148: ; preds = %144
%149 = getelementptr inbounds i8, i8* %138, i64 1
store i8 %146, i8* %149
br label %150
150: ; preds = %148, %144
%151 = getelementptr inbounds i8, i8* %139, i64 2
%152 = load i8, i8* %151
%153 = icmp eq i8 %152, %32
br i1 %153, label %156, label %154
154: ; preds = %150
%155 = getelementptr inbounds i8, i8* %138, i64 2
store i8 %152, i8* %155
br label %156
156: ; preds = %154, %150
%157 = getelementptr inbounds i8, i8* %139, i64 3
%158 = load i8, i8* %157
%159 = icmp eq i8 %158, %32
br i1 %159, label %162, label %160
160: ; preds = %156
%161 = getelementptr inbounds i8, i8* %138, i64 3
store i8 %158, i8* %161
br label %162
162: ; preds = %160, %156
%163 = getelementptr inbounds i8, i8* %139, i64 4
%164 = getelementptr inbounds i8, i8* %138, i64 4
%165 = add nsw i64 %140, -4
%166 = icmp eq i64 %165, 0
br i1 %166, label %167, label %137
167: ; preds = %130, %162, %108, %39
%168 = phi i8* [ %41, %39 ], [ %52, %108 ], [ %131, %130 ], [ %163, %162 ]
%169 = phi i8* [ %40, %39 ], [ %51, %108 ], [ %132, %130 ], [ %164, %162 ]
%170 = getelementptr inbounds i8, i8* %169, i64 %10
%171 = getelementptr inbounds i8, i8* %168, i64 %11
%172 = add nsw i32 %42, -1
%173 = icmp eq i32 %172, 0
br i1 %173, label %515, label %39
174: ; preds = %14, %329
%175 = phi i8* [ %0, %14 ], [ %332, %329 ]
%176 = phi i8* [ %2, %14 ], [ %333, %329 ]
%177 = phi i32 [ %5, %14 ], [ %334, %329 ]
br i1 %16, label %329, label %178
178: ; preds = %174
br i1 %19, label %261, label %179
179: ; preds = %178
%180 = getelementptr i8, i8* %175, i64 %18
%181 = getelementptr i8, i8* %176, i64 %18
%182 = icmp ult i8* %175, %181
%183 = icmp ult i8* %176, %180
%184 = and i1 %182, %183
br i1 %184, label %261, label %185
185: ; preds = %179
%186 = getelementptr i8, i8* %175, i64 %21
%187 = getelementptr i8, i8* %176, i64 %22
br label %188
188: ; preds = %257, %185
%189 = phi i64 [ 0, %185 ], [ %258, %257 ]
%190 = shl i64 %189, 1
%191 = or i64 %190, 2
%192 = getelementptr i8, i8* %175, i64 %191
%193 = shl i64 %189, 1
%194 = or i64 %193, 4
%195 = getelementptr i8, i8* %175, i64 %194
%196 = shl i64 %189, 1
%197 = or i64 %196, 6
%198 = getelementptr i8, i8* %175, i64 %197
%199 = shl i64 %189, 1
%200 = or i64 %199, 8
%201 = getelementptr i8, i8* %175, i64 %200
%202 = shl i64 %189, 1
%203 = or i64 %202, 10
%204 = getelementptr i8, i8* %175, i64 %203
%205 = shl i64 %189, 1
%206 = or i64 %205, 12
%207 = getelementptr i8, i8* %175, i64 %206
%208 = shl i64 %189, 1
%209 = or i64 %208, 14
%210 = getelementptr i8, i8* %175, i64 %209
%211 = shl i64 %189, 1
%212 = getelementptr i8, i8* %176, i64 %211
%213 = bitcast i8* %212 to <8 x i16>*
%214 = load <8 x i16>, <8 x i16>* %213
%215 = icmp ne <8 x i16> %214, %25
%216 = extractelement <8 x i1> %215, i64 0
br i1 %216, label %217, label %222
217: ; preds = %188
%218 = shl i64 %189, 1
%219 = getelementptr i8, i8* %175, i64 %218
%220 = bitcast i8* %219 to i16*
%221 = extractelement <8 x i16> %214, i64 0
store i16 %221, i16* %220
br label %222
222: ; preds = %217, %188
%223 = extractelement <8 x i1> %215, i64 1
br i1 %223, label %224, label %227
224: ; preds = %222
%225 = bitcast i8* %192 to i16*
%226 = extractelement <8 x i16> %214, i64 1
store i16 %226, i16* %225
br label %227
227: ; preds = %224, %222
%228 = extractelement <8 x i1> %215, i64 2
br i1 %228, label %229, label %232
229: ; preds = %227
%230 = bitcast i8* %195 to i16*
%231 = extractelement <8 x i16> %214, i64 2
store i16 %231, i16* %230
br label %232
232: ; preds = %229, %227
%233 = extractelement <8 x i1> %215, i64 3
br i1 %233, label %234, label %237
234: ; preds = %232
%235 = bitcast i8* %198 to i16*
%236 = extractelement <8 x i16> %214, i64 3
store i16 %236, i16* %235
br label %237
237: ; preds = %234, %232
%238 = extractelement <8 x i1> %215, i64 4
br i1 %238, label %239, label %242
239: ; preds = %237
%240 = bitcast i8* %201 to i16*
%241 = extractelement <8 x i16> %214, i64 4
store i16 %241, i16* %240
br label %242
242: ; preds = %239, %237
%243 = extractelement <8 x i1> %215, i64 5
br i1 %243, label %244, label %247
244: ; preds = %242
%245 = bitcast i8* %204 to i16*
%246 = extractelement <8 x i16> %214, i64 5
store i16 %246, i16* %245
br label %247
247: ; preds = %244, %242
%248 = extractelement <8 x i1> %215, i64 6
br i1 %248, label %249, label %252
249: ; preds = %247
%250 = bitcast i8* %207 to i16*
%251 = extractelement <8 x i16> %214, i64 6
store i16 %251, i16* %250
br label %252
252: ; preds = %249, %247
%253 = extractelement <8 x i1> %215, i64 7
br i1 %253, label %254, label %257
254: ; preds = %252
%255 = bitcast i8* %210 to i16*
%256 = extractelement <8 x i16> %214, i64 7
store i16 %256, i16* %255
br label %257
257: ; preds = %254, %252
%258 = add nuw i64 %189, 8
%259 = icmp eq i64 %258, %20
br i1 %259, label %260, label %188
260: ; preds = %257
br i1 %26, label %329, label %261
261: ; preds = %179, %178, %260
%262 = phi i8* [ %175, %179 ], [ %175, %178 ], [ %186, %260 ]
%263 = phi i8* [ %176, %179 ], [ %176, %178 ], [ %187, %260 ]
%264 = phi i64 [ %15, %179 ], [ %15, %178 ], [ %23, %260 ]
%265 = add nsw i64 %264, -1
%266 = and i64 %264, 3
%267 = icmp eq i64 %266, 0
br i1 %267, label %284, label %268
268: ; preds = %261, %278
%269 = phi i8* [ %280, %278 ], [ %262, %261 ]
%270 = phi i8* [ %279, %278 ], [ %263, %261 ]
%271 = phi i64 [ %281, %278 ], [ %264, %261 ]
%272 = phi i64 [ %282, %278 ], [ 0, %261 ]
%273 = bitcast i8* %270 to i16*
%274 = load i16, i16* %273
%275 = icmp eq i16 %274, %17
br i1 %275, label %278, label %276
276: ; preds = %268
%277 = bitcast i8* %269 to i16*
store i16 %274, i16* %277
br label %278
278: ; preds = %276, %268
%279 = getelementptr inbounds i8, i8* %270, i64 2
%280 = getelementptr inbounds i8, i8* %269, i64 2
%281 = add nsw i64 %271, -1
%282 = add i64 %272, 1
%283 = icmp eq i64 %282, %266
br i1 %283, label %284, label %268
284: ; preds = %278, %261
%285 = phi i8* [ undef, %261 ], [ %279, %278 ]
%286 = phi i8* [ undef, %261 ], [ %280, %278 ]
%287 = phi i8* [ %262, %261 ], [ %280, %278 ]
%288 = phi i8* [ %263, %261 ], [ %279, %278 ]
%289 = phi i64 [ %264, %261 ], [ %281, %278 ]
%290 = icmp ult i64 %265, 3
br i1 %290, label %329, label %291
291: ; preds = %284, %324
%292 = phi i8* [ %326, %324 ], [ %287, %284 ]
%293 = phi i8* [ %325, %324 ], [ %288, %284 ]
%294 = phi i64 [ %327, %324 ], [ %289, %284 ]
%295 = bitcast i8* %293 to i16*
%296 = load i16, i16* %295
%297 = icmp eq i16 %296, %17
br i1 %297, label %300, label %298
298: ; preds = %291
%299 = bitcast i8* %292 to i16*
store i16 %296, i16* %299
br label %300
300: ; preds = %298, %291
%301 = getelementptr inbounds i8, i8* %293, i64 2
%302 = bitcast i8* %301 to i16*
%303 = load i16, i16* %302
%304 = icmp eq i16 %303, %17
br i1 %304, label %308, label %305
305: ; preds = %300
%306 = getelementptr inbounds i8, i8* %292, i64 2
%307 = bitcast i8* %306 to i16*
store i16 %303, i16* %307
br label %308
308: ; preds = %305, %300
%309 = getelementptr inbounds i8, i8* %293, i64 4
%310 = bitcast i8* %309 to i16*
%311 = load i16, i16* %310
%312 = icmp eq i16 %311, %17
br i1 %312, label %316, label %313
313: ; preds = %308
%314 = getelementptr inbounds i8, i8* %292, i64 4
%315 = bitcast i8* %314 to i16*
store i16 %311, i16* %315
br label %316
316: ; preds = %313, %308
%317 = getelementptr inbounds i8, i8* %293, i64 6
%318 = bitcast i8* %317 to i16*
%319 = load i16, i16* %318
%320 = icmp eq i16 %319, %17
br i1 %320, label %324, label %321
321: ; preds = %316
%322 = getelementptr inbounds i8, i8* %292, i64 6
%323 = bitcast i8* %322 to i16*
store i16 %319, i16* %323
br label %324
324: ; preds = %321, %316
%325 = getelementptr inbounds i8, i8* %293, i64 8
%326 = getelementptr inbounds i8, i8* %292, i64 8
%327 = add nsw i64 %294, -4
%328 = icmp eq i64 %327, 0
br i1 %328, label %329, label %291
329: ; preds = %284, %324, %260, %174
%330 = phi i8* [ %176, %174 ], [ %187, %260 ], [ %285, %284 ], [ %325, %324 ]
%331 = phi i8* [ %175, %174 ], [ %186, %260 ], [ %286, %284 ], [ %326, %324 ]
%332 = getelementptr inbounds i8, i8* %331, i64 %10
%333 = getelementptr inbounds i8, i8* %330, i64 %11
%334 = add nsw i32 %177, -1
%335 = icmp eq i32 %334, 0
br i1 %335, label %515, label %174
336: ; preds = %9
%337 = shl i64 %8, 8
%338 = and i64 %337, 16776960
%339 = lshr i64 %8, 16
%340 = and i64 %339, 255
%341 = or i64 %338, %340
%342 = trunc i64 %341 to i32
%343 = icmp eq i32 %5, 0
br i1 %343, label %515, label %344
344: ; preds = %336
%345 = sext i32 %4 to i64
%346 = icmp eq i32 %4, 0
%347 = and i64 %345, 1
%348 = icmp eq i64 %347, 0
%349 = add nsw i64 %345, -1
%350 = icmp eq i32 %4, 1
br label %351
351: ; preds = %344, %426
%352 = phi i32 [ %5, %344 ], [ %431, %426 ]
%353 = phi i8* [ %0, %344 ], [ %429, %426 ]
%354 = phi i8* [ %2, %344 ], [ %430, %426 ]
br i1 %346, label %426, label %355
355: ; preds = %351
br i1 %348, label %376, label %356
356: ; preds = %355
%357 = bitcast i8* %354 to i16*
%358 = load i16, i16* %357
%359 = zext i16 %358 to i32
%360 = shl nuw nsw i32 %359, 8
%361 = getelementptr inbounds i8, i8* %354, i64 2
%362 = load i8, i8* %361
%363 = zext i8 %362 to i32
%364 = or i32 %360, %363
%365 = icmp eq i32 %364, %342
br i1 %365, label %373, label %366
366: ; preds = %356
%367 = trunc i16 %358 to i8
store i8 %367, i8* %353
%368 = getelementptr inbounds i8, i8* %354, i64 1
%369 = load i8, i8* %368
%370 = getelementptr inbounds i8, i8* %353, i64 1
store i8 %369, i8* %370
%371 = load i8, i8* %361
%372 = getelementptr inbounds i8, i8* %353, i64 2
store i8 %371, i8* %372
br label %373
373: ; preds = %366, %356
%374 = getelementptr inbounds i8, i8* %353, i64 3
%375 = getelementptr inbounds i8, i8* %354, i64 3
br label %376
376: ; preds = %373, %355
%377 = phi i8* [ undef, %355 ], [ %374, %373 ]
%378 = phi i8* [ undef, %355 ], [ %375, %373 ]
%379 = phi i64 [ %345, %355 ], [ %349, %373 ]
%380 = phi i8* [ %353, %355 ], [ %374, %373 ]
%381 = phi i8* [ %354, %355 ], [ %375, %373 ]
br i1 %350, label %426, label %382
382: ; preds = %376, %421
%383 = phi i64 [ %424, %421 ], [ %379, %376 ]
%384 = phi i8* [ %422, %421 ], [ %380, %376 ]
%385 = phi i8* [ %423, %421 ], [ %381, %376 ]
%386 = bitcast i8* %385 to i16*
%387 = load i16, i16* %386
%388 = zext i16 %387 to i32
%389 = shl nuw nsw i32 %388, 8
%390 = getelementptr inbounds i8, i8* %385, i64 2
%391 = load i8, i8* %390
%392 = zext i8 %391 to i32
%393 = or i32 %389, %392
%394 = icmp eq i32 %393, %342
br i1 %394, label %402, label %395
395: ; preds = %382
%396 = trunc i16 %387 to i8
store i8 %396, i8* %384
%397 = getelementptr inbounds i8, i8* %385, i64 1
%398 = load i8, i8* %397
%399 = getelementptr inbounds i8, i8* %384, i64 1
store i8 %398, i8* %399
%400 = load i8, i8* %390
%401 = getelementptr inbounds i8, i8* %384, i64 2
store i8 %400, i8* %401
br label %402
402: ; preds = %395, %382
%403 = getelementptr inbounds i8, i8* %385, i64 3
%404 = bitcast i8* %403 to i16*
%405 = load i16, i16* %404
%406 = zext i16 %405 to i32
%407 = shl nuw nsw i32 %406, 8
%408 = getelementptr inbounds i8, i8* %385, i64 5
%409 = load i8, i8* %408
%410 = zext i8 %409 to i32
%411 = or i32 %407, %410
%412 = icmp eq i32 %411, %342
br i1 %412, label %421, label %413
413: ; preds = %402
%414 = getelementptr inbounds i8, i8* %384, i64 3
%415 = trunc i16 %405 to i8
store i8 %415, i8* %414
%416 = getelementptr inbounds i8, i8* %385, i64 4
%417 = load i8, i8* %416
%418 = getelementptr inbounds i8, i8* %384, i64 4
store i8 %417, i8* %418
%419 = load i8, i8* %408
%420 = getelementptr inbounds i8, i8* %384, i64 5
store i8 %419, i8* %420
br label %421
421: ; preds = %413, %402
%422 = getelementptr inbounds i8, i8* %384, i64 6
%423 = getelementptr inbounds i8, i8* %385, i64 6
%424 = add nsw i64 %383, -2
%425 = icmp eq i64 %424, 0
br i1 %425, label %426, label %382
426: ; preds = %376, %421, %351
%427 = phi i8* [ %354, %351 ], [ %378, %376 ], [ %423, %421 ]
%428 = phi i8* [ %353, %351 ], [ %377, %376 ], [ %422, %421 ]
%429 = getelementptr inbounds i8, i8* %428, i64 %10
%430 = getelementptr inbounds i8, i8* %427, i64 %11
%431 = add nsw i32 %352, -1
%432 = icmp eq i32 %431, 0
br i1 %432, label %515, label %351
433: ; preds = %9
%434 = trunc i64 %8 to i32
%435 = icmp eq i32 %5, 0
br i1 %435, label %515, label %436
436: ; preds = %433
%437 = sext i32 %4 to i64
%438 = icmp eq i32 %4, 0
%439 = add nsw i64 %437, -1
%440 = and i64 %437, 3
%441 = icmp eq i64 %440, 0
%442 = icmp ult i64 %439, 3
br label %443
443: ; preds = %436, %508
%444 = phi i8* [ %0, %436 ], [ %511, %508 ]
%445 = phi i8* [ %2, %436 ], [ %512, %508 ]
%446 = phi i32 [ %5, %436 ], [ %513, %508 ]
br i1 %438, label %508, label %447
447: ; preds = %443
br i1 %441, label %464, label %448
448: ; preds = %447, %458
%449 = phi i8* [ %460, %458 ], [ %444, %447 ]
%450 = phi i8* [ %459, %458 ], [ %445, %447 ]
%451 = phi i64 [ %461, %458 ], [ %437, %447 ]
%452 = phi i64 [ %462, %458 ], [ 0, %447 ]
%453 = bitcast i8* %450 to i32*
%454 = load i32, i32* %453
%455 = icmp eq i32 %454, %434
br i1 %455, label %458, label %456
456: ; preds = %448
%457 = bitcast i8* %449 to i32*
store i32 %454, i32* %457
br label %458
458: ; preds = %456, %448
%459 = getelementptr inbounds i8, i8* %450, i64 4
%460 = getelementptr inbounds i8, i8* %449, i64 4
%461 = add nsw i64 %451, -1
%462 = add i64 %452, 1
%463 = icmp eq i64 %462, %440
br i1 %463, label %464, label %448
464: ; preds = %458, %447
%465 = phi i8* [ undef, %447 ], [ %459, %458 ]
%466 = phi i8* [ undef, %447 ], [ %460, %458 ]
%467 = phi i8* [ %444, %447 ], [ %460, %458 ]
%468 = phi i8* [ %445, %447 ], [ %459, %458 ]
%469 = phi i64 [ %437, %447 ], [ %461, %458 ]
br i1 %442, label %508, label %470
470: ; preds = %464, %503
%471 = phi i8* [ %505, %503 ], [ %467, %464 ]
%472 = phi i8* [ %504, %503 ], [ %468, %464 ]
%473 = phi i64 [ %506, %503 ], [ %469, %464 ]
%474 = bitcast i8* %472 to i32*
%475 = load i32, i32* %474
%476 = icmp eq i32 %475, %434
br i1 %476, label %479, label %477
477: ; preds = %470
%478 = bitcast i8* %471 to i32*
store i32 %475, i32* %478
br label %479
479: ; preds = %477, %470
%480 = getelementptr inbounds i8, i8* %472, i64 4
%481 = bitcast i8* %480 to i32*
%482 = load i32, i32* %481
%483 = icmp eq i32 %482, %434
br i1 %483, label %487, label %484
484: ; preds = %479
%485 = getelementptr inbounds i8, i8* %471, i64 4
%486 = bitcast i8* %485 to i32*
store i32 %482, i32* %486
br label %487
487: ; preds = %484, %479
%488 = getelementptr inbounds i8, i8* %472, i64 8
%489 = bitcast i8* %488 to i32*
%490 = load i32, i32* %489
%491 = icmp eq i32 %490, %434
br i1 %491, label %495, label %492
492: ; preds = %487
%493 = getelementptr inbounds i8, i8* %471, i64 8
%494 = bitcast i8* %493 to i32*
store i32 %490, i32* %494
br label %495
495: ; preds = %492, %487
%496 = getelementptr inbounds i8, i8* %472, i64 12
%497 = bitcast i8* %496 to i32*
%498 = load i32, i32* %497
%499 = icmp eq i32 %498, %434
br i1 %499, label %503, label %500
500: ; preds = %495
%501 = getelementptr inbounds i8, i8* %471, i64 12
%502 = bitcast i8* %501 to i32*
store i32 %498, i32* %502
br label %503
503: ; preds = %500, %495
%504 = getelementptr inbounds i8, i8* %472, i64 16
%505 = getelementptr inbounds i8, i8* %471, i64 16
%506 = add nsw i64 %473, -4
%507 = icmp eq i64 %506, 0
br i1 %507, label %508, label %470
508: ; preds = %464, %503, %443
%509 = phi i8* [ %445, %443 ], [ %465, %464 ], [ %504, %503 ]
%510 = phi i8* [ %444, %443 ], [ %466, %464 ], [ %505, %503 ]
%511 = getelementptr inbounds i8, i8* %510, i64 %10
%512 = getelementptr inbounds i8, i8* %509, i64 %11
%513 = add nsw i32 %446, -1
%514 = icmp eq i32 %513, 0
br i1 %514, label %515, label %443
515: ; preds = %508, %426, %329, %167, %433, %336, %12, %27, %9
ret i32 0
}