long sbrk(unsigned long amt) {
  extern char _end;
  static char *ptr = 0;
  char *res;
  if (ptr == 0)
    ptr = &_end;
  if (amt == 0)
    return (long)ptr;
  if (((long)ptr) % 8)
    ptr = ptr + (8 - (((long)(ptr)) % 8));
  res = ptr;
  ptr += amt;
  return (long)res;
}


x86 assembly (clang, -O0):
<sbrk>:
push   %rbp
mov    %rsp,%rbp
mov    %rdi,-0x10(%rbp)
cmpq   $0x0,0x2f18(%rip)
jne    1124 <sbrk+0x24>
mov    0x2ecb(%rip),%rax
mov    %rax,0x2f04(%rip)
cmpq   $0x0,-0x10(%rbp)
jne    113f <sbrk+0x3f>
mov    0x2ef2(%rip),%rax
mov    %rax,-0x8(%rbp)
jmp    11b1 <sbrk+0xb1>
mov    0x2ee2(%rip),%rax
mov    $0x8,%ecx
cqto
idiv   %rcx
cmp    $0x0,%rdx
je     118c <sbrk+0x8c>
mov    0x2ec7(%rip),%rax
mov    %rax,-0x20(%rbp)
mov    0x2ebc(%rip),%rax
mov    $0x8,%ecx
cqto
idiv   %rcx
mov    -0x20(%rbp),%rax
mov    $0x8,%ecx
sub    %rdx,%rcx
add    %rcx,%rax
mov    %rax,0x2e9c(%rip)
mov    0x2e95(%rip),%rax
mov    %rax,-0x18(%rbp)
mov    -0x10(%rbp),%rax
add    0x2e86(%rip),%rax
mov    %rax,0x2e7f(%rip)
mov    -0x18(%rbp),%rax
mov    %rax,-0x8(%rbp)
mov    -0x8(%rbp),%rax
pop    %rbp
ret

x86 assembly (clang, -O2):
<sbrk>:
mov    0x2f21(%rip),%rax
test   %rax,%rax
je     1143 <sbrk+0x43>
test   %rdi,%rdi
je     1142 <sbrk+0x42>
lea    0x7(%rax),%rcx
test   %rax,%rax
cmovns %rax,%rcx
and    $0xfffffffffffffff8,%rcx
mov    %rax,%rdx
sub    %rcx,%rdx
mov    $0x8,%ecx
sub    %rdx,%rcx
test   %rdx,%rdx
cmove  %rdx,%rcx
add    %rcx,%rax
add    %rax,%rdi
mov    %rdi,0x2ee6(%rip)
ret
mov    0x2e9e(%rip),%rax
mov    %rax,0x2ed7(%rip)
test   %rdi,%rdi
jne    1111 <sbrk+0x11>
jmp    1142 <sbrk+0x42>

LLVM IR (-O0):
@sbrk.ptr = internal global i8* null
@_end = external global i8
define i64 @sbrk(i64 %0) {
%2 = alloca i64
%3 = alloca i64
%4 = alloca i8*
store i64 %0, i64* %3
%5 = load i8*, i8** @sbrk.ptr
%6 = icmp eq i8* %5, null
br i1 %6, label %7, label %8
7: ; preds = %1
store i8* @_end, i8** @sbrk.ptr
br label %8
8: ; preds = %7, %1
%9 = load i64, i64* %3
%10 = icmp eq i64 %9, 0
br i1 %10, label %11, label %14
11: ; preds = %8
%12 = load i8*, i8** @sbrk.ptr
%13 = ptrtoint i8* %12 to i64
store i64 %13, i64* %2
br label %33
14: ; preds = %8
%15 = load i8*, i8** @sbrk.ptr
%16 = ptrtoint i8* %15 to i64
%17 = srem i64 %16, 8
%18 = icmp ne i64 %17, 0
br i1 %18, label %19, label %26
19: ; preds = %14
%20 = load i8*, i8** @sbrk.ptr
%21 = load i8*, i8** @sbrk.ptr
%22 = ptrtoint i8* %21 to i64
%23 = srem i64 %22, 8
%24 = sub nsw i64 8, %23
%25 = getelementptr inbounds i8, i8* %20, i64 %24
store i8* %25, i8** @sbrk.ptr
br label %26
26: ; preds = %19, %14
%27 = load i8*, i8** @sbrk.ptr
store i8* %27, i8** %4
%28 = load i64, i64* %3
%29 = load i8*, i8** @sbrk.ptr
%30 = getelementptr inbounds i8, i8* %29, i64 %28
store i8* %30, i8** @sbrk.ptr
%31 = load i8*, i8** %4
%32 = ptrtoint i8* %31 to i64
store i64 %32, i64* %2
br label %33
33: ; preds = %26, %11
%34 = load i64, i64* %2
ret i64 %34
}

LLVM IR (-O2):
@sbrk.ptr = internal unnamed_addr global i8* null
@_end = external global i8
define i64 @sbrk(i64 %0) {
%2 = load i8*, i8** @sbrk.ptr
%3 = icmp eq i8* %2, null
br i1 %3, label %4, label %5
4: ; preds = %1
store i8* @_end, i8** @sbrk.ptr
br label %5
5: ; preds = %4, %1
%6 = phi i8* [ @_end, %4 ], [ %2, %1 ]
%7 = icmp eq i64 %0, 0
br i1 %7, label %16, label %8
8: ; preds = %5
%9 = ptrtoint i8* %6 to i64
%10 = srem i64 %9, 8
%11 = icmp eq i64 %10, 0
%12 = sub nsw i64 8, %10
%13 = select i1 %11, i64 0, i64 %12
%14 = getelementptr i8, i8* %6, i64 %13
%15 = getelementptr inbounds i8, i8* %14, i64 %0
store i8* %15, i8** @sbrk.ptr
br label %16
16: ; preds = %5, %8
%17 = phi i8* [ %14, %8 ], [ %6, %5 ]
%18 = ptrtoint i8* %17 to i64
ret i64 %18
}