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


x86 assembly (clang, -O0):
<sbrk>:
push   %rbp
mov    %rsp,%rbp
mov    %edi,-0xc(%rbp)
cmpq   $0x0,0x2f19(%rip)
jne    1123 <sbrk+0x23>
mov    0x2ecc(%rip),%rax
mov    %rax,0x2f05(%rip)
cmpl   $0x0,-0xc(%rbp)
jne    113d <sbrk+0x3d>
mov    0x2ef4(%rip),%rax
mov    %rax,-0x8(%rbp)
jmp    11b4 <sbrk+0xb4>
mov    0x2ee4(%rip),%rax
mov    $0x8,%ecx
cqto
idiv   %rcx
cmp    $0x0,%rdx
je     118a <sbrk+0x8a>
mov    0x2ec9(%rip),%rax
mov    %rax,-0x20(%rbp)
mov    0x2ebe(%rip),%rax
mov    $0x8,%ecx
cqto
idiv   %rcx
mov    -0x20(%rbp),%rax
mov    $0x8,%ecx
sub    %rdx,%rcx
add    %rcx,%rax
mov    %rax,0x2e9e(%rip)
mov    0x2e97(%rip),%rax
mov    %rax,-0x18(%rbp)
mov    -0xc(%rbp),%ecx
mov    0x2e89(%rip),%rax
movslq %ecx,%rcx
add    %rcx,%rax
mov    %rax,0x2e7c(%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     1145 <sbrk+0x45>
test   %edi,%edi
je     1144 <sbrk+0x44>
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
movslq %edi,%rcx
add    %rax,%rcx
mov    %rcx,0x2ee4(%rip)
ret
mov    0x2e9c(%rip),%rax
mov    %rax,0x2ed5(%rip)
test   %edi,%edi
jne    1110 <sbrk+0x10>
jmp    1144 <sbrk+0x44>

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

LLVM IR (-O2):
@sbrk.ptr = internal unnamed_addr global i8* null
@_end = external global i8
define i8* @sbrk(i32 %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 i32 %0, 0
br i1 %7, label %17, 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 = sext i32 %0 to i64
%16 = getelementptr inbounds i8, i8* %14, i64 %15
store i8* %16, i8** @sbrk.ptr
br label %17
17: ; preds = %5, %8
%18 = phi i8* [ %14, %8 ], [ %6, %5 ]
ret i8* %18
}