void color32x32(char c, char x, char y) {
  unsigned short p = 0x5800 + y * 64 + x * 2 + 8 + 32;
  *(unsigned char *)p = c;
  p++;
  *(unsigned char *)p = c;
  p++;
  *(unsigned char *)p = c;
  p++;
  *(unsigned char *)p = c;
  p += 31;
  *(unsigned char *)p = c;
  p++;
  *(unsigned char *)p = c;
  p++;
  *(unsigned char *)p = c;
  p++;
  *(unsigned char *)p = c;
  p += 31;
  *(unsigned char *)p = c;
  p++;
  *(unsigned char *)p = c;
  p++;
  *(unsigned char *)p = c;
  p++;
  *(unsigned char *)p = c;
  p += 31;
  *(unsigned char *)p = c;
  p++;
  *(unsigned char *)p = c;
  p++;
  *(unsigned char *)p = c;
  p++;
  *(unsigned char *)p = c;
}


x86 assembly (clang, -O0):
<color32x32>:
push   %rbp
mov    %rsp,%rbp
mov    %dl,%al
mov    %sil,%cl
mov    %dil,%dl
mov    %dl,-0x1(%rbp)
mov    %cl,-0x2(%rbp)
mov    %al,-0x3(%rbp)
movsbl -0x3(%rbp),%eax
shl    $0x6,%eax
add    $0x5800,%eax
movsbl -0x2(%rbp),%ecx
shl    $0x1,%ecx
add    %ecx,%eax
add    $0x8,%eax
add    $0x20,%eax
mov    %ax,-0x6(%rbp)
mov    -0x1(%rbp),%cl
movzwl -0x6(%rbp),%eax
mov    %cl,(%rax)
mov    -0x6(%rbp),%ax
add    $0x1,%ax
mov    %ax,-0x6(%rbp)
mov    -0x1(%rbp),%cl
movzwl -0x6(%rbp),%eax
mov    %cl,(%rax)
mov    -0x6(%rbp),%ax
add    $0x1,%ax
mov    %ax,-0x6(%rbp)
mov    -0x1(%rbp),%cl
movzwl -0x6(%rbp),%eax
mov    %cl,(%rax)
mov    -0x6(%rbp),%ax
add    $0x1,%ax
mov    %ax,-0x6(%rbp)
mov    -0x1(%rbp),%cl
movzwl -0x6(%rbp),%eax
mov    %cl,(%rax)
movzwl -0x6(%rbp),%eax
add    $0x1f,%eax
mov    %ax,-0x6(%rbp)
mov    -0x1(%rbp),%cl
movzwl -0x6(%rbp),%eax
mov    %cl,(%rax)
mov    -0x6(%rbp),%ax
add    $0x1,%ax
mov    %ax,-0x6(%rbp)
mov    -0x1(%rbp),%cl
movzwl -0x6(%rbp),%eax
mov    %cl,(%rax)
mov    -0x6(%rbp),%ax
add    $0x1,%ax
mov    %ax,-0x6(%rbp)
mov    -0x1(%rbp),%cl
movzwl -0x6(%rbp),%eax
mov    %cl,(%rax)
mov    -0x6(%rbp),%ax
add    $0x1,%ax
mov    %ax,-0x6(%rbp)
mov    -0x1(%rbp),%cl
movzwl -0x6(%rbp),%eax
mov    %cl,(%rax)
movzwl -0x6(%rbp),%eax
add    $0x1f,%eax
mov    %ax,-0x6(%rbp)
mov    -0x1(%rbp),%cl
movzwl -0x6(%rbp),%eax
mov    %cl,(%rax)
mov    -0x6(%rbp),%ax
add    $0x1,%ax
mov    %ax,-0x6(%rbp)
mov    -0x1(%rbp),%cl
movzwl -0x6(%rbp),%eax
mov    %cl,(%rax)
mov    -0x6(%rbp),%ax
add    $0x1,%ax
mov    %ax,-0x6(%rbp)
mov    -0x1(%rbp),%cl
movzwl -0x6(%rbp),%eax
mov    %cl,(%rax)
mov    -0x6(%rbp),%ax
add    $0x1,%ax
mov    %ax,-0x6(%rbp)
mov    -0x1(%rbp),%cl
movzwl -0x6(%rbp),%eax
mov    %cl,(%rax)
movzwl -0x6(%rbp),%eax
add    $0x1f,%eax
mov    %ax,-0x6(%rbp)
mov    -0x1(%rbp),%cl
movzwl -0x6(%rbp),%eax
mov    %cl,(%rax)
mov    -0x6(%rbp),%ax
add    $0x1,%ax
mov    %ax,-0x6(%rbp)
mov    -0x1(%rbp),%cl
movzwl -0x6(%rbp),%eax
mov    %cl,(%rax)
mov    -0x6(%rbp),%ax
add    $0x1,%ax
mov    %ax,-0x6(%rbp)
mov    -0x1(%rbp),%cl
movzwl -0x6(%rbp),%eax
mov    %cl,(%rax)
mov    -0x6(%rbp),%ax
add    $0x1,%ax
mov    %ax,-0x6(%rbp)
mov    -0x1(%rbp),%cl
movzwl -0x6(%rbp),%eax
mov    %cl,(%rax)
pop    %rbp
ret

x86 assembly (clang, -O2):
<color32x32>:
shl    $0x6,%edx
lea    (%rdx,%rsi,2),%eax
add    $0x5828,%eax
movzwl %ax,%eax
mov    %dil,(%rax)
lea    0x5829(%rdx,%rsi,2),%eax
movzwl %ax,%eax
mov    %dil,(%rax)
lea    0x582a(%rdx,%rsi,2),%eax
movzwl %ax,%eax
mov    %dil,(%rax)
lea    0x582b(%rdx,%rsi,2),%eax
movzwl %ax,%eax
mov    %dil,(%rax)
lea    0x584a(%rdx,%rsi,2),%eax
movzwl %ax,%eax
mov    %dil,(%rax)
lea    0x584b(%rdx,%rsi,2),%eax
movzwl %ax,%eax
mov    %dil,(%rax)
lea    0x584c(%rdx,%rsi,2),%eax
movzwl %ax,%eax
mov    %dil,(%rax)
lea    0x584d(%rdx,%rsi,2),%eax
movzwl %ax,%eax
mov    %dil,(%rax)
lea    0x586c(%rdx,%rsi,2),%eax
movzwl %ax,%eax
mov    %dil,(%rax)
lea    0x586d(%rdx,%rsi,2),%eax
movzwl %ax,%eax
mov    %dil,(%rax)
lea    0x586e(%rdx,%rsi,2),%eax
movzwl %ax,%eax
mov    %dil,(%rax)
lea    0x586f(%rdx,%rsi,2),%eax
movzwl %ax,%eax
mov    %dil,(%rax)
lea    0x588e(%rdx,%rsi,2),%eax
movzwl %ax,%eax
mov    %dil,(%rax)
lea    0x588f(%rdx,%rsi,2),%eax
movzwl %ax,%eax
mov    %dil,(%rax)
lea    0x5890(%rdx,%rsi,2),%eax
movzwl %ax,%eax
mov    %dil,(%rax)
lea    (%rdx,%rsi,2),%eax
add    $0x5891,%eax
movzwl %ax,%eax
mov    %dil,(%rax)
ret

LLVM IR (-O0):
define void @color32x32(i8 signext %0, i8 signext %1, i8 signext %2) {
%4 = alloca i8
%5 = alloca i8
%6 = alloca i8
%7 = alloca i16
store i8 %0, i8* %4
store i8 %1, i8* %5
store i8 %2, i8* %6
%8 = load i8, i8* %6
%9 = sext i8 %8 to i32
%10 = mul nsw i32 %9, 64
%11 = add nsw i32 22528, %10
%12 = load i8, i8* %5
%13 = sext i8 %12 to i32
%14 = mul nsw i32 %13, 2
%15 = add nsw i32 %11, %14
%16 = add nsw i32 %15, 8
%17 = add nsw i32 %16, 32
%18 = trunc i32 %17 to i16
store i16 %18, i16* %7
%19 = load i8, i8* %4
%20 = load i16, i16* %7
%21 = zext i16 %20 to i64
%22 = inttoptr i64 %21 to i8*
store i8 %19, i8* %22
%23 = load i16, i16* %7
%24 = add i16 %23, 1
store i16 %24, i16* %7
%25 = load i8, i8* %4
%26 = load i16, i16* %7
%27 = zext i16 %26 to i64
%28 = inttoptr i64 %27 to i8*
store i8 %25, i8* %28
%29 = load i16, i16* %7
%30 = add i16 %29, 1
store i16 %30, i16* %7
%31 = load i8, i8* %4
%32 = load i16, i16* %7
%33 = zext i16 %32 to i64
%34 = inttoptr i64 %33 to i8*
store i8 %31, i8* %34
%35 = load i16, i16* %7
%36 = add i16 %35, 1
store i16 %36, i16* %7
%37 = load i8, i8* %4
%38 = load i16, i16* %7
%39 = zext i16 %38 to i64
%40 = inttoptr i64 %39 to i8*
store i8 %37, i8* %40
%41 = load i16, i16* %7
%42 = zext i16 %41 to i32
%43 = add nsw i32 %42, 31
%44 = trunc i32 %43 to i16
store i16 %44, i16* %7
%45 = load i8, i8* %4
%46 = load i16, i16* %7
%47 = zext i16 %46 to i64
%48 = inttoptr i64 %47 to i8*
store i8 %45, i8* %48
%49 = load i16, i16* %7
%50 = add i16 %49, 1
store i16 %50, i16* %7
%51 = load i8, i8* %4
%52 = load i16, i16* %7
%53 = zext i16 %52 to i64
%54 = inttoptr i64 %53 to i8*
store i8 %51, i8* %54
%55 = load i16, i16* %7
%56 = add i16 %55, 1
store i16 %56, i16* %7
%57 = load i8, i8* %4
%58 = load i16, i16* %7
%59 = zext i16 %58 to i64
%60 = inttoptr i64 %59 to i8*
store i8 %57, i8* %60
%61 = load i16, i16* %7
%62 = add i16 %61, 1
store i16 %62, i16* %7
%63 = load i8, i8* %4
%64 = load i16, i16* %7
%65 = zext i16 %64 to i64
%66 = inttoptr i64 %65 to i8*
store i8 %63, i8* %66
%67 = load i16, i16* %7
%68 = zext i16 %67 to i32
%69 = add nsw i32 %68, 31
%70 = trunc i32 %69 to i16
store i16 %70, i16* %7
%71 = load i8, i8* %4
%72 = load i16, i16* %7
%73 = zext i16 %72 to i64
%74 = inttoptr i64 %73 to i8*
store i8 %71, i8* %74
%75 = load i16, i16* %7
%76 = add i16 %75, 1
store i16 %76, i16* %7
%77 = load i8, i8* %4
%78 = load i16, i16* %7
%79 = zext i16 %78 to i64
%80 = inttoptr i64 %79 to i8*
store i8 %77, i8* %80
%81 = load i16, i16* %7
%82 = add i16 %81, 1
store i16 %82, i16* %7
%83 = load i8, i8* %4
%84 = load i16, i16* %7
%85 = zext i16 %84 to i64
%86 = inttoptr i64 %85 to i8*
store i8 %83, i8* %86
%87 = load i16, i16* %7
%88 = add i16 %87, 1
store i16 %88, i16* %7
%89 = load i8, i8* %4
%90 = load i16, i16* %7
%91 = zext i16 %90 to i64
%92 = inttoptr i64 %91 to i8*
store i8 %89, i8* %92
%93 = load i16, i16* %7
%94 = zext i16 %93 to i32
%95 = add nsw i32 %94, 31
%96 = trunc i32 %95 to i16
store i16 %96, i16* %7
%97 = load i8, i8* %4
%98 = load i16, i16* %7
%99 = zext i16 %98 to i64
%100 = inttoptr i64 %99 to i8*
store i8 %97, i8* %100
%101 = load i16, i16* %7
%102 = add i16 %101, 1
store i16 %102, i16* %7
%103 = load i8, i8* %4
%104 = load i16, i16* %7
%105 = zext i16 %104 to i64
%106 = inttoptr i64 %105 to i8*
store i8 %103, i8* %106
%107 = load i16, i16* %7
%108 = add i16 %107, 1
store i16 %108, i16* %7
%109 = load i8, i8* %4
%110 = load i16, i16* %7
%111 = zext i16 %110 to i64
%112 = inttoptr i64 %111 to i8*
store i8 %109, i8* %112
%113 = load i16, i16* %7
%114 = add i16 %113, 1
store i16 %114, i16* %7
%115 = load i8, i8* %4
%116 = load i16, i16* %7
%117 = zext i16 %116 to i64
%118 = inttoptr i64 %117 to i8*
store i8 %115, i8* %118
ret void
}

LLVM IR (-O2):
define void @color32x32(i8 signext %0, i8 signext %1, i8 signext %2) {
%4 = sext i8 %2 to i16
%5 = shl nsw i16 %4, 6
%6 = sext i8 %1 to i16
%7 = shl nsw i16 %6, 1
%8 = add i16 %7, 22528
%9 = add i16 %8, %5
%10 = add i16 %9, 40
%11 = zext i16 %10 to i64
%12 = inttoptr i64 %11 to i8*
store i8 %0, i8* %12
%13 = add i16 %9, 41
%14 = zext i16 %13 to i64
%15 = inttoptr i64 %14 to i8*
store i8 %0, i8* %15
%16 = add i16 %9, 42
%17 = zext i16 %16 to i64
%18 = inttoptr i64 %17 to i8*
store i8 %0, i8* %18
%19 = add i16 %9, 43
%20 = zext i16 %19 to i64
%21 = inttoptr i64 %20 to i8*
store i8 %0, i8* %21
%22 = add i16 %9, 74
%23 = zext i16 %22 to i64
%24 = inttoptr i64 %23 to i8*
store i8 %0, i8* %24
%25 = add i16 %9, 75
%26 = zext i16 %25 to i64
%27 = inttoptr i64 %26 to i8*
store i8 %0, i8* %27
%28 = add i16 %9, 76
%29 = zext i16 %28 to i64
%30 = inttoptr i64 %29 to i8*
store i8 %0, i8* %30
%31 = add i16 %9, 77
%32 = zext i16 %31 to i64
%33 = inttoptr i64 %32 to i8*
store i8 %0, i8* %33
%34 = add i16 %9, 108
%35 = zext i16 %34 to i64
%36 = inttoptr i64 %35 to i8*
store i8 %0, i8* %36
%37 = add i16 %9, 109
%38 = zext i16 %37 to i64
%39 = inttoptr i64 %38 to i8*
store i8 %0, i8* %39
%40 = add i16 %9, 110
%41 = zext i16 %40 to i64
%42 = inttoptr i64 %41 to i8*
store i8 %0, i8* %42
%43 = add i16 %9, 111
%44 = zext i16 %43 to i64
%45 = inttoptr i64 %44 to i8*
store i8 %0, i8* %45
%46 = add i16 %9, 142
%47 = zext i16 %46 to i64
%48 = inttoptr i64 %47 to i8*
store i8 %0, i8* %48
%49 = add i16 %9, 143
%50 = zext i16 %49 to i64
%51 = inttoptr i64 %50 to i8*
store i8 %0, i8* %51
%52 = add i16 %9, 144
%53 = zext i16 %52 to i64
%54 = inttoptr i64 %53 to i8*
store i8 %0, i8* %54
%55 = add i16 %9, 145
%56 = zext i16 %55 to i64
%57 = inttoptr i64 %56 to i8*
store i8 %0, i8* %57
ret void
}