void colorbox(unsigned char x, unsigned char y, unsigned char w,
              unsigned char h, unsigned char c) {
  unsigned short o, i, j;
  unsigned char ws;
  ws = 32 - w;
  o = 0x4000 + (32 * 192) + x + y * 32;
  for (j = 0; j < h; j++) {
    for (i = 0; i < w; i++) {
      *((unsigned char *)o) = c;
      o++;
    }
    o += ws;
  }
}


x86 assembly (clang, -O0):
<colorbox>:
push   %rbp
mov    %rsp,%rbp
mov    %r8b,%al
mov    %dil,-0x1(%rbp)
mov    %sil,-0x2(%rbp)
mov    %dl,-0x3(%rbp)
mov    %cl,-0x4(%rbp)
mov    %al,-0x5(%rbp)
movzbl -0x3(%rbp),%ecx
mov    $0x20,%eax
sub    %ecx,%eax
mov    %al,-0xd(%rbp)
movzbl -0x1(%rbp),%eax
add    $0x5800,%eax
movzbl -0x2(%rbp),%ecx
shl    $0x5,%ecx
add    %ecx,%eax
mov    %ax,-0x8(%rbp)
movw   $0x0,-0xc(%rbp)
movzwl -0xc(%rbp),%eax
movzbl -0x4(%rbp),%ecx
cmp    %ecx,%eax
jge    11ad <colorbox+0xad>
movw   $0x0,-0xa(%rbp)
movzwl -0xa(%rbp),%eax
movzbl -0x3(%rbp),%ecx
cmp    %ecx,%eax
jge    118e <colorbox+0x8e>
mov    -0x5(%rbp),%cl
movzwl -0x8(%rbp),%eax
mov    %cl,(%rax)
mov    -0x8(%rbp),%ax
add    $0x1,%ax
mov    %ax,-0x8(%rbp)
mov    -0xa(%rbp),%ax
add    $0x1,%ax
mov    %ax,-0xa(%rbp)
jmp    1158 <colorbox+0x58>
movzbl -0xd(%rbp),%ecx
movzwl -0x8(%rbp),%eax
add    %ecx,%eax
mov    %ax,-0x8(%rbp)
mov    -0xc(%rbp),%ax
add    $0x1,%ax
mov    %ax,-0xc(%rbp)
jmp    1142 <colorbox+0x42>
pop    %rbp
ret

x86 assembly (clang, -O2):
<colorbox>:
push   %rbp
push   %rbx
test   %ecx,%ecx
je     11b1 <colorbox+0xb1>
movzbl %dil,%eax
movzbl %sil,%esi
shl    $0x5,%esi
add    %esi,%eax
add    $0x5800,%eax
mov    $0x20,%bl
sub    %dl,%bl
movzbl %dl,%r9d
movzbl %bl,%ebx
lea    -0x1(%r9),%r10d
mov    %r9d,%ebp
and    $0x3,%ebp
and    $0xfc,%r9d
xor    %edi,%edi
movzwl %bx,%r11d
jmp    114b <colorbox+0x4b>
add    %r11d,%eax
add    $0x1,%edi
cmp    %cx,%di
je     11b1 <colorbox+0xb1>
test   %dl,%dl
je     1140 <colorbox+0x40>
cmp    $0x3,%r10w
jb     118a <colorbox+0x8a>
mov    %r9d,%ebx
nopl   0x0(%rax)
movzwl %ax,%esi
mov    %r8b,(%rsi)
lea    0x1(%rax),%esi
movzwl %si,%esi
mov    %r8b,(%rsi)
lea    0x2(%rax),%esi
movzwl %si,%esi
mov    %r8b,(%rsi)
lea    0x3(%rax),%esi
movzwl %si,%esi
mov    %r8b,(%rsi)
add    $0x4,%eax
add    $0xfffc,%bx
jne    1160 <colorbox+0x60>
test   %bp,%bp
je     1140 <colorbox+0x40>
mov    %ebp,%ebx
cs nopw 0x0(%rax,%rax,1)
nopl   0x0(%rax,%rax,1)
movzwl %ax,%esi
mov    %r8b,(%rsi)
add    $0x1,%eax
add    $0xffff,%bx
jne    11a0 <colorbox+0xa0>
jmp    1140 <colorbox+0x40>
pop    %rbx
pop    %rbp
ret

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

LLVM IR (-O2):
define void @colorbox(i8 zeroext %0, i8 zeroext %1, i8 zeroext %2, i8 zeroext %3, i8 zeroext %4) {
%6 = zext i8 %3 to i16
%7 = icmp eq i8 %3, 0
br i1 %7, label %60, label %8
8: ; preds = %5
%9 = zext i8 %0 to i16
%10 = or i16 %9, 22528
%11 = zext i8 %1 to i16
%12 = shl nuw nsw i16 %11, 5
%13 = add nuw nsw i16 %10, %12
%14 = sub i8 32, %2
%15 = zext i8 %2 to i16
%16 = icmp eq i8 %2, 0
%17 = zext i8 %14 to i16
%18 = add nsw i16 %15, -1
%19 = and i16 %15, 3
%20 = icmp ult i16 %18, 3
%21 = and i16 %15, 252
%22 = icmp eq i16 %19, 0
br label %23
23: ; preds = %8, %55
%24 = phi i16 [ %13, %8 ], [ %57, %55 ]
%25 = phi i16 [ 0, %8 ], [ %58, %55 ]
br i1 %16, label %55, label %26
26: ; preds = %23
br i1 %20, label %44, label %27
27: ; preds = %26, %27
%28 = phi i16 [ %41, %27 ], [ %24, %26 ]
%29 = phi i16 [ %42, %27 ], [ 0, %26 ]
%30 = zext i16 %28 to i64
%31 = inttoptr i64 %30 to i8*
store i8 %4, i8* %31
%32 = add i16 %28, 1
%33 = zext i16 %32 to i64
%34 = inttoptr i64 %33 to i8*
store i8 %4, i8* %34
%35 = add i16 %28, 2
%36 = zext i16 %35 to i64
%37 = inttoptr i64 %36 to i8*
store i8 %4, i8* %37
%38 = add i16 %28, 3
%39 = zext i16 %38 to i64
%40 = inttoptr i64 %39 to i8*
store i8 %4, i8* %40
%41 = add i16 %28, 4
%42 = add i16 %29, 4
%43 = icmp eq i16 %42, %21
br i1 %43, label %44, label %27
44: ; preds = %27, %26
%45 = phi i16 [ undef, %26 ], [ %41, %27 ]
%46 = phi i16 [ %24, %26 ], [ %41, %27 ]
br i1 %22, label %55, label %47
47: ; preds = %44, %47
%48 = phi i16 [ %52, %47 ], [ %46, %44 ]
%49 = phi i16 [ %53, %47 ], [ 0, %44 ]
%50 = zext i16 %48 to i64
%51 = inttoptr i64 %50 to i8*
store i8 %4, i8* %51
%52 = add i16 %48, 1
%53 = add i16 %49, 1
%54 = icmp eq i16 %53, %19
br i1 %54, label %55, label %47
55: ; preds = %44, %47, %23
%56 = phi i16 [ %24, %23 ], [ %45, %44 ], [ %52, %47 ]
%57 = add i16 %56, %17
%58 = add nuw nsw i16 %25, 1
%59 = icmp eq i16 %58, %6
br i1 %59, label %60, label %23
60: ; preds = %55, %5
ret void
}