int priority_level_cmp(int a, int b) {
  if (('+' == (a) || '-' == (a)) && ('*' == (b) || '/' == (b)))
    return -1;
  else if (('+' == (a) || '-' == (a)) && ('+' == (b) || '-' == (b)))
    return 0;
  else if (('*' == (a) || '/' == (a)) && ('*' == (b) || '/' == (b)))
    return 0;
  else
    return 1;
}


x86 assembly (clang, -O0):
<priority_level_cmp>:
push   %rbp
mov    %rsp,%rbp
mov    %edi,-0x8(%rbp)
mov    %esi,-0xc(%rbp)
mov    $0x2b,%eax
cmp    -0x8(%rbp),%eax
je     1126 <priority_level_cmp+0x26>
mov    $0x2d,%eax
cmp    -0x8(%rbp),%eax
jne    114e <priority_level_cmp+0x4e>
mov    $0x2a,%eax
cmp    -0xc(%rbp),%eax
je     1142 <priority_level_cmp+0x42>
mov    $0x2f,%eax
cmp    -0xc(%rbp),%eax
jne    114e <priority_level_cmp+0x4e>
movl   $0xffffffff,-0x4(%rbp)
jmp    11dd <priority_level_cmp+0xdd>
mov    $0x2b,%eax
cmp    -0x8(%rbp),%eax
je     116a <priority_level_cmp+0x6a>
mov    $0x2d,%eax
cmp    -0x8(%rbp),%eax
jne    1192 <priority_level_cmp+0x92>
mov    $0x2b,%eax
cmp    -0xc(%rbp),%eax
je     1186 <priority_level_cmp+0x86>
mov    $0x2d,%eax
cmp    -0xc(%rbp),%eax
jne    1192 <priority_level_cmp+0x92>
movl   $0x0,-0x4(%rbp)
jmp    11dd <priority_level_cmp+0xdd>
mov    $0x2a,%eax
cmp    -0x8(%rbp),%eax
je     11ae <priority_level_cmp+0xae>
mov    $0x2f,%eax
cmp    -0x8(%rbp),%eax
jne    11d6 <priority_level_cmp+0xd6>
mov    $0x2a,%eax
cmp    -0xc(%rbp),%eax
je     11ca <priority_level_cmp+0xca>
mov    $0x2f,%eax
cmp    -0xc(%rbp),%eax
jne    11d6 <priority_level_cmp+0xd6>
movl   $0x0,-0x4(%rbp)
jmp    11dd <priority_level_cmp+0xdd>
movl   $0x1,-0x4(%rbp)
mov    -0x4(%rbp),%eax
pop    %rbp
ret

x86 assembly (clang, -O2):
<priority_level_cmp>:
mov    $0x1,%eax
lea    -0x2a(%rdi),%ecx
cmp    $0x5,%ecx
ja     1133 <priority_level_cmp+0x33>
lea    0xeec(%rip),%rax
movslq (%rax,%rcx,4),%rcx
add    %rax,%rcx
mov    $0x1,%eax
jmp    *%rcx
cmp    $0x2f,%esi
setne  %al
cmp    $0x2a,%esi
setne  %cl
and    %al,%cl
movzbl %cl,%eax
ret
mov    $0xffffffff,%eax
cmp    $0x2a,%esi
je     1133 <priority_level_cmp+0x33>
cmp    $0x2f,%esi
je     1133 <priority_level_cmp+0x33>
cmp    $0x2d,%edi
je     1152 <priority_level_cmp+0x52>
mov    $0x1,%eax
cmp    $0x2b,%edi
jne    1133 <priority_level_cmp+0x33>
add    $0xffffffd5,%esi
xor    %eax,%eax
test   $0xfffffffd,%esi
setne  %al
ret

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

LLVM IR (-O2):
define i32 @priority_level_cmp(i32 %0, i32 %1) {
switch i32 %0, label %15 [
i32 45, label %3
i32 43, label %3
i32 47, label %10
i32 42, label %10
]
3: ; preds = %2, %2
switch i32 %1, label %4 [
i32 47, label %15
i32 42, label %15
]
4: ; preds = %3
switch i32 %0, label %15 [
i32 45, label %5
i32 43, label %5
]
5: ; preds = %4, %4
%6 = icmp ne i32 %1, 45
%7 = icmp ne i32 %1, 43
%8 = and i1 %6, %7
%9 = zext i1 %8 to i32
br label %15
10: ; preds = %2, %2
%11 = icmp ne i32 %1, 47
%12 = icmp ne i32 %1, 42
%13 = and i1 %11, %12
%14 = zext i1 %13 to i32
br label %15
15: ; preds = %5, %4, %2, %10, %3, %3
%16 = phi i32 [ -1, %3 ], [ -1, %3 ], [ %14, %10 ], [ 1, %2 ], [ 1, %4 ], [ %9, %5 ]
ret i32 %16
}