void set_page_tables() {
  unsigned int pages_entry[1024 * 1024] __attribute__((aligned(4096)));
  unsigned int KERNEL_VIRTUAL_OFFSET = 0xC0000000;
  unsigned int KERNEL_FIRST_VIRTUAL_ADDRESS = 0xC0000000 >> 12;
  int numPageTables = 4;
  int numPagesInPageTable = 1024;
  int numPageTableEntriesInPageDirectory = 1024;
  int totalPages = numPageTables * numPagesInPageTable;
  unsigned int index = 0;
  unsigned int *pages_ptr =
      (unsigned int *)(pages_entry - KERNEL_VIRTUAL_OFFSET);
  unsigned int *page_table_ptr =
      (unsigned int *)(pages_entry - KERNEL_VIRTUAL_OFFSET);
  unsigned int positionAndFlags = 7;
  while (index < totalPages) {
    pages_ptr[index] = positionAndFlags;
    index = index + 1;
    positionAndFlags += 4096;
  }
  positionAndFlags = 7;
  index = KERNEL_FIRST_VIRTUAL_ADDRESS;
  unsigned int totalPagesLeft = KERNEL_FIRST_VIRTUAL_ADDRESS + totalPages;
  while (index < totalPagesLeft) {
    pages_ptr[index] = positionAndFlags;
    index = index + 1;
    positionAndFlags += 4096;
  }
  positionAndFlags = (unsigned int)&pages_ptr[0];
  positionAndFlags = positionAndFlags | 7;
  index = 0;
  while (index < numPageTableEntriesInPageDirectory) {
    page_table_ptr[index] = positionAndFlags;
    index = index + 1;
    positionAndFlags += 4096;
  }
}


x86 assembly (clang, -O0):
<set_page_tables>:
push   %rbp
mov    %rsp,%rbp
and    $0xfffffffffffff000,%rsp
sub    $0x402000,%rsp
movl   $0xc0000000,0xffc(%rsp)
movl   $0xc0000,0xff8(%rsp)
movl   $0x4,0xff4(%rsp)
movl   $0x400,0xff0(%rsp)
movl   $0x400,0xfec(%rsp)
mov    0xff4(%rsp),%eax
imul   0xff0(%rsp),%eax
mov    %eax,0xfe8(%rsp)
movl   $0x0,0xfe4(%rsp)
lea    0x1000(%rsp),%rax
mov    0xffc(%rsp),%ecx
mov    %ecx,%edx
xor    %ecx,%ecx
sub    %rdx,%rcx
shl    $0x2,%rcx
add    %rcx,%rax
mov    %rax,0xfd8(%rsp)
lea    0x1000(%rsp),%rax
mov    0xffc(%rsp),%ecx
mov    %ecx,%edx
xor    %ecx,%ecx
sub    %rdx,%rcx
shl    $0x2,%rcx
add    %rcx,%rax
mov    %rax,0xfd0(%rsp)
movl   $0x7,0xfcc(%rsp)
mov    0xfe4(%rsp),%eax
cmp    0xfe8(%rsp),%eax
jae    1215 <set_page_tables+0x115>
mov    0xfcc(%rsp),%edx
mov    0xfd8(%rsp),%rax
mov    0xfe4(%rsp),%ecx
mov    %edx,(%rax,%rcx,4)
mov    0xfe4(%rsp),%eax
add    $0x1,%eax
mov    %eax,0xfe4(%rsp)
mov    0xfcc(%rsp),%eax
add    $0x1000,%eax
mov    %eax,0xfcc(%rsp)
jmp    11bf <set_page_tables+0xbf>
movl   $0x7,0xfcc(%rsp)
mov    0xff8(%rsp),%eax
mov    %eax,0xfe4(%rsp)
mov    0xff8(%rsp),%eax
add    0xfe8(%rsp),%eax
mov    %eax,0xfc8(%rsp)
mov    0xfe4(%rsp),%eax
cmp    0xfc8(%rsp),%eax
jae    1299 <set_page_tables+0x199>
mov    0xfcc(%rsp),%edx
mov    0xfd8(%rsp),%rax
mov    0xfe4(%rsp),%ecx
mov    %edx,(%rax,%rcx,4)
mov    0xfe4(%rsp),%eax
add    $0x1,%eax
mov    %eax,0xfe4(%rsp)
mov    0xfcc(%rsp),%eax
add    $0x1000,%eax
mov    %eax,0xfcc(%rsp)
jmp    1243 <set_page_tables+0x143>
mov    0xfd8(%rsp),%rax
mov    %eax,0xfcc(%rsp)
mov    0xfcc(%rsp),%eax
or     $0x7,%eax
mov    %eax,0xfcc(%rsp)
movl   $0x0,0xfe4(%rsp)
mov    0xfe4(%rsp),%eax
cmp    0xfec(%rsp),%eax
jae    131a <set_page_tables+0x21a>
mov    0xfcc(%rsp),%edx
mov    0xfd0(%rsp),%rax
mov    0xfe4(%rsp),%ecx
mov    %edx,(%rax,%rcx,4)
mov    0xfe4(%rsp),%eax
add    $0x1,%eax
mov    %eax,0xfe4(%rsp)
mov    0xfcc(%rsp),%eax
add    $0x1000,%eax
mov    %eax,0xfcc(%rsp)
jmp    12c4 <set_page_tables+0x1c4>
mov    %rbp,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<set_page_tables>:
push   %rbp
mov    %rsp,%rbp
and    $0xfffffffffffff000,%rsp
sub    $0x401000,%rsp
movabs $0xfffffffd00000000,%rax
ff ff ff
lea    (%rsp,%rax,1),%rcx
movabs $0xfffffffd00000070,%rax
ff ff ff
add    %rsp,%rax
movdqa 0xecb(%rip),%xmm0
xor    %edx,%edx
movdqa 0xed0(%rip),%xmm8
movdqa 0xed7(%rip),%xmm9
movdqa 0xede(%rip),%xmm10
movdqa 0xee6(%rip),%xmm3
movdqa 0xeee(%rip),%xmm4
movdqa 0xef6(%rip),%xmm5
movdqa 0xefe(%rip),%xmm6
movdqa 0xf06(%rip),%xmm7
nopw   0x0(%rax,%rax,1)
movdqa %xmm0,%xmm1
paddd  %xmm8,%xmm1
movdqa %xmm0,-0x70(%rax,%rdx,4)
movdqa %xmm1,-0x60(%rax,%rdx,4)
movdqa %xmm0,%xmm1
paddd  %xmm9,%xmm1
movdqa %xmm0,%xmm2
paddd  %xmm10,%xmm2
movdqa %xmm1,-0x50(%rax,%rdx,4)
movdqa %xmm2,-0x40(%rax,%rdx,4)
movdqa %xmm0,%xmm1
paddd  %xmm3,%xmm1
movdqa %xmm0,%xmm2
paddd  %xmm4,%xmm2
movdqa %xmm1,-0x30(%rax,%rdx,4)
movdqa %xmm2,-0x20(%rax,%rdx,4)
movdqa %xmm0,%xmm1
paddd  %xmm5,%xmm1
movdqa %xmm0,%xmm2
paddd  %xmm6,%xmm2
movdqa %xmm1,-0x10(%rax,%rdx,4)
movdqa %xmm2,(%rax,%rdx,4)
add    $0x20,%rdx
paddd  %xmm7,%xmm0
cmp    $0x1000,%rdx
jne    1180 <set_page_tables+0x80>
movabs $0xfffffffd00300040,%rdx
ff ff ff
add    %rsp,%rdx
movdqa 0xdf0(%rip),%xmm0
xor    %esi,%esi
cs nopw 0x0(%rax,%rax,1)
nopl   0x0(%rax)
movdqa %xmm0,%xmm1
paddd  %xmm8,%xmm1
movdqa %xmm0,-0x40(%rdx,%rsi,4)
movdqa %xmm1,-0x30(%rdx,%rsi,4)
movdqa %xmm0,%xmm1
paddd  %xmm9,%xmm1
movdqa %xmm0,%xmm2
paddd  %xmm10,%xmm2
movdqa %xmm1,-0x20(%rdx,%rsi,4)
movdqa %xmm2,-0x10(%rdx,%rsi,4)
movdqa %xmm0,%xmm1
paddd  %xmm3,%xmm1
movdqa %xmm0,%xmm2
paddd  %xmm4,%xmm2
movdqa %xmm1,(%rdx,%rsi,4)
movdqa %xmm2,0x10(%rdx,%rsi,4)
movdqa %xmm0,%xmm1
paddd  %xmm5,%xmm1
movdqa %xmm0,%xmm2
paddd  %xmm6,%xmm2
movdqa %xmm1,0x20(%rdx,%rsi,4)
movdqa %xmm2,0x30(%rdx,%rsi,4)
add    $0x20,%rsi
paddd  %xmm7,%xmm0
cmp    $0x1000,%rsi
jne    1220 <set_page_tables+0x120>
or     $0x7,%ecx
movd   %ecx,%xmm0
pshufd $0x0,%xmm0,%xmm0
paddd  0xde1(%rip),%xmm0
xor    %ecx,%ecx
cs nopw 0x0(%rax,%rax,1)
nopl   0x0(%rax,%rax,1)
movdqa %xmm0,%xmm1
paddd  %xmm8,%xmm1
movdqa %xmm0,-0x70(%rax,%rcx,4)
movdqa %xmm1,-0x60(%rax,%rcx,4)
movdqa %xmm0,%xmm1
paddd  %xmm9,%xmm1
movdqa %xmm0,%xmm2
paddd  %xmm10,%xmm2
movdqa %xmm1,-0x50(%rax,%rcx,4)
movdqa %xmm2,-0x40(%rax,%rcx,4)
movdqa %xmm0,%xmm1
paddd  %xmm3,%xmm1
movdqa %xmm0,%xmm2
paddd  %xmm4,%xmm2
movdqa %xmm1,-0x30(%rax,%rcx,4)
movdqa %xmm2,-0x20(%rax,%rcx,4)
movdqa %xmm0,%xmm1
paddd  %xmm5,%xmm1
movdqa %xmm0,%xmm2
paddd  %xmm6,%xmm2
movdqa %xmm1,-0x10(%rax,%rcx,4)
movdqa %xmm2,(%rax,%rcx,4)
add    $0x20,%rcx
paddd  %xmm7,%xmm0
cmp    $0x400,%rcx
jne    12c0 <set_page_tables+0x1c0>
mov    %rbp,%rsp
pop    %rbp
ret

LLVM IR (-O0):
define void @set_page_tables() {
%1 = alloca [1048576 x i32]
%2 = alloca i32
%3 = alloca i32
%4 = alloca i32
%5 = alloca i32
%6 = alloca i32
%7 = alloca i32
%8 = alloca i32
%9 = alloca i32*
%10 = alloca i32*
%11 = alloca i32
%12 = alloca i32
store i32 -1073741824, i32* %2
store i32 786432, i32* %3
store i32 4, i32* %4
store i32 1024, i32* %5
store i32 1024, i32* %6
%13 = load i32, i32* %4
%14 = load i32, i32* %5
%15 = mul nsw i32 %13, %14
store i32 %15, i32* %7
store i32 0, i32* %8
%16 = getelementptr inbounds [1048576 x i32], [1048576 x i32]* %1, i64 0, i64 0
%17 = load i32, i32* %2
%18 = zext i32 %17 to i64
%19 = sub i64 0, %18
%20 = getelementptr inbounds i32, i32* %16, i64 %19
store i32* %20, i32** %9
%21 = getelementptr inbounds [1048576 x i32], [1048576 x i32]* %1, i64 0, i64 0
%22 = load i32, i32* %2
%23 = zext i32 %22 to i64
%24 = sub i64 0, %23
%25 = getelementptr inbounds i32, i32* %21, i64 %24
store i32* %25, i32** %10
store i32 7, i32* %11
br label %26
26: ; preds = %30, %0
%27 = load i32, i32* %8
%28 = load i32, i32* %7
%29 = icmp ult i32 %27, %28
br i1 %29, label %30, label %40
30: ; preds = %26
%31 = load i32, i32* %11
%32 = load i32*, i32** %9
%33 = load i32, i32* %8
%34 = zext i32 %33 to i64
%35 = getelementptr inbounds i32, i32* %32, i64 %34
store i32 %31, i32* %35
%36 = load i32, i32* %8
%37 = add i32 %36, 1
store i32 %37, i32* %8
%38 = load i32, i32* %11
%39 = add i32 %38, 4096
store i32 %39, i32* %11
br label %26
40: ; preds = %26
store i32 7, i32* %11
%41 = load i32, i32* %3
store i32 %41, i32* %8
%42 = load i32, i32* %3
%43 = load i32, i32* %7
%44 = add i32 %42, %43
store i32 %44, i32* %12
br label %45
45: ; preds = %49, %40
%46 = load i32, i32* %8
%47 = load i32, i32* %12
%48 = icmp ult i32 %46, %47
br i1 %48, label %49, label %59
49: ; preds = %45
%50 = load i32, i32* %11
%51 = load i32*, i32** %9
%52 = load i32, i32* %8
%53 = zext i32 %52 to i64
%54 = getelementptr inbounds i32, i32* %51, i64 %53
store i32 %50, i32* %54
%55 = load i32, i32* %8
%56 = add i32 %55, 1
store i32 %56, i32* %8
%57 = load i32, i32* %11
%58 = add i32 %57, 4096
store i32 %58, i32* %11
br label %45
59: ; preds = %45
%60 = load i32*, i32** %9
%61 = getelementptr inbounds i32, i32* %60, i64 0
%62 = ptrtoint i32* %61 to i32
store i32 %62, i32* %11
%63 = load i32, i32* %11
%64 = or i32 %63, 7
store i32 %64, i32* %11
store i32 0, i32* %8
br label %65
65: ; preds = %69, %59
%66 = load i32, i32* %8
%67 = load i32, i32* %6
%68 = icmp ult i32 %66, %67
br i1 %68, label %69, label %79
69: ; preds = %65
%70 = load i32, i32* %11
%71 = load i32*, i32** %10
%72 = load i32, i32* %8
%73 = zext i32 %72 to i64
%74 = getelementptr inbounds i32, i32* %71, i64 %73
store i32 %70, i32* %74
%75 = load i32, i32* %8
%76 = add i32 %75, 1
store i32 %76, i32* %8
%77 = load i32, i32* %11
%78 = add i32 %77, 4096
store i32 %78, i32* %11
br label %65
79: ; preds = %65
ret void
}

LLVM IR (-O2):
define void @set_page_tables() {
%1 = alloca [1048576 x i32]
%2 = bitcast [1048576 x i32]* %1 to i8*
%3 = getelementptr inbounds [1048576 x i32], [1048576 x i32]* %1, i64 0, i64 -3221225472
br label %4
4: ; preds = %4, %0
%5 = phi i64 [ 0, %0 ], [ %33, %4 ]
%6 = phi <4 x i32> [ <i32 7, i32 4103, i32 8199, i32 12295>, %0 ], [ %34, %4 ]
%7 = add <4 x i32> %6, <i32 16384, i32 16384, i32 16384, i32 16384>
%8 = getelementptr inbounds i32, i32* %3, i64 %5
%9 = bitcast i32* %8 to <4 x i32>*
store <4 x i32> %6, <4 x i32>* %9
%10 = getelementptr inbounds i32, i32* %8, i64 4
%11 = bitcast i32* %10 to <4 x i32>*
store <4 x i32> %7, <4 x i32>* %11
%12 = or i64 %5, 8
%13 = add <4 x i32> %6, <i32 32768, i32 32768, i32 32768, i32 32768>
%14 = add <4 x i32> %6, <i32 49152, i32 49152, i32 49152, i32 49152>
%15 = getelementptr inbounds i32, i32* %3, i64 %12
%16 = bitcast i32* %15 to <4 x i32>*
store <4 x i32> %13, <4 x i32>* %16
%17 = getelementptr inbounds i32, i32* %15, i64 4
%18 = bitcast i32* %17 to <4 x i32>*
store <4 x i32> %14, <4 x i32>* %18
%19 = or i64 %5, 16
%20 = add <4 x i32> %6, <i32 65536, i32 65536, i32 65536, i32 65536>
%21 = add <4 x i32> %6, <i32 81920, i32 81920, i32 81920, i32 81920>
%22 = getelementptr inbounds i32, i32* %3, i64 %19
%23 = bitcast i32* %22 to <4 x i32>*
store <4 x i32> %20, <4 x i32>* %23
%24 = getelementptr inbounds i32, i32* %22, i64 4
%25 = bitcast i32* %24 to <4 x i32>*
store <4 x i32> %21, <4 x i32>* %25
%26 = or i64 %5, 24
%27 = add <4 x i32> %6, <i32 98304, i32 98304, i32 98304, i32 98304>
%28 = add <4 x i32> %6, <i32 114688, i32 114688, i32 114688, i32 114688>
%29 = getelementptr inbounds i32, i32* %3, i64 %26
%30 = bitcast i32* %29 to <4 x i32>*
store <4 x i32> %27, <4 x i32>* %30
%31 = getelementptr inbounds i32, i32* %29, i64 4
%32 = bitcast i32* %31 to <4 x i32>*
store <4 x i32> %28, <4 x i32>* %32
%33 = add nuw nsw i64 %5, 32
%34 = add <4 x i32> %6, <i32 131072, i32 131072, i32 131072, i32 131072>
%35 = icmp eq i64 %33, 4096
br i1 %35, label %36, label %4
36: ; preds = %4, %36
%37 = phi i64 [ %66, %36 ], [ 0, %4 ]
%38 = phi <4 x i32> [ %67, %36 ], [ <i32 7, i32 4103, i32 8199, i32 12295>, %4 ]
%39 = add nuw nsw i64 %37, 786432
%40 = add <4 x i32> %38, <i32 16384, i32 16384, i32 16384, i32 16384>
%41 = getelementptr inbounds i32, i32* %3, i64 %39
%42 = bitcast i32* %41 to <4 x i32>*
store <4 x i32> %38, <4 x i32>* %42
%43 = getelementptr inbounds i32, i32* %41, i64 4
%44 = bitcast i32* %43 to <4 x i32>*
store <4 x i32> %40, <4 x i32>* %44
%45 = add <4 x i32> %38, <i32 32768, i32 32768, i32 32768, i32 32768>
%46 = add nuw nsw i64 %37, 786440
%47 = add <4 x i32> %38, <i32 49152, i32 49152, i32 49152, i32 49152>
%48 = getelementptr inbounds i32, i32* %3, i64 %46
%49 = bitcast i32* %48 to <4 x i32>*
store <4 x i32> %45, <4 x i32>* %49
%50 = getelementptr inbounds i32, i32* %48, i64 4
%51 = bitcast i32* %50 to <4 x i32>*
store <4 x i32> %47, <4 x i32>* %51
%52 = add <4 x i32> %38, <i32 65536, i32 65536, i32 65536, i32 65536>
%53 = add nuw nsw i64 %37, 786448
%54 = add <4 x i32> %38, <i32 81920, i32 81920, i32 81920, i32 81920>
%55 = getelementptr inbounds i32, i32* %3, i64 %53
%56 = bitcast i32* %55 to <4 x i32>*
store <4 x i32> %52, <4 x i32>* %56
%57 = getelementptr inbounds i32, i32* %55, i64 4
%58 = bitcast i32* %57 to <4 x i32>*
store <4 x i32> %54, <4 x i32>* %58
%59 = add <4 x i32> %38, <i32 98304, i32 98304, i32 98304, i32 98304>
%60 = add nuw nsw i64 %37, 786456
%61 = add <4 x i32> %38, <i32 114688, i32 114688, i32 114688, i32 114688>
%62 = getelementptr inbounds i32, i32* %3, i64 %60
%63 = bitcast i32* %62 to <4 x i32>*
store <4 x i32> %59, <4 x i32>* %63
%64 = getelementptr inbounds i32, i32* %62, i64 4
%65 = bitcast i32* %64 to <4 x i32>*
store <4 x i32> %61, <4 x i32>* %65
%66 = add nuw nsw i64 %37, 32
%67 = add <4 x i32> %38, <i32 131072, i32 131072, i32 131072, i32 131072>
%68 = icmp eq i64 %66, 4096
br i1 %68, label %69, label %36
69: ; preds = %36
%70 = ptrtoint i32* %3 to i64
%71 = trunc i64 %70 to i32
%72 = or i32 %71, 7
%73 = insertelement <4 x i32> poison, i32 %72, i64 0
%74 = shufflevector <4 x i32> %73, <4 x i32> poison, <4 x i32> zeroinitializer
%75 = add <4 x i32> %74, <i32 0, i32 4096, i32 8192, i32 12288>
br label %76
76: ; preds = %76, %69
%77 = phi i64 [ 0, %69 ], [ %105, %76 ]
%78 = phi <4 x i32> [ %75, %69 ], [ %106, %76 ]
%79 = add <4 x i32> %78, <i32 16384, i32 16384, i32 16384, i32 16384>
%80 = getelementptr inbounds i32, i32* %3, i64 %77
%81 = bitcast i32* %80 to <4 x i32>*
store <4 x i32> %78, <4 x i32>* %81
%82 = getelementptr inbounds i32, i32* %80, i64 4
%83 = bitcast i32* %82 to <4 x i32>*
store <4 x i32> %79, <4 x i32>* %83
%84 = or i64 %77, 8
%85 = add <4 x i32> %78, <i32 32768, i32 32768, i32 32768, i32 32768>
%86 = add <4 x i32> %78, <i32 49152, i32 49152, i32 49152, i32 49152>
%87 = getelementptr inbounds i32, i32* %3, i64 %84
%88 = bitcast i32* %87 to <4 x i32>*
store <4 x i32> %85, <4 x i32>* %88
%89 = getelementptr inbounds i32, i32* %87, i64 4
%90 = bitcast i32* %89 to <4 x i32>*
store <4 x i32> %86, <4 x i32>* %90
%91 = or i64 %77, 16
%92 = add <4 x i32> %78, <i32 65536, i32 65536, i32 65536, i32 65536>
%93 = add <4 x i32> %78, <i32 81920, i32 81920, i32 81920, i32 81920>
%94 = getelementptr inbounds i32, i32* %3, i64 %91
%95 = bitcast i32* %94 to <4 x i32>*
store <4 x i32> %92, <4 x i32>* %95
%96 = getelementptr inbounds i32, i32* %94, i64 4
%97 = bitcast i32* %96 to <4 x i32>*
store <4 x i32> %93, <4 x i32>* %97
%98 = or i64 %77, 24
%99 = add <4 x i32> %78, <i32 98304, i32 98304, i32 98304, i32 98304>
%100 = add <4 x i32> %78, <i32 114688, i32 114688, i32 114688, i32 114688>
%101 = getelementptr inbounds i32, i32* %3, i64 %98
%102 = bitcast i32* %101 to <4 x i32>*
store <4 x i32> %99, <4 x i32>* %102
%103 = getelementptr inbounds i32, i32* %101, i64 4
%104 = bitcast i32* %103 to <4 x i32>*
store <4 x i32> %100, <4 x i32>* %104
%105 = add nuw nsw i64 %77, 32
%106 = add <4 x i32> %78, <i32 131072, i32 131072, i32 131072, i32 131072>
%107 = icmp eq i64 %105, 1024
br i1 %107, label %108, label %76
108: ; preds = %76
ret void
}