void HariMain(void) {
  int i;
  char *p;
  for (i = 0xa0000; i <= 0xaffff; i++) {
    p = i;
    *p = i & 0x0f;
  }
  for (;;) {
    io_hlt();
  }
}


x86 assembly (clang, -O0):
<HariMain>:
push   %rbp
mov    %rsp,%rbp
sub    $0x10,%rsp
movl   $0xa0000,-0x4(%rbp)
cmpl   $0xaffff,-0x4(%rbp)
jg     1150 <HariMain+0x40>
movslq -0x4(%rbp),%rax
mov    %rax,-0x10(%rbp)
mov    -0x4(%rbp),%eax
and    $0xf,%eax
mov    %al,%cl
mov    -0x10(%rbp),%rax
mov    %cl,(%rax)
mov    -0x4(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x4(%rbp)
jmp    111f <HariMain+0xf>
jmp    1155 <HariMain+0x45>
mov    $0x0,%al
call   1030 <io_hlt@plt>
jmp    1155 <HariMain+0x45>

x86 assembly (clang, -O2):
<HariMain>:
push   %rax
mov    $0xa0000,%eax
cs nopw 0x0(%rax,%rax,1)
mov    %eax,%ecx
and    $0x8,%cl
mov    %cl,(%rax)
lea    0x1(%rax),%ecx
and    $0x9,%cl
mov    %cl,0x1(%rax)
lea    0x2(%rax),%ecx
and    $0xa,%cl
mov    %cl,0x2(%rax)
lea    0x3(%rax),%ecx
and    $0xb,%cl
mov    %cl,0x3(%rax)
lea    0x4(%rax),%ecx
and    $0xc,%cl
mov    %cl,0x4(%rax)
lea    0x5(%rax),%ecx
and    $0xd,%cl
mov    %cl,0x5(%rax)
lea    0x6(%rax),%ecx
and    $0xe,%cl
mov    %cl,0x6(%rax)
lea    0x7(%rax),%ecx
and    $0xf,%cl
mov    %cl,0x7(%rax)
add    $0x8,%rax
cmp    $0xb0000,%rax
jne    1120 <HariMain+0x10>
cs nopw 0x0(%rax,%rax,1)
nopl   0x0(%rax)
xor    %eax,%eax
call   1030 <io_hlt@plt>
jmp    1180 <HariMain+0x70>

LLVM IR (-O0):
define void @HariMain() {
%1 = alloca i32
%2 = alloca i8*
store i32 655360, i32* %1
br label %3
3: ; preds = %14, %0
%4 = load i32, i32* %1
%5 = icmp sle i32 %4, 720895
br i1 %5, label %6, label %17
6: ; preds = %3
%7 = load i32, i32* %1
%8 = sext i32 %7 to i64
%9 = inttoptr i64 %8 to i8*
store i8* %9, i8** %2
%10 = load i32, i32* %1
%11 = and i32 %10, 15
%12 = trunc i32 %11 to i8
%13 = load i8*, i8** %2
store i8 %12, i8* %13
br label %14
14: ; preds = %6
%15 = load i32, i32* %1
%16 = add nsw i32 %15, 1
store i32 %16, i32* %1
br label %3
17: ; preds = %3
br label %18
18: ; preds = %18, %17
%19 = call i32 (...) @io_hlt()
br label %18
}

LLVM IR (-O2):
define void @HariMain() {
br label %1
1: ; preds = %1, %0
%2 = phi i64 [ 655360, %0 ], [ %34, %1 ]
%3 = inttoptr i64 %2 to i8*
%4 = trunc i64 %2 to i8
%5 = and i8 %4, 8
store i8 %5, i8* %3
%6 = or i64 %2, 1
%7 = inttoptr i64 %6 to i8*
%8 = trunc i64 %6 to i8
%9 = and i8 %8, 9
store i8 %9, i8* %7
%10 = or i64 %2, 2
%11 = inttoptr i64 %10 to i8*
%12 = trunc i64 %10 to i8
%13 = and i8 %12, 10
store i8 %13, i8* %11
%14 = or i64 %2, 3
%15 = inttoptr i64 %14 to i8*
%16 = trunc i64 %14 to i8
%17 = and i8 %16, 11
store i8 %17, i8* %15
%18 = or i64 %2, 4
%19 = inttoptr i64 %18 to i8*
%20 = trunc i64 %18 to i8
%21 = and i8 %20, 12
store i8 %21, i8* %19
%22 = or i64 %2, 5
%23 = inttoptr i64 %22 to i8*
%24 = trunc i64 %22 to i8
%25 = and i8 %24, 13
store i8 %25, i8* %23
%26 = or i64 %2, 6
%27 = inttoptr i64 %26 to i8*
%28 = trunc i64 %26 to i8
%29 = and i8 %28, 14
store i8 %29, i8* %27
%30 = or i64 %2, 7
%31 = inttoptr i64 %30 to i8*
%32 = trunc i64 %30 to i8
%33 = and i8 %32, 15
store i8 %33, i8* %31
%34 = add nuw nsw i64 %2, 8
%35 = icmp eq i64 %34, 720896
br i1 %35, label %36, label %1
36: ; preds = %1, %36
%37 = tail call i32 (...) @io_hlt()
br label %36
}