void vga_clear(char bgcolor) {
  for (int i = 0; i < (80 * 25); i++) {
    ((unsigned short *)(0xB8000 + 0xffff800000000000ULL))[i] = bgcolor | ' ';
  }
}


x86 assembly (clang, -O0):
<vga_clear>:
push   %rbp
mov    %rsp,%rbp
mov    %dil,%al
mov    %al,-0x1(%rbp)
movl   $0x0,-0x8(%rbp)
cmpl   $0x7d0,-0x8(%rbp)
jge    1148 <vga_clear+0x48>
movsbl -0x1(%rbp),%eax
or     $0x20,%eax
mov    %ax,%dx
movslq -0x8(%rbp),%rcx
movabs $0xffff8000000b8000,%rax
80 ff ff
mov    %dx,(%rax,%rcx,2)
mov    -0x8(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x8(%rbp)
jmp    1111 <vga_clear+0x11>
pop    %rbp
ret

x86 assembly (clang, -O2):
<vga_clear>:
movabs $0xffff8000000b8090,%rax
80 ff ff
or     $0x20,%dil
movsbl %dil,%ecx
movd   %ecx,%xmm0
pshuflw $0x0,%xmm0,%xmm0
pshufd $0x0,%xmm0,%xmm0
xor    %ecx,%ecx
cs nopw 0x0(%rax,%rax,1)
nopl   0x0(%rax)
movdqa %xmm0,-0x90(%rax,%rcx,2)
ff ff
movdqa %xmm0,-0x80(%rax,%rcx,2)
movdqa %xmm0,-0x70(%rax,%rcx,2)
movdqa %xmm0,-0x60(%rax,%rcx,2)
movdqa %xmm0,-0x50(%rax,%rcx,2)
movdqa %xmm0,-0x40(%rax,%rcx,2)
movdqa %xmm0,-0x30(%rax,%rcx,2)
movdqa %xmm0,-0x20(%rax,%rcx,2)
movdqa %xmm0,-0x10(%rax,%rcx,2)
movdqa %xmm0,(%rax,%rcx,2)
add    $0x50,%rcx
cmp    $0x7d0,%rcx
jne    1130 <vga_clear+0x30>
ret

LLVM IR (-O0):
define void @vga_clear(i8 signext %0) {
%2 = alloca i8
%3 = alloca i32
store i8 %0, i8* %2
store i32 0, i32* %3
br label %4
4: ; preds = %15, %1
%5 = load i32, i32* %3
%6 = icmp slt i32 %5, 2000
br i1 %6, label %7, label %18
7: ; preds = %4
%8 = load i8, i8* %2
%9 = sext i8 %8 to i32
%10 = or i32 %9, 32
%11 = trunc i32 %10 to i16
%12 = load i32, i32* %3
%13 = sext i32 %12 to i64
%14 = getelementptr inbounds i16, i16* inttoptr (i64 -140737487601664 to i16*), i64 %13
store i16 %11, i16* %14
br label %15
15: ; preds = %7
%16 = load i32, i32* %3
%17 = add nsw i32 %16, 1
store i32 %17, i32* %3
br label %4
18: ; preds = %4
ret void
}

LLVM IR (-O2):
define void @vga_clear(i8 signext %0) {
%2 = or i8 %0, 32
%3 = sext i8 %2 to i16
%4 = insertelement <8 x i16> poison, i16 %3, i64 0
%5 = shufflevector <8 x i16> %4, <8 x i16> poison, <8 x i32> zeroinitializer
%6 = insertelement <8 x i16> poison, i16 %3, i64 0
%7 = shufflevector <8 x i16> %6, <8 x i16> poison, <8 x i32> zeroinitializer
br label %8
8: ; preds = %8, %1
%9 = phi i64 [ 0, %1 ], [ %34, %8 ]
%10 = getelementptr inbounds i16, i16* inttoptr (i64 -140737487601664 to i16*), i64 %9
%11 = bitcast i16* %10 to <8 x i16>*
store <8 x i16> %5, <8 x i16>* %11
%12 = getelementptr inbounds i16, i16* %10, i64 8
%13 = bitcast i16* %12 to <8 x i16>*
store <8 x i16> %7, <8 x i16>* %13
%14 = add nuw nsw i64 %9, 16
%15 = getelementptr inbounds i16, i16* inttoptr (i64 -140737487601664 to i16*), i64 %14
%16 = bitcast i16* %15 to <8 x i16>*
store <8 x i16> %5, <8 x i16>* %16
%17 = getelementptr inbounds i16, i16* %15, i64 8
%18 = bitcast i16* %17 to <8 x i16>*
store <8 x i16> %7, <8 x i16>* %18
%19 = add nuw nsw i64 %9, 32
%20 = getelementptr inbounds i16, i16* inttoptr (i64 -140737487601664 to i16*), i64 %19
%21 = bitcast i16* %20 to <8 x i16>*
store <8 x i16> %5, <8 x i16>* %21
%22 = getelementptr inbounds i16, i16* %20, i64 8
%23 = bitcast i16* %22 to <8 x i16>*
store <8 x i16> %7, <8 x i16>* %23
%24 = add nuw nsw i64 %9, 48
%25 = getelementptr inbounds i16, i16* inttoptr (i64 -140737487601664 to i16*), i64 %24
%26 = bitcast i16* %25 to <8 x i16>*
store <8 x i16> %5, <8 x i16>* %26
%27 = getelementptr inbounds i16, i16* %25, i64 8
%28 = bitcast i16* %27 to <8 x i16>*
store <8 x i16> %7, <8 x i16>* %28
%29 = add nuw nsw i64 %9, 64
%30 = getelementptr inbounds i16, i16* inttoptr (i64 -140737487601664 to i16*), i64 %29
%31 = bitcast i16* %30 to <8 x i16>*
store <8 x i16> %5, <8 x i16>* %31
%32 = getelementptr inbounds i16, i16* %30, i64 8
%33 = bitcast i16* %32 to <8 x i16>*
store <8 x i16> %7, <8 x i16>* %33
%34 = add nuw nsw i64 %9, 80
%35 = icmp eq i64 %34, 2000
br i1 %35, label %36, label %8
36: ; preds = %8
ret void
}