unsigned char chr_get_pixel(unsigned char *buf, unsigned char x,
                            unsigned char y) {
  unsigned char bytes_per_line, index;
  bytes_per_line = ((buf)[1] & 0x1f);
  bytes_per_line += (unsigned char)7;
  bytes_per_line >>= (unsigned char)3;
  index = y;
  index *= bytes_per_line;
  index += (unsigned char)(x >> 3);
  index += 3;
  if (buf[index] & ((unsigned char)1 << (x & (unsigned char)7)))
    return 1;
  return 0;
}


x86 assembly (clang, -O0):
<chr_get_pixel>:
push   %rbp
mov    %rsp,%rbp
mov    %dl,%al
mov    %sil,%cl
mov    %rdi,-0x10(%rbp)
mov    %cl,-0x11(%rbp)
mov    %al,-0x12(%rbp)
mov    -0x10(%rbp),%rax
movzbl 0x1(%rax),%eax
and    $0x1f,%eax
mov    %al,-0x13(%rbp)
movzbl -0x13(%rbp),%eax
add    $0x7,%eax
mov    %al,-0x13(%rbp)
movzbl -0x13(%rbp),%eax
sar    $0x3,%eax
mov    %al,-0x13(%rbp)
mov    -0x12(%rbp),%al
mov    %al,-0x14(%rbp)
movzbl -0x13(%rbp),%ecx
movzbl -0x14(%rbp),%eax
imul   %ecx,%eax
mov    %al,-0x14(%rbp)
movzbl -0x11(%rbp),%eax
sar    $0x3,%eax
movzbl %al,%ecx
movzbl -0x14(%rbp),%eax
add    %ecx,%eax
mov    %al,-0x14(%rbp)
movzbl -0x14(%rbp),%eax
add    $0x3,%eax
mov    %al,-0x14(%rbp)
mov    -0x10(%rbp),%rax
movzbl -0x14(%rbp),%ecx
movzbl (%rax,%rcx,1),%eax
movzbl -0x11(%rbp),%ecx
and    $0x7,%ecx
mov    $0x1,%edx
shl    %cl,%edx
mov    %edx,%ecx
and    %ecx,%eax
cmp    $0x0,%eax
je     1196 <chr_get_pixel+0x96>
movb   $0x1,-0x1(%rbp)
jmp    119a <chr_get_pixel+0x9a>
movb   $0x0,-0x1(%rbp)
movzbl -0x1(%rbp),%eax
pop    %rbp
ret

x86 assembly (clang, -O2):
<chr_get_pixel>:
mov    0x1(%rdi),%al
and    $0x1f,%al
add    $0x7,%al
shr    $0x3,%al
mul    %dl
mov    %esi,%ecx
shr    $0x3,%cl
add    %al,%cl
add    $0x3,%cl
movzbl %cl,%eax
movzbl (%rdi,%rax,1),%eax
and    $0x7,%sil
movzbl %sil,%ecx
bt     %ecx,%eax
setb   %al
ret

LLVM IR (-O0):
define zeroext i8 @chr_get_pixel(i8* %0, i8 zeroext %1, i8 zeroext %2) {
%4 = alloca i8
%5 = alloca i8*
%6 = alloca i8
%7 = alloca i8
%8 = alloca i8
%9 = alloca i8
store i8* %0, i8** %5
store i8 %1, i8* %6
store i8 %2, i8* %7
%10 = load i8*, i8** %5
%11 = getelementptr inbounds i8, i8* %10, i64 1
%12 = load i8, i8* %11
%13 = zext i8 %12 to i32
%14 = and i32 %13, 31
%15 = trunc i32 %14 to i8
store i8 %15, i8* %8
%16 = load i8, i8* %8
%17 = zext i8 %16 to i32
%18 = add nsw i32 %17, 7
%19 = trunc i32 %18 to i8
store i8 %19, i8* %8
%20 = load i8, i8* %8
%21 = zext i8 %20 to i32
%22 = ashr i32 %21, 3
%23 = trunc i32 %22 to i8
store i8 %23, i8* %8
%24 = load i8, i8* %7
store i8 %24, i8* %9
%25 = load i8, i8* %8
%26 = zext i8 %25 to i32
%27 = load i8, i8* %9
%28 = zext i8 %27 to i32
%29 = mul nsw i32 %28, %26
%30 = trunc i32 %29 to i8
store i8 %30, i8* %9
%31 = load i8, i8* %6
%32 = zext i8 %31 to i32
%33 = ashr i32 %32, 3
%34 = trunc i32 %33 to i8
%35 = zext i8 %34 to i32
%36 = load i8, i8* %9
%37 = zext i8 %36 to i32
%38 = add nsw i32 %37, %35
%39 = trunc i32 %38 to i8
store i8 %39, i8* %9
%40 = load i8, i8* %9
%41 = zext i8 %40 to i32
%42 = add nsw i32 %41, 3
%43 = trunc i32 %42 to i8
store i8 %43, i8* %9
%44 = load i8*, i8** %5
%45 = load i8, i8* %9
%46 = zext i8 %45 to i64
%47 = getelementptr inbounds i8, i8* %44, i64 %46
%48 = load i8, i8* %47
%49 = zext i8 %48 to i32
%50 = load i8, i8* %6
%51 = zext i8 %50 to i32
%52 = and i32 %51, 7
%53 = shl i32 1, %52
%54 = and i32 %49, %53
%55 = icmp ne i32 %54, 0
br i1 %55, label %56, label %57
56: ; preds = %3
store i8 1, i8* %4
br label %58
57: ; preds = %3
store i8 0, i8* %4
br label %58
58: ; preds = %57, %56
%59 = load i8, i8* %4
ret i8 %59
}

LLVM IR (-O2):
define zeroext i8 @chr_get_pixel(i8* nocapture %0, i8 zeroext %1, i8 zeroext %2) {
%4 = getelementptr inbounds i8, i8* %0, i64 1
%5 = load i8, i8* %4
%6 = and i8 %5, 31
%7 = add nuw nsw i8 %6, 7
%8 = lshr i8 %7, 3
%9 = mul i8 %8, %2
%10 = lshr i8 %1, 3
%11 = add nuw nsw i8 %10, 3
%12 = add i8 %11, %9
%13 = zext i8 %12 to i64
%14 = getelementptr inbounds i8, i8* %0, i64 %13
%15 = load i8, i8* %14
%16 = zext i8 %15 to i32
%17 = and i8 %1, 7
%18 = zext i8 %17 to i32
%19 = shl nuw nsw i32 1, %18
%20 = and i32 %19, %16
%21 = icmp ne i32 %20, 0
%22 = zext i1 %21 to i8
ret i8 %22
}