unsigned char compareInt(long left, long right, unsigned char op) {
  switch (op) {
  case 0x01:
    return (left < right);
  case 0x02:
    return (left <= right);
  case 0x03:
    return (left > right);
  case 0x04:
    return (left >= right);
  case 0x05:
    return (left == right);
  case 0x06:
    return (left != right);
  }
  return 0;
}


x86 assembly (clang, -O0):
<compareInt>:
push   %rbp
mov    %rsp,%rbp
mov    %dl,%al
mov    %rdi,-0x10(%rbp)
mov    %rsi,-0x18(%rbp)
mov    %al,-0x19(%rbp)
movzbl -0x19(%rbp),%eax
add    $0xffffffff,%eax
mov    %eax,%ecx
mov    %rcx,-0x28(%rbp)
sub    $0x5,%eax
ja     11cb <compareInt+0xcb>
mov    -0x28(%rbp),%rax
lea    0xece(%rip),%rcx
movslq (%rcx,%rax,4),%rax
add    %rcx,%rax
jmp    *%rax
mov    -0x10(%rbp),%rax
cmp    -0x18(%rbp),%rax
setl   %al
and    $0x1,%al
movzbl %al,%eax
mov    %al,-0x1(%rbp)
jmp    11cf <compareInt+0xcf>
mov    -0x10(%rbp),%rax
cmp    -0x18(%rbp),%rax
setle  %al
and    $0x1,%al
movzbl %al,%eax
mov    %al,-0x1(%rbp)
jmp    11cf <compareInt+0xcf>
mov    -0x10(%rbp),%rax
cmp    -0x18(%rbp),%rax
setg   %al
and    $0x1,%al
movzbl %al,%eax
mov    %al,-0x1(%rbp)
jmp    11cf <compareInt+0xcf>
mov    -0x10(%rbp),%rax
cmp    -0x18(%rbp),%rax
setge  %al
and    $0x1,%al
movzbl %al,%eax
mov    %al,-0x1(%rbp)
jmp    11cf <compareInt+0xcf>
mov    -0x10(%rbp),%rax
cmp    -0x18(%rbp),%rax
sete   %al
and    $0x1,%al
movzbl %al,%eax
mov    %al,-0x1(%rbp)
jmp    11cf <compareInt+0xcf>
mov    -0x10(%rbp),%rax
cmp    -0x18(%rbp),%rax
setne  %al
and    $0x1,%al
movzbl %al,%eax
mov    %al,-0x1(%rbp)
jmp    11cf <compareInt+0xcf>
movb   $0x0,-0x1(%rbp)
movzbl -0x1(%rbp),%eax
pop    %rbp
ret

x86 assembly (clang, -O2):
<compareInt>:
add    $0xff,%dl
cmp    $0x5,%dl
ja     1122 <compareInt+0x22>
movzbl %dl,%eax
lea    0xeee(%rip),%rcx
movslq (%rcx,%rax,4),%rax
add    %rcx,%rax
jmp    *%rax
cmp    %rsi,%rdi
setl   %al
ret
xor    %eax,%eax
ret
cmp    %rsi,%rdi
setle  %al
ret
cmp    %rsi,%rdi
setg   %al
ret
cmp    %rsi,%rdi
setge  %al
ret
cmp    %rsi,%rdi
sete   %al
ret
cmp    %rsi,%rdi
setne  %al
ret

LLVM IR (-O0):
define zeroext i8 @compareInt(i64 %0, i64 %1, i8 zeroext %2) {
%4 = alloca i8
%5 = alloca i64
%6 = alloca i64
%7 = alloca i8
store i64 %0, i64* %5
store i64 %1, i64* %6
store i8 %2, i8* %7
%8 = load i8, i8* %7
%9 = zext i8 %8 to i32
switch i32 %9, label %46 [
i32 1, label %10
i32 2, label %16
i32 3, label %22
i32 4, label %28
i32 5, label %34
i32 6, label %40
]
10: ; preds = %3
%11 = load i64, i64* %5
%12 = load i64, i64* %6
%13 = icmp slt i64 %11, %12
%14 = zext i1 %13 to i32
%15 = trunc i32 %14 to i8
store i8 %15, i8* %4
br label %47
16: ; preds = %3
%17 = load i64, i64* %5
%18 = load i64, i64* %6
%19 = icmp sle i64 %17, %18
%20 = zext i1 %19 to i32
%21 = trunc i32 %20 to i8
store i8 %21, i8* %4
br label %47
22: ; preds = %3
%23 = load i64, i64* %5
%24 = load i64, i64* %6
%25 = icmp sgt i64 %23, %24
%26 = zext i1 %25 to i32
%27 = trunc i32 %26 to i8
store i8 %27, i8* %4
br label %47
28: ; preds = %3
%29 = load i64, i64* %5
%30 = load i64, i64* %6
%31 = icmp sge i64 %29, %30
%32 = zext i1 %31 to i32
%33 = trunc i32 %32 to i8
store i8 %33, i8* %4
br label %47
34: ; preds = %3
%35 = load i64, i64* %5
%36 = load i64, i64* %6
%37 = icmp eq i64 %35, %36
%38 = zext i1 %37 to i32
%39 = trunc i32 %38 to i8
store i8 %39, i8* %4
br label %47
40: ; preds = %3
%41 = load i64, i64* %5
%42 = load i64, i64* %6
%43 = icmp ne i64 %41, %42
%44 = zext i1 %43 to i32
%45 = trunc i32 %44 to i8
store i8 %45, i8* %4
br label %47
46: ; preds = %3
store i8 0, i8* %4
br label %47
47: ; preds = %46, %40, %34, %28, %22, %16, %10
%48 = load i8, i8* %4
ret i8 %48
}

LLVM IR (-O2):
define zeroext i8 @compareInt(i64 %0, i64 %1, i8 zeroext %2) {
switch i8 %2, label %16 [
i8 1, label %4
i8 2, label %6
i8 3, label %8
i8 4, label %10
i8 5, label %12
i8 6, label %14
]
4: ; preds = %3
%5 = icmp slt i64 %0, %1
br label %16
6: ; preds = %3
%7 = icmp sle i64 %0, %1
br label %16
8: ; preds = %3
%9 = icmp sgt i64 %0, %1
br label %16
10: ; preds = %3
%11 = icmp sge i64 %0, %1
br label %16
12: ; preds = %3
%13 = icmp eq i64 %0, %1
br label %16
14: ; preds = %3
%15 = icmp ne i64 %0, %1
br label %16
16: ; preds = %3, %14, %12, %10, %8, %6, %4
%17 = phi i1 [ %15, %14 ], [ %13, %12 ], [ %11, %10 ], [ %9, %8 ], [ %7, %6 ], [ %5, %4 ], [ false, %3 ]
%18 = zext i1 %17 to i8
ret i8 %18
}