void drawLineHMaxClipped(char *buffer, int x0, int y0, int dx, int dy, int d,
                         int xMax, int yMax, char shade) {
  int 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;
  }
  incrH = 2 * dy;
  incrHV = 2 * (dy - dx);
  buffer += (y0 << 6) + (x0 >> 1);
  if (pixelPos == 0)
    loPixel = 1;
  else
    hiPixel = 1;
  while (xMax-- > 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;
      }
      if (!yMax--)
        return;
      buffer += addV;
    }
  }
  if (loPixel && hiPixel) {
    *buffer = biShade;
  } else if (loPixel) {
    *buffer &= 0xF0;
    *buffer |= shade;
  } else {
    *buffer &= 0x0F;
    *buffer |= hiShade;
  }
}


x86 assembly (clang, -O0):
<drawLineHMaxClipped>:
push   %rbp
mov    %rsp,%rbp
mov    0x20(%rbp),%al
mov    0x18(%rbp),%eax
mov    0x10(%rbp),%eax
mov    %rdi,-0x8(%rbp)
mov    %esi,-0xc(%rbp)
mov    %edx,-0x10(%rbp)
mov    %ecx,-0x14(%rbp)
mov    %r8d,-0x18(%rbp)
mov    %r9d,-0x1c(%rbp)
mov    -0xc(%rbp),%eax
and    $0x1,%eax
mov    %eax,-0x2c(%rbp)
movl   $0x0,-0x30(%rbp)
movl   $0x0,-0x34(%rbp)
movsbl 0x20(%rbp),%eax
shl    $0x4,%eax
mov    %al,-0x35(%rbp)
movsbl 0x20(%rbp),%eax
movsbl -0x35(%rbp),%ecx
or     %ecx,%eax
mov    %al,-0x36(%rbp)
cmpl   $0x0,-0x18(%rbp)
jle    1166 <drawLineHMaxClipped+0x66>
movl   $0x40,-0x28(%rbp)
jmp    1175 <drawLineHMaxClipped+0x75>
movl   $0xffffffc0,-0x28(%rbp)
xor    %eax,%eax
sub    -0x18(%rbp),%eax
mov    %eax,-0x18(%rbp)
mov    -0x18(%rbp),%eax
shl    $0x1,%eax
mov    %eax,-0x20(%rbp)
mov    -0x18(%rbp),%eax
sub    -0x14(%rbp),%eax
shl    $0x1,%eax
mov    %eax,-0x24(%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,-0x2c(%rbp)
jne    11bc <drawLineHMaxClipped+0xbc>
movl   $0x1,-0x30(%rbp)
jmp    11c3 <drawLineHMaxClipped+0xc3>
movl   $0x1,-0x34(%rbp)
jmp    11c8 <drawLineHMaxClipped+0xc8>
mov    0x10(%rbp),%eax
mov    %eax,%ecx
add    $0xffffffff,%ecx
mov    %ecx,0x10(%rbp)
cmp    $0x0,%eax
jle    1391 <drawLineHMaxClipped+0x291>
cmpl   $0x0,-0x1c(%rbp)
jg     12a3 <drawLineHMaxClipped+0x1a3>
mov    -0x20(%rbp),%eax
add    -0x1c(%rbp),%eax
mov    %eax,-0x1c(%rbp)
mov    -0x2c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x2c(%rbp)
cmpl   $0x2,-0x2c(%rbp)
jne    1297 <drawLineHMaxClipped+0x197>
cmpl   $0x0,-0x30(%rbp)
je     1224 <drawLineHMaxClipped+0x124>
cmpl   $0x0,-0x34(%rbp)
je     1224 <drawLineHMaxClipped+0x124>
mov    -0x36(%rbp),%cl
mov    -0x8(%rbp),%rax
mov    %cl,(%rax)
jmp    1271 <drawLineHMaxClipped+0x171>
cmpl   $0x0,-0x30(%rbp)
je     1251 <drawLineHMaxClipped+0x151>
mov    -0x8(%rbp),%rax
movsbl (%rax),%ecx
and    $0xf0,%ecx
mov    %cl,(%rax)
movsbl 0x20(%rbp),%edx
mov    -0x8(%rbp),%rax
movsbl (%rax),%ecx
or     %edx,%ecx
mov    %cl,(%rax)
jmp    126c <drawLineHMaxClipped+0x16c>
mov    -0x8(%rbp),%rax
movsbl (%rax),%ecx
and    $0xf,%ecx
mov    %cl,(%rax)
movsbl -0x35(%rbp),%edx
mov    -0x8(%rbp),%rax
movsbl (%rax),%ecx
or     %edx,%ecx
mov    %cl,(%rax)
jmp    1271 <drawLineHMaxClipped+0x171>
mov    -0x8(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x8(%rbp)
movl   $0x0,-0x2c(%rbp)
movl   $0x0,-0x34(%rbp)
movl   $0x1,-0x30(%rbp)
jmp    129e <drawLineHMaxClipped+0x19e>
movl   $0x1,-0x34(%rbp)
jmp    138c <drawLineHMaxClipped+0x28c>
mov    -0x24(%rbp),%eax
add    -0x1c(%rbp),%eax
mov    %eax,-0x1c(%rbp)
cmpl   $0x0,-0x30(%rbp)
je     12ce <drawLineHMaxClipped+0x1ce>
cmpl   $0x0,-0x34(%rbp)
je     12ce <drawLineHMaxClipped+0x1ce>
mov    -0x36(%rbp),%cl
mov    -0x8(%rbp),%rax
mov    %cl,(%rax)
jmp    131b <drawLineHMaxClipped+0x21b>
cmpl   $0x0,-0x30(%rbp)
je     12fb <drawLineHMaxClipped+0x1fb>
mov    -0x8(%rbp),%rax
movsbl (%rax),%ecx
and    $0xf0,%ecx
mov    %cl,(%rax)
movsbl 0x20(%rbp),%edx
mov    -0x8(%rbp),%rax
movsbl (%rax),%ecx
or     %edx,%ecx
mov    %cl,(%rax)
jmp    1316 <drawLineHMaxClipped+0x216>
mov    -0x8(%rbp),%rax
movsbl (%rax),%ecx
and    $0xf,%ecx
mov    %cl,(%rax)
movsbl -0x35(%rbp),%edx
mov    -0x8(%rbp),%rax
movsbl (%rax),%ecx
or     %edx,%ecx
mov    %cl,(%rax)
jmp    131b <drawLineHMaxClipped+0x21b>
mov    -0x2c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x2c(%rbp)
cmpl   $0x2,-0x2c(%rbp)
jne    1354 <drawLineHMaxClipped+0x254>
mov    -0x8(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x8(%rbp)
movl   $0x0,-0x2c(%rbp)
movl   $0x1,-0x30(%rbp)
movl   $0x0,-0x34(%rbp)
jmp    1362 <drawLineHMaxClipped+0x262>
movl   $0x0,-0x30(%rbp)
movl   $0x1,-0x34(%rbp)
mov    0x18(%rbp),%eax
mov    %eax,%ecx
add    $0xffffffff,%ecx
mov    %ecx,0x18(%rbp)
cmp    $0x0,%eax
jne    137b <drawLineHMaxClipped+0x27b>
jmp    1400 <drawLineHMaxClipped+0x300>
mov    -0x28(%rbp),%ecx
mov    -0x8(%rbp),%rax
movslq %ecx,%rcx
add    %rcx,%rax
mov    %rax,-0x8(%rbp)
jmp    11c8 <drawLineHMaxClipped+0xc8>
cmpl   $0x0,-0x30(%rbp)
je     13b3 <drawLineHMaxClipped+0x2b3>
cmpl   $0x0,-0x34(%rbp)
je     13b3 <drawLineHMaxClipped+0x2b3>
mov    -0x36(%rbp),%cl
mov    -0x8(%rbp),%rax
mov    %cl,(%rax)
jmp    1400 <drawLineHMaxClipped+0x300>
cmpl   $0x0,-0x30(%rbp)
je     13e0 <drawLineHMaxClipped+0x2e0>
mov    -0x8(%rbp),%rax
movsbl (%rax),%ecx
and    $0xf0,%ecx
mov    %cl,(%rax)
movsbl 0x20(%rbp),%edx
mov    -0x8(%rbp),%rax
movsbl (%rax),%ecx
or     %edx,%ecx
mov    %cl,(%rax)
jmp    13fb <drawLineHMaxClipped+0x2fb>
mov    -0x8(%rbp),%rax
movsbl (%rax),%ecx
and    $0xf,%ecx
mov    %cl,(%rax)
movsbl -0x35(%rbp),%edx
mov    -0x8(%rbp),%rax
movsbl (%rax),%ecx
or     %edx,%ecx
mov    %cl,(%rax)
jmp    1400 <drawLineHMaxClipped+0x300>
pop    %rbp
ret

x86 assembly (clang, -O2):
<drawLineHMaxClipped>:
push   %rbp
push   %r15
push   %r14
push   %r12
push   %rbx
mov    0x40(%rsp),%r10b
mov    %esi,%eax
and    $0x1,%eax
mov    %r10d,%r11d
shl    $0x4,%r11b
mov    %r11d,%r15d
or     %r10b,%r15b
xor    %ebx,%ebx
test   %r8d,%r8d
setg   %r12b
mov    %r8d,%r14d
neg    %r14d
cmovs  %r8d,%r14d
mov    0x30(%rsp),%ebp
shl    $0x6,%edx
sar    %esi
add    %edx,%esi
movslq %esi,%rdx
add    %rdi,%rdx
mov    %eax,%edi
xor    $0x1,%edi
test   %ebp,%ebp
jle    1205 <drawLineHMaxClipped+0x105>
mov    0x38(%rsp),%esi
mov    %r12b,%bl
shl    $0x7,%rbx
add    $0xffffffffffffffc0,%rbx
mov    %r14d,%r8d
sub    %ecx,%r8d
add    $0x1,%ebp
jmp    118c <drawLineHMaxClipped+0x8c>
mov    %al,(%rdx)
add    $0x1,%rdx
xor    %ecx,%ecx
mov    $0x1,%edi
mov    %r14d,%eax
lea    (%r9,%rax,2),%r9d
add    $0xffffffff,%ebp
mov    %ecx,%eax
cmp    $0x1,%ebp
jbe    1207 <drawLineHMaxClipped+0x107>
test   %r9d,%r9d
jle    11b0 <drawLineHMaxClipped+0xb0>
test   %edi,%edi
je     119c <drawLineHMaxClipped+0x9c>
mov    %r15d,%ecx
test   %eax,%eax
jne    11e0 <drawLineHMaxClipped+0xe0>
movzbl (%rdx),%ecx
test   %edi,%edi
je     11cb <drawLineHMaxClipped+0xcb>
and    $0xf0,%cl
or     %r10b,%cl
jmp    11e0 <drawLineHMaxClipped+0xe0>
nopl   0x0(%rax,%rax,1)
mov    $0x1,%ecx
cmp    $0x1,%eax
jne    1177 <drawLineHMaxClipped+0x77>
mov    %r15d,%eax
test   %edi,%edi
jne    116a <drawLineHMaxClipped+0x6a>
movzbl (%rdx),%eax
and    $0xf,%al
or     %r11b,%al
jmp    116a <drawLineHMaxClipped+0x6a>
and    $0xf,%cl
or     %r11b,%cl
cs nopw 0x0(%rax,%rax,1)
nopl   0x0(%rax,%rax,1)
mov    %cl,(%rdx)
test   %esi,%esi
je     1229 <drawLineHMaxClipped+0x129>
xor    %ecx,%ecx
xor    %edi,%edi
cmp    $0x1,%eax
setne  %cl
sete   %dil
add    %rbx,%rdx
add    %rdi,%rdx
add    $0xffffffff,%esi
mov    %r8d,%eax
jmp    117a <drawLineHMaxClipped+0x7a>
mov    %eax,%ecx
test   %edi,%edi
je     120f <drawLineHMaxClipped+0x10f>
test   %ecx,%ecx
jne    1226 <drawLineHMaxClipped+0x126>
mov    (%rdx),%r15b
test   %edi,%edi
je     121f <drawLineHMaxClipped+0x11f>
and    $0xf0,%r15b
or     %r10b,%r15b
jmp    1226 <drawLineHMaxClipped+0x126>
and    $0xf,%r15b
or     %r11b,%r15b
mov    %r15b,(%rdx)
pop    %rbx
pop    %r12
pop    %r14
pop    %r15
pop    %rbp
ret

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

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