void drawBitmap4BPP(char *buffer, char *bitmap, int bitmapWidth,
                    int bitmapHeight, int destX, int destY, int sourceX,
                    int sourceY, int width, int height, signed char shade,
                    int isTransparent) {
  int startSourcePos, startDestPos, widthLeft;
  char currentShade, currentTrans;
  char *startBitmap, *startBuffer;
  int bitmapScanlineSkip = ((bitmapWidth - 1) >> 1) + 1;
  int pixelSourcePos = sourceX & 0x1;
  int pixelDestPos = destX & 0x1;
  bitmap += (sourceY * bitmapScanlineSkip) + (sourceX >> 1);
  buffer += (destY << 6) + (destX >> 1);
  startSourcePos = pixelSourcePos;
  startDestPos = pixelDestPos;
  startBitmap = bitmap;
  startBuffer = buffer;
  if (isTransparent) {
    while (height-- > 0) {
      widthLeft = width;
      while (widthLeft-- > 0) {
        if (pixelSourcePos == 0) {
          currentShade = *bitmap & 0x03;
          currentTrans = *bitmap & 0x0C;
        } else {
          currentShade = (*bitmap >> 4) & 0x03;
          currentTrans = *bitmap & 0xC0;
        }
        if (!currentTrans) {
          if (shade >= 0)
            currentShade = shade;
          if (pixelDestPos == 0) {
            *buffer &= 0xF0;
            *buffer |= currentShade;
          } else {
            *buffer &= 0x0F;
            *buffer |= currentShade << 4;
          }
        }
        if (++pixelSourcePos > 1) {
          bitmap++;
          pixelSourcePos = 0;
        }
        if (++pixelDestPos > 1) {
          buffer++;
          pixelDestPos = 0;
        }
      }
      pixelSourcePos = startSourcePos;
      ;
      startBitmap += bitmapScanlineSkip;
      bitmap = startBitmap;
      pixelDestPos = startDestPos;
      startBuffer += 64;
      buffer = startBuffer;
    }
  } else {
    while (height-- > 0) {
      widthLeft = width;
      while (widthLeft-- > 0) {
        if (pixelSourcePos == 0)
          currentShade = *bitmap & 0x03;
        else
          currentShade = (*bitmap >> 4) & 0x03;
        if (pixelDestPos == 0) {
          *buffer &= 0xF0;
          *buffer |= currentShade;
        } else {
          *buffer &= 0x0F;
          *buffer |= currentShade << 4;
        }
        if (++pixelSourcePos > 1) {
          bitmap++;
          pixelSourcePos = 0;
        }
        if (++pixelDestPos > 1) {
          buffer++;
          pixelDestPos = 0;
        }
      }
      pixelSourcePos = startSourcePos;
      ;
      startBitmap += bitmapScanlineSkip;
      bitmap = startBitmap;
      pixelDestPos = startDestPos;
      startBuffer += 64;
      buffer = startBuffer;
    }
  }
}


x86 assembly (clang, -O0):
<drawBitmap4BPP>:
push   %rbp
mov    %rsp,%rbp
mov    0x38(%rbp),%eax
mov    0x30(%rbp),%al
mov    0x28(%rbp),%eax
mov    0x20(%rbp),%eax
mov    0x18(%rbp),%eax
mov    0x10(%rbp),%eax
mov    %rdi,-0x8(%rbp)
mov    %rsi,-0x10(%rbp)
mov    %edx,-0x14(%rbp)
mov    %ecx,-0x18(%rbp)
mov    %r8d,-0x1c(%rbp)
mov    %r9d,-0x20(%rbp)
mov    -0x14(%rbp),%eax
sub    $0x1,%eax
sar    $0x1,%eax
add    $0x1,%eax
mov    %eax,-0x44(%rbp)
mov    0x10(%rbp),%eax
and    $0x1,%eax
mov    %eax,-0x48(%rbp)
mov    -0x1c(%rbp),%eax
and    $0x1,%eax
mov    %eax,-0x4c(%rbp)
mov    0x18(%rbp),%ecx
imul   -0x44(%rbp),%ecx
mov    0x10(%rbp),%eax
sar    $0x1,%eax
add    %eax,%ecx
mov    -0x10(%rbp),%rax
movslq %ecx,%rcx
add    %rcx,%rax
mov    %rax,-0x10(%rbp)
mov    -0x20(%rbp),%ecx
shl    $0x6,%ecx
mov    -0x1c(%rbp),%eax
sar    $0x1,%eax
add    %eax,%ecx
mov    -0x8(%rbp),%rax
movslq %ecx,%rcx
add    %rcx,%rax
mov    %rax,-0x8(%rbp)
mov    -0x48(%rbp),%eax
mov    %eax,-0x24(%rbp)
mov    -0x4c(%rbp),%eax
mov    %eax,-0x28(%rbp)
mov    -0x10(%rbp),%rax
mov    %rax,-0x38(%rbp)
mov    -0x8(%rbp),%rax
mov    %rax,-0x40(%rbp)
cmpl   $0x0,0x38(%rbp)
je     1326 <drawBitmap4BPP+0x226>
jmp    11b1 <drawBitmap4BPP+0xb1>
mov    0x28(%rbp),%eax
mov    %eax,%ecx
add    $0xffffffff,%ecx
mov    %ecx,0x28(%rbp)
cmp    $0x0,%eax
jle    1321 <drawBitmap4BPP+0x221>
mov    0x20(%rbp),%eax
mov    %eax,-0x2c(%rbp)
mov    -0x2c(%rbp),%eax
mov    %eax,%ecx
add    $0xffffffff,%ecx
mov    %ecx,-0x2c(%rbp)
cmp    $0x0,%eax
jle    12e3 <drawBitmap4BPP+0x1e3>
cmpl   $0x0,-0x48(%rbp)
jne    1208 <drawBitmap4BPP+0x108>
mov    -0x10(%rbp),%rax
movsbl (%rax),%eax
and    $0x3,%eax
mov    %al,-0x2d(%rbp)
mov    -0x10(%rbp),%rax
movsbl (%rax),%eax
and    $0xc,%eax
mov    %al,-0x2e(%rbp)
jmp    1227 <drawBitmap4BPP+0x127>
mov    -0x10(%rbp),%rax
movsbl (%rax),%eax
sar    $0x4,%eax
and    $0x3,%eax
mov    %al,-0x2d(%rbp)
mov    -0x10(%rbp),%rax
movsbl (%rax),%eax
and    $0xc0,%eax
mov    %al,-0x2e(%rbp)
cmpb   $0x0,-0x2e(%rbp)
jne    1294 <drawBitmap4BPP+0x194>
movsbl 0x30(%rbp),%eax
cmp    $0x0,%eax
jl     1244 <drawBitmap4BPP+0x144>
mov    0x30(%rbp),%al
mov    %al,-0x2d(%rbp)
cmpl   $0x0,-0x4c(%rbp)
jne    1271 <drawBitmap4BPP+0x171>
mov    -0x8(%rbp),%rax
movsbl (%rax),%ecx
and    $0xf0,%ecx
mov    %cl,(%rax)
movsbl -0x2d(%rbp),%edx
mov    -0x8(%rbp),%rax
movsbl (%rax),%ecx
or     %edx,%ecx
mov    %cl,(%rax)
jmp    128f <drawBitmap4BPP+0x18f>
mov    -0x8(%rbp),%rax
movsbl (%rax),%ecx
and    $0xf,%ecx
mov    %cl,(%rax)
movsbl -0x2d(%rbp),%edx
shl    $0x4,%edx
mov    -0x8(%rbp),%rax
movsbl (%rax),%ecx
or     %edx,%ecx
mov    %cl,(%rax)
jmp    1294 <drawBitmap4BPP+0x194>
mov    -0x48(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x48(%rbp)
cmp    $0x1,%eax
jle    12b9 <drawBitmap4BPP+0x1b9>
mov    -0x10(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x10(%rbp)
movl   $0x0,-0x48(%rbp)
mov    -0x4c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x4c(%rbp)
cmp    $0x1,%eax
jle    12de <drawBitmap4BPP+0x1de>
mov    -0x8(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x8(%rbp)
movl   $0x0,-0x4c(%rbp)
jmp    11cb <drawBitmap4BPP+0xcb>
mov    -0x24(%rbp),%eax
mov    %eax,-0x48(%rbp)
mov    -0x44(%rbp),%ecx
mov    -0x38(%rbp),%rax
movslq %ecx,%rcx
add    %rcx,%rax
mov    %rax,-0x38(%rbp)
mov    -0x38(%rbp),%rax
mov    %rax,-0x10(%rbp)
mov    -0x28(%rbp),%eax
mov    %eax,-0x4c(%rbp)
mov    -0x40(%rbp),%rax
add    $0x40,%rax
mov    %rax,-0x40(%rbp)
mov    -0x40(%rbp),%rax
mov    %rax,-0x8(%rbp)
jmp    11b1 <drawBitmap4BPP+0xb1>
jmp    1462 <drawBitmap4BPP+0x362>
jmp    132b <drawBitmap4BPP+0x22b>
mov    0x28(%rbp),%eax
mov    %eax,%ecx
add    $0xffffffff,%ecx
mov    %ecx,0x28(%rbp)
cmp    $0x0,%eax
jle    145d <drawBitmap4BPP+0x35d>
mov    0x20(%rbp),%eax
mov    %eax,-0x2c(%rbp)
mov    -0x2c(%rbp),%eax
mov    %eax,%ecx
add    $0xffffffff,%ecx
mov    %ecx,-0x2c(%rbp)
cmp    $0x0,%eax
jle    141f <drawBitmap4BPP+0x31f>
cmpl   $0x0,-0x48(%rbp)
jne    1375 <drawBitmap4BPP+0x275>
mov    -0x10(%rbp),%rax
movsbl (%rax),%eax
and    $0x3,%eax
mov    %al,-0x2d(%rbp)
jmp    1385 <drawBitmap4BPP+0x285>
mov    -0x10(%rbp),%rax
movsbl (%rax),%eax
sar    $0x4,%eax
and    $0x3,%eax
mov    %al,-0x2d(%rbp)
cmpl   $0x0,-0x4c(%rbp)
jne    13b2 <drawBitmap4BPP+0x2b2>
mov    -0x8(%rbp),%rax
movsbl (%rax),%ecx
and    $0xf0,%ecx
mov    %cl,(%rax)
movsbl -0x2d(%rbp),%edx
mov    -0x8(%rbp),%rax
movsbl (%rax),%ecx
or     %edx,%ecx
mov    %cl,(%rax)
jmp    13d0 <drawBitmap4BPP+0x2d0>
mov    -0x8(%rbp),%rax
movsbl (%rax),%ecx
and    $0xf,%ecx
mov    %cl,(%rax)
movsbl -0x2d(%rbp),%edx
shl    $0x4,%edx
mov    -0x8(%rbp),%rax
movsbl (%rax),%ecx
or     %edx,%ecx
mov    %cl,(%rax)
mov    -0x48(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x48(%rbp)
cmp    $0x1,%eax
jle    13f5 <drawBitmap4BPP+0x2f5>
mov    -0x10(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x10(%rbp)
movl   $0x0,-0x48(%rbp)
mov    -0x4c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x4c(%rbp)
cmp    $0x1,%eax
jle    141a <drawBitmap4BPP+0x31a>
mov    -0x8(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x8(%rbp)
movl   $0x0,-0x4c(%rbp)
jmp    1345 <drawBitmap4BPP+0x245>
mov    -0x24(%rbp),%eax
mov    %eax,-0x48(%rbp)
mov    -0x44(%rbp),%ecx
mov    -0x38(%rbp),%rax
movslq %ecx,%rcx
add    %rcx,%rax
mov    %rax,-0x38(%rbp)
mov    -0x38(%rbp),%rax
mov    %rax,-0x10(%rbp)
mov    -0x28(%rbp),%eax
mov    %eax,-0x4c(%rbp)
mov    -0x40(%rbp),%rax
add    $0x40,%rax
mov    %rax,-0x40(%rbp)
mov    -0x40(%rbp),%rax
mov    %rax,-0x8(%rbp)
jmp    132b <drawBitmap4BPP+0x22b>
jmp    1462 <drawBitmap4BPP+0x362>
pop    %rbp
ret

x86 assembly (clang, -O2):
<drawBitmap4BPP>:
push   %rbp
push   %r15
push   %r14
push   %r13
push   %r12
push   %rbx
mov    0x50(%rsp),%r15d
mov    0x38(%rsp),%eax
add    $0xffffffff,%edx
sar    %edx
add    $0x1,%edx
mov    %eax,%ecx
and    $0x1,%ecx
mov    %ecx,-0x8(%rsp)
mov    %r8d,%ecx
and    $0x1,%ecx
mov    %ecx,-0xc(%rsp)
mov    0x40(%rsp),%ecx
imul   %edx,%ecx
sar    %eax
add    %ecx,%eax
movslq %eax,%r12
add    %rsi,%r12
shl    $0x6,%r9d
sar    %r8d
add    %r9d,%r8d
movslq %r8d,%r13
add    %rdi,%r13
cmpl   $0x0,0x60(%rsp)
je     123c <drawBitmap4BPP+0x13c>
test   %r15d,%r15d
jle    12d9 <drawBitmap4BPP+0x1d9>
mov    0x58(%rsp),%al
movslq %edx,%r9
mov    0x48(%rsp),%ecx
add    $0x1,%ecx
mov    %ecx,-0x4(%rsp)
mov    $0xc,%r14d
movzbl %al,%r8d
jmp    11a8 <drawBitmap4BPP+0xa8>
cs nopw 0x0(%rax,%rax,1)
nopl   0x0(%rax,%rax,1)
lea    -0x1(%r15),%eax
add    %r9,%r12
add    $0x40,%r13
cmp    $0x1,%r15d
mov    %eax,%r15d
jle    12d9 <drawBitmap4BPP+0x1d9>
mov    0x48(%rsp),%eax
test   %eax,%eax
jle    1190 <drawBitmap4BPP+0x90>
mov    -0x4(%rsp),%edi
mov    -0xc(%rsp),%edx
mov    -0x8(%rsp),%ecx
mov    %r13,%rsi
mov    %r12,%rbx
jmp    11fd <drawBitmap4BPP+0xfd>
cs nopw 0x0(%rax,%rax,1)
xchg   %ax,%ax
and    $0xf,%r11b
shl    $0x4,%r10b
or     %r11b,%r10b
mov    %r10d,%r11d
mov    %r11b,(%rsi)
cmp    $0x1,%ecx
sbb    $0xffffffffffffffff,%rbx
xor    $0x1,%ecx
cmp    $0x1,%edx
sbb    $0xffffffffffffffff,%rsi
xor    $0x1,%edx
add    $0xffffffff,%edi
cmp    $0x1,%edi
jbe    1190 <drawBitmap4BPP+0x90>
test   %ecx,%ecx
movzbl (%rbx),%eax
mov    $0xc0,%ebp
cmove  %r14d,%ebp
test   %bpl,%al
jne    11e1 <drawBitmap4BPP+0xe1>
movzbl %al,%ebp
shr    $0x4,%al
test   %ecx,%ecx
movzbl %al,%eax
cmove  %ebp,%eax
and    $0x3,%al
test   %r8b,%r8b
movzbl %al,%r10d
cmovns %r8d,%r10d
movzbl (%rsi),%r11d
test   %edx,%edx
jne    11d0 <drawBitmap4BPP+0xd0>
and    $0xf0,%r11b
or     %r10b,%r11b
jmp    11de <drawBitmap4BPP+0xde>
test   %r15d,%r15d
jle    12d9 <drawBitmap4BPP+0x1d9>
movslq %edx,%r9
mov    0x48(%rsp),%eax
lea    0x1(%rax),%r8d
jmp    1274 <drawBitmap4BPP+0x174>
cs nopw 0x0(%rax,%rax,1)
nopl   0x0(%rax)
lea    -0x1(%r15),%eax
add    %r9,%r12
add    $0x40,%r13
cmp    $0x1,%r15d
mov    %eax,%r15d
jle    12d9 <drawBitmap4BPP+0x1d9>
mov    0x48(%rsp),%eax
test   %eax,%eax
jle    1260 <drawBitmap4BPP+0x160>
mov    %r8d,%ecx
mov    -0xc(%rsp),%esi
mov    -0x8(%rsp),%edi
mov    %r13,%rbp
mov    %r12,%rbx
jmp    12b8 <drawBitmap4BPP+0x1b8>
nop
and    $0xf,%al
shl    $0x4,%dl
or     %al,%dl
mov    %edx,%eax
mov    %al,0x0(%rbp)
cmp    $0x1,%edi
sbb    $0xffffffffffffffff,%rbx
xor    $0x1,%edi
cmp    $0x1,%esi
sbb    $0xffffffffffffffff,%rbp
xor    $0x1,%esi
add    $0xffffffff,%ecx
cmp    $0x1,%ecx
jbe    1260 <drawBitmap4BPP+0x160>
movzbl (%rbx),%eax
mov    %eax,%edx
shr    $0x4,%dl
test   %edi,%edi
movzbl %dl,%edx
cmove  %eax,%edx
and    $0x3,%dl
movzbl 0x0(%rbp),%eax
test   %esi,%esi
jne    1290 <drawBitmap4BPP+0x190>
and    $0xf0,%al
or     %dl,%al
jmp    1299 <drawBitmap4BPP+0x199>
pop    %rbx
pop    %r12
pop    %r13
pop    %r14
pop    %r15
pop    %rbp
ret

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

LLVM IR (-O2):
define void @drawBitmap4BPP(i8* nocapture %0, i8* nocapture %1, i32 %2, i32 %3, i32 %4, i32 %5, i32 %6, i32 %7, i32 %8, i32 %9, i8 signext %10, i32 %11) {
%13 = add nsw i32 %2, -1
%14 = ashr i32 %13, 1
%15 = add nsw i32 %14, 1
%16 = and i32 %6, 1
%17 = and i32 %4, 1
%18 = mul nsw i32 %15, %7
%19 = ashr i32 %6, 1
%20 = add nsw i32 %18, %19
%21 = sext i32 %20 to i64
%22 = getelementptr inbounds i8, i8* %1, i64 %21
%23 = shl i32 %5, 6
%24 = ashr i32 %4, 1
%25 = add nsw i32 %23, %24
%26 = sext i32 %25 to i64
%27 = getelementptr inbounds i8, i8* %0, i64 %26
%28 = icmp eq i32 %11, 0
%29 = icmp sgt i32 %9, 0
br i1 %28, label %35, label %30
30: ; preds = %12
br i1 %29, label %31, label %127
31: ; preds = %30
%32 = icmp sgt i32 %8, 0
%33 = icmp sgt i8 %10, -1
%34 = sext i32 %15 to i64
br label %39
35: ; preds = %12
br i1 %29, label %36, label %127
36: ; preds = %35
%37 = icmp sgt i32 %8, 0
%38 = sext i32 %15 to i64
br label %86
39: ; preds = %31, %82
%40 = phi i32 [ %9, %31 ], [ %43, %82 ]
%41 = phi i8* [ %27, %31 ], [ %84, %82 ]
%42 = phi i8* [ %22, %31 ], [ %83, %82 ]
%43 = add nsw i32 %40, -1
br i1 %32, label %44, label %82
44: ; preds = %39, %72
%45 = phi i32 [ %50, %72 ], [ %8, %39 ]
%46 = phi i32 [ %80, %72 ], [ %17, %39 ]
%47 = phi i32 [ %76, %72 ], [ %16, %39 ]
%48 = phi i8* [ %79, %72 ], [ %41, %39 ]
%49 = phi i8* [ %75, %72 ], [ %42, %39 ]
%50 = add nsw i32 %45, -1
%51 = icmp eq i32 %47, 0
%52 = load i8, i8* %49
%53 = select i1 %51, i8 12, i8 -64
%54 = and i8 %52, %53
%55 = icmp eq i8 %54, 0
br i1 %55, label %56, label %72
56: ; preds = %44
%57 = lshr i8 %52, 4
%58 = select i1 %51, i8 %52, i8 %57
%59 = and i8 %58, 3
%60 = select i1 %33, i8 %10, i8 %59
%61 = icmp eq i32 %46, 0
%62 = load i8, i8* %48
br i1 %61, label %63, label %66
63: ; preds = %56
%64 = and i8 %62, -16
%65 = or i8 %64, %60
br label %70
66: ; preds = %56
%67 = and i8 %62, 15
%68 = shl i8 %60, 4
%69 = or i8 %67, %68
br label %70
70: ; preds = %66, %63
%71 = phi i8 [ %65, %63 ], [ %69, %66 ]
store i8 %71, i8* %48
br label %72
72: ; preds = %70, %44
%73 = icmp ne i32 %47, 0
%74 = zext i1 %73 to i64
%75 = getelementptr i8, i8* %49, i64 %74
%76 = xor i32 %47, 1
%77 = icmp ne i32 %46, 0
%78 = zext i1 %77 to i64
%79 = getelementptr i8, i8* %48, i64 %78
%80 = xor i32 %46, 1
%81 = icmp ugt i32 %45, 1
br i1 %81, label %44, label %82
82: ; preds = %72, %39
%83 = getelementptr inbounds i8, i8* %42, i64 %34
%84 = getelementptr inbounds i8, i8* %41, i64 64
%85 = icmp sgt i32 %40, 1
br i1 %85, label %39, label %127
86: ; preds = %36, %123
%87 = phi i32 [ %9, %36 ], [ %90, %123 ]
%88 = phi i8* [ %27, %36 ], [ %125, %123 ]
%89 = phi i8* [ %22, %36 ], [ %124, %123 ]
%90 = add nsw i32 %87, -1
br i1 %37, label %91, label %123
91: ; preds = %86, %112
%92 = phi i32 [ %97, %112 ], [ %8, %86 ]
%93 = phi i32 [ %121, %112 ], [ %17, %86 ]
%94 = phi i32 [ %117, %112 ], [ %16, %86 ]
%95 = phi i8* [ %120, %112 ], [ %88, %86 ]
%96 = phi i8* [ %116, %112 ], [ %89, %86 ]
%97 = add nsw i32 %92, -1
%98 = icmp eq i32 %94, 0
%99 = load i8, i8* %96
%100 = lshr i8 %99, 4
%101 = select i1 %98, i8 %99, i8 %100
%102 = and i8 %101, 3
%103 = icmp eq i32 %93, 0
%104 = load i8, i8* %95
br i1 %103, label %105, label %108
105: ; preds = %91
%106 = and i8 %104, -16
%107 = or i8 %106, %102
br label %112
108: ; preds = %91
%109 = and i8 %104, 15
%110 = shl nuw nsw i8 %102, 4
%111 = or i8 %109, %110
br label %112
112: ; preds = %108, %105
%113 = phi i8 [ %111, %108 ], [ %107, %105 ]
store i8 %113, i8* %95
%114 = icmp ne i32 %94, 0
%115 = zext i1 %114 to i64
%116 = getelementptr i8, i8* %96, i64 %115
%117 = xor i32 %94, 1
%118 = icmp ne i32 %93, 0
%119 = zext i1 %118 to i64
%120 = getelementptr i8, i8* %95, i64 %119
%121 = xor i32 %93, 1
%122 = icmp ugt i32 %92, 1
br i1 %122, label %91, label %123
123: ; preds = %112, %86
%124 = getelementptr inbounds i8, i8* %89, i64 %38
%125 = getelementptr inbounds i8, i8* %88, i64 64
%126 = icmp sgt i32 %87, 1
br i1 %126, label %86, label %127
127: ; preds = %82, %123, %30, %35
ret void
}