void drawLineHMaxUnclipped(char *buffer, int x0, int y0, int dx, int dy,
                           char shade) {
  int d, incrH, incrHV, addV;
  int pixelPos = x0 & 0x1;
  int loPixel = 0;
  int hiPixel = 0;
  char hiShade = shade << 4;
  char biShade = shade | hiShade;
  if (dy > 0)
    addV = 64;
  else {
    addV = -64;
    dy = -dy;
  }
  d = 2 * dy - dx;
  incrH = 2 * dy;
  incrHV = 2 * (dy - dx);
  buffer += (y0 << 6) + (x0 >> 1);
  if (pixelPos == 0)
    loPixel = 1;
  else
    hiPixel = 1;
  while (dx-- > 0)
    if (d <= 0) {
      d += incrH;
      pixelPos++;
      if (pixelPos == 2) {
        if (loPixel && hiPixel) {
          *buffer = biShade;
        } else if (loPixel) {
          *buffer &= 0xF0;
          *buffer |= shade;
        } else {
          *buffer &= 0x0F;
          *buffer |= hiShade;
        }
        buffer++;
        pixelPos = 0;
        hiPixel = 0;
        loPixel = 1;
      } else {
        hiPixel = 1;
      }
    } else {
      d += incrHV;
      if (loPixel && hiPixel) {
        *buffer = biShade;
      } else if (loPixel) {
        *buffer &= 0xF0;
        *buffer |= shade;
      } else {
        *buffer &= 0x0F;
        *buffer |= hiShade;
      }
      pixelPos++;
      if (pixelPos == 2) {
        buffer++;
        pixelPos = 0;
        loPixel = 1;
        hiPixel = 0;
      } else {
        loPixel = 0;
        hiPixel = 1;
      }
      buffer += addV;
    }
  if (loPixel && hiPixel) {
    *buffer = biShade;
  } else if (loPixel) {
    *buffer &= 0xF0;
    *buffer |= shade;
  } else {
    *buffer &= 0x0F;
    *buffer |= hiShade;
  }
}


x86 assembly (clang, -O0):
<drawLineHMaxUnclipped>:
push   %rbp
mov    %rsp,%rbp
mov    %r9b,%al
mov    %rdi,-0x8(%rbp)
mov    %esi,-0xc(%rbp)
mov    %edx,-0x10(%rbp)
mov    %ecx,-0x14(%rbp)
mov    %r8d,-0x18(%rbp)
mov    %al,-0x19(%rbp)
mov    -0xc(%rbp),%eax
and    $0x1,%eax
mov    %eax,-0x30(%rbp)
movl   $0x0,-0x34(%rbp)
movl   $0x0,-0x38(%rbp)
movsbl -0x19(%rbp),%eax
shl    $0x4,%eax
mov    %al,-0x39(%rbp)
movsbl -0x19(%rbp),%eax
movsbl -0x39(%rbp),%ecx
or     %ecx,%eax
mov    %al,-0x3a(%rbp)
cmpl   $0x0,-0x18(%rbp)
jle    115f <drawLineHMaxUnclipped+0x5f>
movl   $0x40,-0x2c(%rbp)
jmp    116e <drawLineHMaxUnclipped+0x6e>
movl   $0xffffffc0,-0x2c(%rbp)
xor    %eax,%eax
sub    -0x18(%rbp),%eax
mov    %eax,-0x18(%rbp)
mov    -0x18(%rbp),%eax
shl    $0x1,%eax
sub    -0x14(%rbp),%eax
mov    %eax,-0x20(%rbp)
mov    -0x18(%rbp),%eax
shl    $0x1,%eax
mov    %eax,-0x24(%rbp)
mov    -0x18(%rbp),%eax
sub    -0x14(%rbp),%eax
shl    $0x1,%eax
mov    %eax,-0x28(%rbp)
mov    -0x10(%rbp),%ecx
shl    $0x6,%ecx
mov    -0xc(%rbp),%eax
sar    $0x1,%eax
add    %eax,%ecx
mov    -0x8(%rbp),%rax
movslq %ecx,%rcx
add    %rcx,%rax
mov    %rax,-0x8(%rbp)
cmpl   $0x0,-0x30(%rbp)
jne    11c1 <drawLineHMaxUnclipped+0xc1>
movl   $0x1,-0x34(%rbp)
jmp    11c8 <drawLineHMaxUnclipped+0xc8>
movl   $0x1,-0x38(%rbp)
jmp    11cd <drawLineHMaxUnclipped+0xcd>
mov    -0x14(%rbp),%eax
mov    %eax,%ecx
add    $0xffffffff,%ecx
mov    %ecx,-0x14(%rbp)
cmp    $0x0,%eax
jle    137d <drawLineHMaxUnclipped+0x27d>
cmpl   $0x0,-0x20(%rbp)
jg     12a8 <drawLineHMaxUnclipped+0x1a8>
mov    -0x24(%rbp),%eax
add    -0x20(%rbp),%eax
mov    %eax,-0x20(%rbp)
mov    -0x30(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x30(%rbp)
cmpl   $0x2,-0x30(%rbp)
jne    129c <drawLineHMaxUnclipped+0x19c>
cmpl   $0x0,-0x34(%rbp)
je     1229 <drawLineHMaxUnclipped+0x129>
cmpl   $0x0,-0x38(%rbp)
je     1229 <drawLineHMaxUnclipped+0x129>
mov    -0x3a(%rbp),%cl
mov    -0x8(%rbp),%rax
mov    %cl,(%rax)
jmp    1276 <drawLineHMaxUnclipped+0x176>
cmpl   $0x0,-0x34(%rbp)
je     1256 <drawLineHMaxUnclipped+0x156>
mov    -0x8(%rbp),%rax
movsbl (%rax),%ecx
and    $0xf0,%ecx
mov    %cl,(%rax)
movsbl -0x19(%rbp),%edx
mov    -0x8(%rbp),%rax
movsbl (%rax),%ecx
or     %edx,%ecx
mov    %cl,(%rax)
jmp    1271 <drawLineHMaxUnclipped+0x171>
mov    -0x8(%rbp),%rax
movsbl (%rax),%ecx
and    $0xf,%ecx
mov    %cl,(%rax)
movsbl -0x39(%rbp),%edx
mov    -0x8(%rbp),%rax
movsbl (%rax),%ecx
or     %edx,%ecx
mov    %cl,(%rax)
jmp    1276 <drawLineHMaxUnclipped+0x176>
mov    -0x8(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x8(%rbp)
movl   $0x0,-0x30(%rbp)
movl   $0x0,-0x38(%rbp)
movl   $0x1,-0x34(%rbp)
jmp    12a3 <drawLineHMaxUnclipped+0x1a3>
movl   $0x1,-0x38(%rbp)
jmp    1378 <drawLineHMaxUnclipped+0x278>
mov    -0x28(%rbp),%eax
add    -0x20(%rbp),%eax
mov    %eax,-0x20(%rbp)
cmpl   $0x0,-0x34(%rbp)
je     12d3 <drawLineHMaxUnclipped+0x1d3>
cmpl   $0x0,-0x38(%rbp)
je     12d3 <drawLineHMaxUnclipped+0x1d3>
mov    -0x3a(%rbp),%cl
mov    -0x8(%rbp),%rax
mov    %cl,(%rax)
jmp    1320 <drawLineHMaxUnclipped+0x220>
cmpl   $0x0,-0x34(%rbp)
je     1300 <drawLineHMaxUnclipped+0x200>
mov    -0x8(%rbp),%rax
movsbl (%rax),%ecx
and    $0xf0,%ecx
mov    %cl,(%rax)
movsbl -0x19(%rbp),%edx
mov    -0x8(%rbp),%rax
movsbl (%rax),%ecx
or     %edx,%ecx
mov    %cl,(%rax)
jmp    131b <drawLineHMaxUnclipped+0x21b>
mov    -0x8(%rbp),%rax
movsbl (%rax),%ecx
and    $0xf,%ecx
mov    %cl,(%rax)
movsbl -0x39(%rbp),%edx
mov    -0x8(%rbp),%rax
movsbl (%rax),%ecx
or     %edx,%ecx
mov    %cl,(%rax)
jmp    1320 <drawLineHMaxUnclipped+0x220>
mov    -0x30(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x30(%rbp)
cmpl   $0x2,-0x30(%rbp)
jne    1359 <drawLineHMaxUnclipped+0x259>
mov    -0x8(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x8(%rbp)
movl   $0x0,-0x30(%rbp)
movl   $0x1,-0x34(%rbp)
movl   $0x0,-0x38(%rbp)
jmp    1367 <drawLineHMaxUnclipped+0x267>
movl   $0x0,-0x34(%rbp)
movl   $0x1,-0x38(%rbp)
mov    -0x2c(%rbp),%ecx
mov    -0x8(%rbp),%rax
movslq %ecx,%rcx
add    %rcx,%rax
mov    %rax,-0x8(%rbp)
jmp    11cd <drawLineHMaxUnclipped+0xcd>
cmpl   $0x0,-0x34(%rbp)
je     139f <drawLineHMaxUnclipped+0x29f>
cmpl   $0x0,-0x38(%rbp)
je     139f <drawLineHMaxUnclipped+0x29f>
mov    -0x3a(%rbp),%cl
mov    -0x8(%rbp),%rax
mov    %cl,(%rax)
jmp    13ec <drawLineHMaxUnclipped+0x2ec>
cmpl   $0x0,-0x34(%rbp)
je     13cc <drawLineHMaxUnclipped+0x2cc>
mov    -0x8(%rbp),%rax
movsbl (%rax),%ecx
and    $0xf0,%ecx
mov    %cl,(%rax)
movsbl -0x19(%rbp),%edx
mov    -0x8(%rbp),%rax
movsbl (%rax),%ecx
or     %edx,%ecx
mov    %cl,(%rax)
jmp    13e7 <drawLineHMaxUnclipped+0x2e7>
mov    -0x8(%rbp),%rax
movsbl (%rax),%ecx
and    $0xf,%ecx
mov    %cl,(%rax)
movsbl -0x39(%rbp),%edx
mov    -0x8(%rbp),%rax
movsbl (%rax),%ecx
or     %edx,%ecx
mov    %cl,(%rax)
jmp    13ec <drawLineHMaxUnclipped+0x2ec>
pop    %rbp
ret

x86 assembly (clang, -O2):
<drawLineHMaxUnclipped>:
push   %rbp
push   %r15
push   %r14
push   %rbx
mov    %esi,%eax
and    $0x1,%eax
mov    %r9d,%r10d
shl    $0x4,%r10b
mov    %r10d,%r11d
or     %r9b,%r11b
xor    %r14d,%r14d
test   %r8d,%r8d
setg   %bl
mov    %r8d,%r15d
neg    %r15d
cmovs  %r8d,%r15d
shl    $0x6,%edx
sar    %esi
add    %edx,%esi
movslq %esi,%rdx
add    %rdi,%rdx
mov    %eax,%edi
xor    $0x1,%edi
test   %ecx,%ecx
jle    11eb <drawLineHMaxUnclipped+0xeb>
mov    %bl,%r14b
shl    $0x7,%r14
add    $0xffffffffffffffc0,%r14
lea    (%r15,%r15,1),%r8d
sub    %ecx,%r15d
add    %r15d,%r15d
mov    %r8d,%esi
sub    %ecx,%esi
add    $0x1,%ecx
jmp    1196 <drawLineHMaxUnclipped+0x96>
and    $0xf,%bl
or     %r10b,%bl
nopw   0x0(%rax,%rax,1)
mov    %bl,(%rdx)
xor    %ebp,%ebp
xor    %edi,%edi
cmp    $0x1,%eax
setne  %bpl
sete   %dil
add    %r14,%rdx
add    %rdi,%rdx
mov    %r15d,%eax
add    %eax,%esi
add    $0xffffffff,%ecx
mov    %ebp,%eax
cmp    $0x1,%ecx
jbe    11ed <drawLineHMaxUnclipped+0xed>
test   %esi,%esi
jle    11c0 <drawLineHMaxUnclipped+0xc0>
test   %edi,%edi
je     11a5 <drawLineHMaxUnclipped+0xa5>
mov    %r11d,%ebx
test   %eax,%eax
jne    1170 <drawLineHMaxUnclipped+0x70>
movzbl (%rdx),%ebx
test   %edi,%edi
je     1164 <drawLineHMaxUnclipped+0x64>
and    $0xf0,%bl
or     %r9b,%bl
jmp    1170 <drawLineHMaxUnclipped+0x70>
cs nopw 0x0(%rax,%rax,1)
xchg   %ax,%ax
mov    $0x1,%ebp
cmp    $0x1,%eax
jne    11e6 <drawLineHMaxUnclipped+0xe6>
mov    %r11d,%eax
test   %edi,%edi
jne    11d9 <drawLineHMaxUnclipped+0xd9>
movzbl (%rdx),%eax
and    $0xf,%al
or     %r10b,%al
mov    %al,(%rdx)
add    $0x1,%rdx
xor    %ebp,%ebp
mov    $0x1,%edi
mov    %r8d,%eax
jmp    118a <drawLineHMaxUnclipped+0x8a>
mov    %eax,%ebp
test   %edi,%edi
je     11f5 <drawLineHMaxUnclipped+0xf5>
test   %ebp,%ebp
jne    120c <drawLineHMaxUnclipped+0x10c>
mov    (%rdx),%r11b
test   %edi,%edi
je     1205 <drawLineHMaxUnclipped+0x105>
and    $0xf0,%r11b
or     %r9b,%r11b
jmp    120c <drawLineHMaxUnclipped+0x10c>
and    $0xf,%r11b
or     %r10b,%r11b
mov    %r11b,(%rdx)
pop    %rbx
pop    %r14
pop    %r15
pop    %rbp
ret

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

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