int syscall(unsigned long rcv, unsigned long flags, unsigned long msg0,
            unsigned long msg1, unsigned long *reply_rcv,
            unsigned long *reply_flags, unsigned long *reply_msg0,
            unsigned long *reply_msg1) {
  __asm__ volatile("int $0x80\n\t"
                   : "=a"(*reply_rcv), "=b"(*reply_flags), "=c"(*reply_msg0),
                     "=d"(*reply_msg1)
                   : "0"(rcv), "1"(flags), "2"(msg0), "3"(msg1));
  return *reply_flags & 0x1 ? (int)*reply_msg0 : 0;
}


x86 assembly (clang, -O0):
<syscall>:
push   %rbp
mov    %rsp,%rbp
push   %rbx
mov    0x18(%rbp),%rax
mov    0x10(%rbp),%rax
mov    %rdi,-0x10(%rbp)
mov    %rsi,-0x18(%rbp)
mov    %rdx,-0x20(%rbp)
mov    %rcx,-0x28(%rbp)
mov    %r8,-0x30(%rbp)
mov    %r9,-0x38(%rbp)
mov    -0x30(%rbp),%r8
mov    -0x38(%rbp),%rdi
mov    0x10(%rbp),%rax
mov    %rax,-0x40(%rbp)
mov    0x18(%rbp),%rax
mov    %rax,-0x48(%rbp)
mov    -0x10(%rbp),%rax
mov    -0x18(%rbp),%rbx
mov    -0x20(%rbp),%rcx
mov    -0x28(%rbp),%rdx
int    $0x80
mov    %rax,%r9
mov    -0x48(%rbp),%rax
mov    %rcx,%rsi
mov    -0x40(%rbp),%rcx
mov    %r9,(%r8)
mov    %rbx,(%rdi)
mov    %rsi,(%rcx)
mov    %rdx,(%rax)
mov    -0x38(%rbp),%rax
mov    (%rax),%rax
and    $0x1,%rax
cmp    $0x0,%rax
je     118d <syscall+0x8d>
mov    0x10(%rbp),%rax
mov    (%rax),%rax
mov    %eax,-0x4c(%rbp)
jmp    1197 <syscall+0x97>
xor    %eax,%eax
mov    %eax,-0x4c(%rbp)
jmp    1197 <syscall+0x97>
mov    -0x4c(%rbp),%eax
pop    %rbx
pop    %rbp
ret

x86 assembly (clang, -O2):
<syscall>:
push   %rbx
mov    %rcx,%r10
mov    %rdx,%rcx
mov    %rsi,%rbx
mov    %rdi,%rax
mov    %r10,%rdx
int    $0x80
mov    0x10(%rsp),%rsi
mov    0x18(%rsp),%rdi
mov    %rax,(%r8)
mov    %rbx,(%r9)
mov    %rcx,(%rsi)
mov    %rdx,(%rdi)
xor    %eax,%eax
testb  $0x1,(%r9)
je     1132 <syscall+0x32>
mov    (%rsi),%eax
pop    %rbx
ret

LLVM IR (-O0):
define i32 @syscall(i64 %0, i64 %1, i64 %2, i64 %3, i64* %4, i64* %5, i64* %6, i64* %7) {
%9 = alloca i64
%10 = alloca i64
%11 = alloca i64
%12 = alloca i64
%13 = alloca i64*
%14 = alloca i64*
%15 = alloca i64*
%16 = alloca i64*
store i64 %0, i64* %9
store i64 %1, i64* %10
store i64 %2, i64* %11
store i64 %3, i64* %12
store i64* %4, i64** %13
store i64* %5, i64** %14
store i64* %6, i64** %15
store i64* %7, i64** %16
%17 = load i64*, i64** %13
%18 = load i64*, i64** %14
%19 = load i64*, i64** %15
%20 = load i64*, i64** %16
%21 = load i64, i64* %9
%22 = load i64, i64* %10
%23 = load i64, i64* %11
%24 = load i64, i64* %12
%25 = call { i64, i64, i64, i64 } asm sideeffect "int $$0x80\0A\09", "={ax},={bx},={cx},={dx},0,1,2,3,~{dirflag},~{fpsr},~{flags}"(i64 %21, i64 %22, i64 %23, i64 %24)
%26 = extractvalue { i64, i64, i64, i64 } %25, 0
%27 = extractvalue { i64, i64, i64, i64 } %25, 1
%28 = extractvalue { i64, i64, i64, i64 } %25, 2
%29 = extractvalue { i64, i64, i64, i64 } %25, 3
store i64 %26, i64* %17
store i64 %27, i64* %18
store i64 %28, i64* %19
store i64 %29, i64* %20
%30 = load i64*, i64** %14
%31 = load i64, i64* %30
%32 = and i64 %31, 1
%33 = icmp ne i64 %32, 0
br i1 %33, label %34, label %38
34: ; preds = %8
%35 = load i64*, i64** %15
%36 = load i64, i64* %35
%37 = trunc i64 %36 to i32
br label %39
38: ; preds = %8
br label %39
39: ; preds = %38, %34
%40 = phi i32 [ %37, %34 ], [ 0, %38 ]
ret i32 %40
}

LLVM IR (-O2):
define i32 @syscall(i64 %0, i64 %1, i64 %2, i64 %3, i64* nocapture writeonly %4, i64* nocapture %5, i64* nocapture %6, i64* nocapture writeonly %7) {
%9 = tail call { i64, i64, i64, i64 } asm sideeffect "int $$0x80\0A\09", "={ax},={bx},={cx},={dx},0,1,2,3,~{dirflag},~{fpsr},~{flags}"(i64 %0, i64 %1, i64 %2, i64 %3)
%10 = extractvalue { i64, i64, i64, i64 } %9, 0
%11 = extractvalue { i64, i64, i64, i64 } %9, 1
%12 = extractvalue { i64, i64, i64, i64 } %9, 2
%13 = extractvalue { i64, i64, i64, i64 } %9, 3
store i64 %10, i64* %4
store i64 %11, i64* %5
store i64 %12, i64* %6
store i64 %13, i64* %7
%14 = load i64, i64* %5
%15 = and i64 %14, 1
%16 = icmp eq i64 %15, 0
br i1 %16, label %20, label %17
17: ; preds = %8
%18 = load i64, i64* %6
%19 = trunc i64 %18 to i32
br label %20
20: ; preds = %8, %17
%21 = phi i32 [ %19, %17 ], [ 0, %8 ]
ret i32 %21
}