void ShiftDisplayUpOneLine() {
  unsigned short *DisplayMemoryPtr = (unsigned short *)0xB8000;
  unsigned int i;
  for (i = 0; i < 2000 - 80; i++) {
    DisplayMemoryPtr[i] = DisplayMemoryPtr[i + 80];
  }
  for (i = 2000 - 1; i > 2000 - 80; i--) {
    DisplayMemoryPtr[i] = 0x0000;
  }
}


x86 assembly (clang, -O0):
<ShiftDisplayUpOneLine>:
push   %rbp
mov    %rsp,%rbp
mov    $0xb8000,%eax
mov    %rax,-0x8(%rbp)
movl   $0x0,-0xc(%rbp)
cmpl   $0x780,-0xc(%rbp)
jae    114a <ShiftDisplayUpOneLine+0x4a>
mov    -0x8(%rbp),%rax
mov    -0xc(%rbp),%ecx
add    $0x50,%ecx
mov    %ecx,%ecx
mov    (%rax,%rcx,2),%dx
mov    -0x8(%rbp),%rax
mov    -0xc(%rbp),%ecx
mov    %dx,(%rax,%rcx,2)
mov    -0xc(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0xc(%rbp)
jmp    1114 <ShiftDisplayUpOneLine+0x14>
movl   $0x7cf,-0xc(%rbp)
cmpl   $0x780,-0xc(%rbp)
jbe    1179 <ShiftDisplayUpOneLine+0x79>
mov    -0x8(%rbp),%rax
mov    -0xc(%rbp),%ecx
movw   $0x0,(%rax,%rcx,2)
mov    -0xc(%rbp),%eax
add    $0xffffffff,%eax
mov    %eax,-0xc(%rbp)
jmp    1151 <ShiftDisplayUpOneLine+0x51>
pop    %rbp
ret

x86 assembly (clang, -O2):
<ShiftDisplayUpOneLine>:
mov    $0xb8110,%eax
xor    %ecx,%ecx
nopw   0x0(%rax,%rax,1)
movaps -0x70(%rax,%rcx,2),%xmm0
movaps -0x60(%rax,%rcx,2),%xmm1
movaps -0x50(%rax,%rcx,2),%xmm2
movaps -0x40(%rax,%rcx,2),%xmm3
movaps %xmm0,-0x110(%rax,%rcx,2)
ff
movaps %xmm1,-0x100(%rax,%rcx,2)
ff
movaps %xmm2,-0xf0(%rax,%rcx,2)
ff
movaps %xmm3,-0xe0(%rax,%rcx,2)
ff
movaps -0x30(%rax,%rcx,2),%xmm0
movaps -0x20(%rax,%rcx,2),%xmm1
movaps %xmm0,-0xd0(%rax,%rcx,2)
ff
movaps %xmm1,-0xc0(%rax,%rcx,2)
ff
movaps -0x10(%rax,%rcx,2),%xmm0
movaps (%rax,%rcx,2),%xmm1
movaps %xmm0,-0xb0(%rax,%rcx,2)
ff
movaps %xmm1,-0xa0(%rax,%rcx,2)
ff
add    $0x40,%rcx
cmp    $0x780,%rcx
jne    1110 <ShiftDisplayUpOneLine+0x10>
xorps  %xmm0,%xmm0
movups %xmm0,0xb8f90
movups %xmm0,0xb8f82
movups %xmm0,0xb8f72
movups %xmm0,0xb8f62
movups %xmm0,0xb8f52
movups %xmm0,0xb8f42
movups %xmm0,0xb8f32
movups %xmm0,0xb8f22
movups %xmm0,0xb8f12
movups %xmm0,0xb8f02
ret

LLVM IR (-O0):
define void @ShiftDisplayUpOneLine() {
%1 = alloca i16*
%2 = alloca i32
store i16* inttoptr (i64 753664 to i16*), i16** %1
store i32 0, i32* %2
br label %3
3: ; preds = %17, %0
%4 = load i32, i32* %2
%5 = icmp ult i32 %4, 1920
br i1 %5, label %6, label %20
6: ; preds = %3
%7 = load i16*, i16** %1
%8 = load i32, i32* %2
%9 = add i32 %8, 80
%10 = zext i32 %9 to i64
%11 = getelementptr inbounds i16, i16* %7, i64 %10
%12 = load i16, i16* %11
%13 = load i16*, i16** %1
%14 = load i32, i32* %2
%15 = zext i32 %14 to i64
%16 = getelementptr inbounds i16, i16* %13, i64 %15
store i16 %12, i16* %16
br label %17
17: ; preds = %6
%18 = load i32, i32* %2
%19 = add i32 %18, 1
store i32 %19, i32* %2
br label %3
20: ; preds = %3
store i32 1999, i32* %2
br label %21
21: ; preds = %29, %20
%22 = load i32, i32* %2
%23 = icmp ugt i32 %22, 1920
br i1 %23, label %24, label %32
24: ; preds = %21
%25 = load i16*, i16** %1
%26 = load i32, i32* %2
%27 = zext i32 %26 to i64
%28 = getelementptr inbounds i16, i16* %25, i64 %27
store i16 0, i16* %28
br label %29
29: ; preds = %24
%30 = load i32, i32* %2
%31 = add i32 %30, -1
store i32 %31, i32* %2
br label %21
32: ; preds = %21
ret void
}

LLVM IR (-O2):
define void @ShiftDisplayUpOneLine() {
br label %1
1: ; preds = %1, %0
%2 = phi i64 [ 0, %0 ], [ %50, %1 ]
%3 = add nuw nsw i64 %2, 80
%4 = getelementptr inbounds i16, i16* inttoptr (i64 753664 to i16*), i64 %3
%5 = bitcast i16* %4 to <8 x i16>*
%6 = load <8 x i16>, <8 x i16>* %5
%7 = getelementptr inbounds i16, i16* %4, i64 8
%8 = bitcast i16* %7 to <8 x i16>*
%9 = load <8 x i16>, <8 x i16>* %8
%10 = getelementptr inbounds i16, i16* inttoptr (i64 753664 to i16*), i64 %2
%11 = bitcast i16* %10 to <8 x i16>*
store <8 x i16> %6, <8 x i16>* %11
%12 = getelementptr inbounds i16, i16* %10, i64 8
%13 = bitcast i16* %12 to <8 x i16>*
store <8 x i16> %9, <8 x i16>* %13
%14 = or i64 %2, 16
%15 = add nuw nsw i64 %2, 96
%16 = getelementptr inbounds i16, i16* inttoptr (i64 753664 to i16*), i64 %15
%17 = bitcast i16* %16 to <8 x i16>*
%18 = load <8 x i16>, <8 x i16>* %17
%19 = getelementptr inbounds i16, i16* %16, i64 8
%20 = bitcast i16* %19 to <8 x i16>*
%21 = load <8 x i16>, <8 x i16>* %20
%22 = getelementptr inbounds i16, i16* inttoptr (i64 753664 to i16*), i64 %14
%23 = bitcast i16* %22 to <8 x i16>*
store <8 x i16> %18, <8 x i16>* %23
%24 = getelementptr inbounds i16, i16* %22, i64 8
%25 = bitcast i16* %24 to <8 x i16>*
store <8 x i16> %21, <8 x i16>* %25
%26 = or i64 %2, 32
%27 = add nuw nsw i64 %2, 112
%28 = getelementptr inbounds i16, i16* inttoptr (i64 753664 to i16*), i64 %27
%29 = bitcast i16* %28 to <8 x i16>*
%30 = load <8 x i16>, <8 x i16>* %29
%31 = getelementptr inbounds i16, i16* %28, i64 8
%32 = bitcast i16* %31 to <8 x i16>*
%33 = load <8 x i16>, <8 x i16>* %32
%34 = getelementptr inbounds i16, i16* inttoptr (i64 753664 to i16*), i64 %26
%35 = bitcast i16* %34 to <8 x i16>*
store <8 x i16> %30, <8 x i16>* %35
%36 = getelementptr inbounds i16, i16* %34, i64 8
%37 = bitcast i16* %36 to <8 x i16>*
store <8 x i16> %33, <8 x i16>* %37
%38 = or i64 %2, 48
%39 = add nuw nsw i64 %2, 128
%40 = getelementptr inbounds i16, i16* inttoptr (i64 753664 to i16*), i64 %39
%41 = bitcast i16* %40 to <8 x i16>*
%42 = load <8 x i16>, <8 x i16>* %41
%43 = getelementptr inbounds i16, i16* %40, i64 8
%44 = bitcast i16* %43 to <8 x i16>*
%45 = load <8 x i16>, <8 x i16>* %44
%46 = getelementptr inbounds i16, i16* inttoptr (i64 753664 to i16*), i64 %38
%47 = bitcast i16* %46 to <8 x i16>*
store <8 x i16> %42, <8 x i16>* %47
%48 = getelementptr inbounds i16, i16* %46, i64 8
%49 = bitcast i16* %48 to <8 x i16>*
store <8 x i16> %45, <8 x i16>* %49
%50 = add nuw nsw i64 %2, 64
%51 = icmp eq i64 %50, 1920
br i1 %51, label %52, label %1
52: ; preds = %1
ret void
}