void GrOffScreen8BPPLineDrawH(void *pvDisplayData, long lX1, long lX2, long lY,
                              unsigned long ulValue) {
  unsigned char *pucData;
  ;
  pucData = (unsigned char *)pvDisplayData;
  pucData += (*(unsigned short *)(pucData + 1) * lY) + lX1 + 6 + (256 * 3);
  ulValue = (ulValue << 24) | (ulValue << 16) | (ulValue << 8) | ulValue;
  if (((unsigned long)pucData) & 1) {
    *pucData++ = ulValue & 0xff;
    lX1++;
  }
  if (((unsigned long)pucData & 2) && ((lX2 - lX1) > 0)) {
    *(unsigned short *)pucData = ulValue & 0xffff;
    pucData += 2;
    lX1 += 2;
  }
  while ((lX1 + 3) <= lX2) {
    *(unsigned long *)pucData = ulValue;
    pucData += 4;
    lX1 += 4;
  }
  if ((lX1 + 1) <= lX2) {
    *(unsigned short *)pucData = ulValue & 0xffff;
    pucData += 2;
    lX1 += 2;
  }
  if (lX1 == lX2) {
    *pucData = ulValue & 0xff;
  }
}


x86 assembly (clang, -O0):
<GrOffScreen8BPPLineDrawH>:
push   %rbp
mov    %rsp,%rbp
mov    %rdi,-0x8(%rbp)
mov    %rsi,-0x10(%rbp)
mov    %rdx,-0x18(%rbp)
mov    %rcx,-0x20(%rbp)
mov    %r8,-0x28(%rbp)
mov    -0x8(%rbp),%rax
mov    %rax,-0x30(%rbp)
mov    -0x30(%rbp),%rax
movzwl 0x1(%rax),%eax
imul   -0x20(%rbp),%rax
add    -0x10(%rbp),%rax
add    $0x6,%rax
add    $0x300,%rax
add    -0x30(%rbp),%rax
mov    %rax,-0x30(%rbp)
mov    -0x28(%rbp),%rax
shl    $0x18,%rax
mov    -0x28(%rbp),%rcx
shl    $0x10,%rcx
or     %rcx,%rax
mov    -0x28(%rbp),%rcx
shl    $0x8,%rcx
or     %rcx,%rax
or     -0x28(%rbp),%rax
mov    %rax,-0x28(%rbp)
mov    -0x30(%rbp),%rax
and    $0x1,%rax
cmp    $0x0,%rax
je     11a4 <GrOffScreen8BPPLineDrawH+0xa4>
mov    -0x28(%rbp),%rax
and    $0xff,%rax
mov    %al,%cl
mov    -0x30(%rbp),%rax
mov    %rax,%rdx
add    $0x1,%rdx
mov    %rdx,-0x30(%rbp)
mov    %cl,(%rax)
mov    -0x10(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x10(%rbp)
mov    -0x30(%rbp),%rax
and    $0x2,%rax
cmp    $0x0,%rax
je     11f4 <GrOffScreen8BPPLineDrawH+0xf4>
mov    -0x18(%rbp),%rax
sub    -0x10(%rbp),%rax
cmp    $0x0,%rax
jle    11f4 <GrOffScreen8BPPLineDrawH+0xf4>
mov    -0x28(%rbp),%rax
and    $0xffff,%rax
mov    %ax,%cx
mov    -0x30(%rbp),%rax
mov    %cx,(%rax)
mov    -0x30(%rbp),%rax
add    $0x2,%rax
mov    %rax,-0x30(%rbp)
mov    -0x10(%rbp),%rax
add    $0x2,%rax
mov    %rax,-0x10(%rbp)
jmp    11f9 <GrOffScreen8BPPLineDrawH+0xf9>
mov    -0x10(%rbp),%rax
add    $0x3,%rax
cmp    -0x18(%rbp),%rax
jg     1233 <GrOffScreen8BPPLineDrawH+0x133>
mov    -0x28(%rbp),%rcx
mov    -0x30(%rbp),%rax
mov    %rcx,(%rax)
mov    -0x30(%rbp),%rax
add    $0x4,%rax
mov    %rax,-0x30(%rbp)
mov    -0x10(%rbp),%rax
add    $0x4,%rax
mov    %rax,-0x10(%rbp)
jmp    11f9 <GrOffScreen8BPPLineDrawH+0xf9>
mov    -0x10(%rbp),%rax
add    $0x1,%rax
cmp    -0x18(%rbp),%rax
jg     1271 <GrOffScreen8BPPLineDrawH+0x171>
mov    -0x28(%rbp),%rax
and    $0xffff,%rax
mov    %ax,%cx
mov    -0x30(%rbp),%rax
mov    %cx,(%rax)
mov    -0x30(%rbp),%rax
add    $0x2,%rax
mov    %rax,-0x30(%rbp)
mov    -0x10(%rbp),%rax
add    $0x2,%rax
mov    %rax,-0x10(%rbp)
mov    -0x10(%rbp),%rax
cmp    -0x18(%rbp),%rax
jne    1291 <GrOffScreen8BPPLineDrawH+0x191>
mov    -0x28(%rbp),%rax
and    $0xff,%rax
mov    %al,%cl
mov    -0x30(%rbp),%rax
mov    %cl,(%rax)
pop    %rbp
ret

x86 assembly (clang, -O2):
<GrOffScreen8BPPLineDrawH>:
movzwl 0x1(%rdi),%eax
imul   %rcx,%rax
add    %rsi,%rax
add    %rdi,%rax
add    $0x306,%rax
mov    %r8,%rdi
shl    $0x18,%rdi
mov    %r8,%rcx
shl    $0x10,%rcx
mov    %r8,%r9
shl    $0x8,%r9
or     %rdi,%r9
or     %r8,%rcx
test   $0x1,%al
je     113e <GrOffScreen8BPPLineDrawH+0x3e>
mov    %r8b,(%rax)
add    $0x1,%rax
add    $0x1,%rsi
or     %r9,%rcx
test   $0x2,%al
je     1155 <GrOffScreen8BPPLineDrawH+0x55>
cmp    %rdx,%rsi
jge    1155 <GrOffScreen8BPPLineDrawH+0x55>
mov    %cx,(%rax)
add    $0x2,%rax
add    $0x2,%rsi
lea    0x3(%rsi),%rdi
cmp    %rdx,%rdi
jle    1170 <GrOffScreen8BPPLineDrawH+0x70>
mov    %rsi,%rdi
jmp    1187 <GrOffScreen8BPPLineDrawH+0x87>
cs nopw 0x0(%rax,%rax,1)
nopl   (%rax)
mov    %rcx,(%rax)
add    $0x4,%rax
lea    0x4(%rsi),%rdi
add    $0x7,%rsi
cmp    %rdx,%rsi
mov    %rdi,%rsi
jle    1170 <GrOffScreen8BPPLineDrawH+0x70>
cmp    %rdx,%rdi
jl     1192 <GrOffScreen8BPPLineDrawH+0x92>
cmp    %rdx,%rdi
je     11a2 <GrOffScreen8BPPLineDrawH+0xa2>
ret
mov    %cx,(%rax)
add    $0x2,%rax
add    $0x2,%rdi
cmp    %rdx,%rdi
jne    1191 <GrOffScreen8BPPLineDrawH+0x91>
mov    %r8b,(%rax)
ret

LLVM IR (-O0):
define void @GrOffScreen8BPPLineDrawH(i8* %0, i64 %1, i64 %2, i64 %3, i64 %4) {
%6 = alloca i8*
%7 = alloca i64
%8 = alloca i64
%9 = alloca i64
%10 = alloca i64
%11 = alloca i8*
store i8* %0, i8** %6
store i64 %1, i64* %7
store i64 %2, i64* %8
store i64 %3, i64* %9
store i64 %4, i64* %10
%12 = load i8*, i8** %6
store i8* %12, i8** %11
%13 = load i8*, i8** %11
%14 = getelementptr inbounds i8, i8* %13, i64 1
%15 = bitcast i8* %14 to i16*
%16 = load i16, i16* %15
%17 = zext i16 %16 to i64
%18 = load i64, i64* %9
%19 = mul nsw i64 %17, %18
%20 = load i64, i64* %7
%21 = add nsw i64 %19, %20
%22 = add nsw i64 %21, 6
%23 = add nsw i64 %22, 768
%24 = load i8*, i8** %11
%25 = getelementptr inbounds i8, i8* %24, i64 %23
store i8* %25, i8** %11
%26 = load i64, i64* %10
%27 = shl i64 %26, 24
%28 = load i64, i64* %10
%29 = shl i64 %28, 16
%30 = or i64 %27, %29
%31 = load i64, i64* %10
%32 = shl i64 %31, 8
%33 = or i64 %30, %32
%34 = load i64, i64* %10
%35 = or i64 %33, %34
store i64 %35, i64* %10
%36 = load i8*, i8** %11
%37 = ptrtoint i8* %36 to i64
%38 = and i64 %37, 1
%39 = icmp ne i64 %38, 0
br i1 %39, label %40, label %48
40: ; preds = %5
%41 = load i64, i64* %10
%42 = and i64 %41, 255
%43 = trunc i64 %42 to i8
%44 = load i8*, i8** %11
%45 = getelementptr inbounds i8, i8* %44, i32 1
store i8* %45, i8** %11
store i8 %43, i8* %44
%46 = load i64, i64* %7
%47 = add nsw i64 %46, 1
store i64 %47, i64* %7
br label %48
48: ; preds = %40, %5
%49 = load i8*, i8** %11
%50 = ptrtoint i8* %49 to i64
%51 = and i64 %50, 2
%52 = icmp ne i64 %51, 0
br i1 %52, label %53, label %68
53: ; preds = %48
%54 = load i64, i64* %8
%55 = load i64, i64* %7
%56 = sub nsw i64 %54, %55
%57 = icmp sgt i64 %56, 0
br i1 %57, label %58, label %68
58: ; preds = %53
%59 = load i64, i64* %10
%60 = and i64 %59, 65535
%61 = trunc i64 %60 to i16
%62 = load i8*, i8** %11
%63 = bitcast i8* %62 to i16*
store i16 %61, i16* %63
%64 = load i8*, i8** %11
%65 = getelementptr inbounds i8, i8* %64, i64 2
store i8* %65, i8** %11
%66 = load i64, i64* %7
%67 = add nsw i64 %66, 2
store i64 %67, i64* %7
br label %68
68: ; preds = %58, %53, %48
br label %69
69: ; preds = %74, %68
%70 = load i64, i64* %7
%71 = add nsw i64 %70, 3
%72 = load i64, i64* %8
%73 = icmp sle i64 %71, %72
br i1 %73, label %74, label %82
74: ; preds = %69
%75 = load i64, i64* %10
%76 = load i8*, i8** %11
%77 = bitcast i8* %76 to i64*
store i64 %75, i64* %77
%78 = load i8*, i8** %11
%79 = getelementptr inbounds i8, i8* %78, i64 4
store i8* %79, i8** %11
%80 = load i64, i64* %7
%81 = add nsw i64 %80, 4
store i64 %81, i64* %7
br label %69
82: ; preds = %69
%83 = load i64, i64* %7
%84 = add nsw i64 %83, 1
%85 = load i64, i64* %8
%86 = icmp sle i64 %84, %85
br i1 %86, label %87, label %97
87: ; preds = %82
%88 = load i64, i64* %10
%89 = and i64 %88, 65535
%90 = trunc i64 %89 to i16
%91 = load i8*, i8** %11
%92 = bitcast i8* %91 to i16*
store i16 %90, i16* %92
%93 = load i8*, i8** %11
%94 = getelementptr inbounds i8, i8* %93, i64 2
store i8* %94, i8** %11
%95 = load i64, i64* %7
%96 = add nsw i64 %95, 2
store i64 %96, i64* %7
br label %97
97: ; preds = %87, %82
%98 = load i64, i64* %7
%99 = load i64, i64* %8
%100 = icmp eq i64 %98, %99
br i1 %100, label %101, label %106
101: ; preds = %97
%102 = load i64, i64* %10
%103 = and i64 %102, 255
%104 = trunc i64 %103 to i8
%105 = load i8*, i8** %11
store i8 %104, i8* %105
br label %106
106: ; preds = %101, %97
ret void
}

LLVM IR (-O2):
define void @GrOffScreen8BPPLineDrawH(i8* %0, i64 %1, i64 %2, i64 %3, i64 %4) {
%6 = getelementptr inbounds i8, i8* %0, i64 1
%7 = bitcast i8* %6 to i16*
%8 = load i16, i16* %7
%9 = zext i16 %8 to i64
%10 = mul nsw i64 %9, %3
%11 = add i64 %1, 774
%12 = add i64 %11, %10
%13 = getelementptr inbounds i8, i8* %0, i64 %12
%14 = shl i64 %4, 24
%15 = shl i64 %4, 16
%16 = shl i64 %4, 8
%17 = or i64 %15, %4
%18 = or i64 %17, %14
%19 = or i64 %18, %16
%20 = ptrtoint i8* %13 to i64
%21 = and i64 %20, 1
%22 = icmp eq i64 %21, 0
br i1 %22, label %28, label %23
23: ; preds = %5
%24 = trunc i64 %4 to i8
%25 = getelementptr inbounds i8, i8* %13, i64 1
store i8 %24, i8* %13
%26 = add nsw i64 %1, 1
%27 = ptrtoint i8* %25 to i64
br label %28
28: ; preds = %23, %5
%29 = phi i64 [ %27, %23 ], [ %20, %5 ]
%30 = phi i64 [ %26, %23 ], [ %1, %5 ]
%31 = phi i8* [ %25, %23 ], [ %13, %5 ]
%32 = and i64 %29, 2
%33 = icmp ne i64 %32, 0
%34 = icmp slt i64 %30, %2
%35 = select i1 %33, i1 %34, i1 false
br i1 %35, label %36, label %41
36: ; preds = %28
%37 = trunc i64 %19 to i16
%38 = bitcast i8* %31 to i16*
store i16 %37, i16* %38
%39 = getelementptr inbounds i8, i8* %31, i64 2
%40 = add nsw i64 %30, 2
br label %41
41: ; preds = %36, %28
%42 = phi i64 [ %40, %36 ], [ %30, %28 ]
%43 = phi i8* [ %39, %36 ], [ %31, %28 ]
%44 = add nsw i64 %42, 3
%45 = icmp sgt i64 %44, %2
br i1 %45, label %54, label %46
46: ; preds = %41, %46
%47 = phi i8* [ %50, %46 ], [ %43, %41 ]
%48 = phi i64 [ %51, %46 ], [ %42, %41 ]
%49 = bitcast i8* %47 to i64*
store i64 %19, i64* %49
%50 = getelementptr inbounds i8, i8* %47, i64 4
%51 = add nsw i64 %48, 4
%52 = add nsw i64 %48, 7
%53 = icmp sgt i64 %52, %2
br i1 %53, label %54, label %46
54: ; preds = %46, %41
%55 = phi i64 [ %42, %41 ], [ %51, %46 ]
%56 = phi i8* [ %43, %41 ], [ %50, %46 ]
%57 = icmp slt i64 %55, %2
br i1 %57, label %58, label %63
58: ; preds = %54
%59 = trunc i64 %19 to i16
%60 = bitcast i8* %56 to i16*
store i16 %59, i16* %60
%61 = getelementptr inbounds i8, i8* %56, i64 2
%62 = add nsw i64 %55, 2
br label %63
63: ; preds = %58, %54
%64 = phi i64 [ %62, %58 ], [ %55, %54 ]
%65 = phi i8* [ %61, %58 ], [ %56, %54 ]
%66 = icmp eq i64 %64, %2
br i1 %66, label %67, label %69
67: ; preds = %63
%68 = trunc i64 %4 to i8
store i8 %68, i8* %65
br label %69
69: ; preds = %67, %63
ret void
}