int tools_operator_compare(char ch1, char ch2) {
  int res = 0;
  if ('+' == ch1 || '-' == ch1) {
    if ('#' == ch2) {
      res = 1;
    } else if ('+' == ch2 || '-' == ch2) {
      res = 0;
    } else if ('*' == ch2 || '/' == ch2) {
      res = -1;
    } else if ('(' == ch2) {
      res = 1;
    }
  } else if ('*' == ch1 || '/' == ch1) {
    if ('#' == ch2) {
      res = 1;
    } else if ('+' == ch2 || '-' == ch2) {
      res = 1;
    } else if ('*' == ch2 || '/' == ch2) {
      res = 0;
    } else if ('(' == ch2) {
      res = 1;
    }
  }
  return res;
}


x86 assembly (clang, -O0):
<tools_operator_compare>:
push   %rbp
mov    %rsp,%rbp
mov    %sil,%al
mov    %dil,%cl
mov    %cl,-0x1(%rbp)
mov    %al,-0x2(%rbp)
movl   $0x0,-0x8(%rbp)
movsbl -0x1(%rbp),%ecx
mov    $0x2b,%eax
cmp    %ecx,%eax
je     1139 <tools_operator_compare+0x39>
movsbl -0x1(%rbp),%ecx
mov    $0x2d,%eax
cmp    %ecx,%eax
jne    11de <tools_operator_compare+0xde>
movsbl -0x2(%rbp),%ecx
mov    $0x23,%eax
cmp    %ecx,%eax
jne    1156 <tools_operator_compare+0x56>
movl   $0x1,-0x8(%rbp)
jmp    11d9 <tools_operator_compare+0xd9>
movsbl -0x2(%rbp),%ecx
mov    $0x2b,%eax
cmp    %ecx,%eax
je     1178 <tools_operator_compare+0x78>
movsbl -0x2(%rbp),%ecx
mov    $0x2d,%eax
cmp    %ecx,%eax
jne    1184 <tools_operator_compare+0x84>
movl   $0x0,-0x8(%rbp)
jmp    11d4 <tools_operator_compare+0xd4>
movsbl -0x2(%rbp),%ecx
mov    $0x2a,%eax
cmp    %ecx,%eax
je     11a6 <tools_operator_compare+0xa6>
movsbl -0x2(%rbp),%ecx
mov    $0x2f,%eax
cmp    %ecx,%eax
jne    11b2 <tools_operator_compare+0xb2>
movl   $0xffffffff,-0x8(%rbp)
jmp    11cf <tools_operator_compare+0xcf>
movsbl -0x2(%rbp),%ecx
mov    $0x28,%eax
cmp    %ecx,%eax
jne    11ca <tools_operator_compare+0xca>
movl   $0x1,-0x8(%rbp)
jmp    11cf <tools_operator_compare+0xcf>
jmp    11d4 <tools_operator_compare+0xd4>
jmp    11d9 <tools_operator_compare+0xd9>
jmp    12aa <tools_operator_compare+0x1aa>
movsbl -0x1(%rbp),%ecx
mov    $0x2a,%eax
cmp    %ecx,%eax
je     1200 <tools_operator_compare+0x100>
movsbl -0x1(%rbp),%ecx
mov    $0x2f,%eax
cmp    %ecx,%eax
jne    12a5 <tools_operator_compare+0x1a5>
movsbl -0x2(%rbp),%ecx
mov    $0x23,%eax
cmp    %ecx,%eax
jne    121d <tools_operator_compare+0x11d>
movl   $0x1,-0x8(%rbp)
jmp    12a0 <tools_operator_compare+0x1a0>
movsbl -0x2(%rbp),%ecx
mov    $0x2b,%eax
cmp    %ecx,%eax
je     123f <tools_operator_compare+0x13f>
movsbl -0x2(%rbp),%ecx
mov    $0x2d,%eax
cmp    %ecx,%eax
jne    124b <tools_operator_compare+0x14b>
movl   $0x1,-0x8(%rbp)
jmp    129b <tools_operator_compare+0x19b>
movsbl -0x2(%rbp),%ecx
mov    $0x2a,%eax
cmp    %ecx,%eax
je     126d <tools_operator_compare+0x16d>
movsbl -0x2(%rbp),%ecx
mov    $0x2f,%eax
cmp    %ecx,%eax
jne    1279 <tools_operator_compare+0x179>
movl   $0x0,-0x8(%rbp)
jmp    1296 <tools_operator_compare+0x196>
movsbl -0x2(%rbp),%ecx
mov    $0x28,%eax
cmp    %ecx,%eax
jne    1291 <tools_operator_compare+0x191>
movl   $0x1,-0x8(%rbp)
jmp    1296 <tools_operator_compare+0x196>
jmp    129b <tools_operator_compare+0x19b>
jmp    12a0 <tools_operator_compare+0x1a0>
jmp    12a5 <tools_operator_compare+0x1a5>
jmp    12aa <tools_operator_compare+0x1aa>
mov    -0x8(%rbp),%eax
pop    %rbp
ret

x86 assembly (clang, -O2):
<tools_operator_compare>:
xor    %eax,%eax
add    $0xd6,%dil
cmp    $0x5,%dil
ja     1141 <tools_operator_compare+0x41>
movzbl %dil,%eax
lea    0xee9(%rip),%rcx
movslq (%rcx,%rax,4),%rdx
add    %rcx,%rdx
xor    %eax,%eax
jmp    *%rdx
cmp    $0x2d,%sil
ja     1160 <tools_operator_compare+0x60>
mov    $0x1,%eax
movzbl %sil,%ecx
movabs $0x290800000000,%rdx
bt     %rcx,%rdx
jae    1160 <tools_operator_compare+0x60>
ret
add    $0xdd,%sil
mov    $0x0,%eax
cmp    $0xd,%sil
jae    1141 <tools_operator_compare+0x41>
movsbq %sil,%rax
lea    0xebc(%rip),%rcx
mov    (%rcx,%rax,4),%eax
ret
xor    %eax,%eax
ret

LLVM IR (-O0):
define i32 @tools_operator_compare(i8 signext %0, i8 signext %1) {
%3 = alloca i8
%4 = alloca i8
%5 = alloca i32
store i8 %0, i8* %3
store i8 %1, i8* %4
store i32 0, i32* %5
%6 = load i8, i8* %3
%7 = sext i8 %6 to i32
%8 = icmp eq i32 43, %7
br i1 %8, label %13, label %9
9: ; preds = %2
%10 = load i8, i8* %3
%11 = sext i8 %10 to i32
%12 = icmp eq i32 45, %11
br i1 %12, label %13, label %45
13: ; preds = %9, %2
%14 = load i8, i8* %4
%15 = sext i8 %14 to i32
%16 = icmp eq i32 35, %15
br i1 %16, label %17, label %18
17: ; preds = %13
store i32 1, i32* %5
br label %44
18: ; preds = %13
%19 = load i8, i8* %4
%20 = sext i8 %19 to i32
%21 = icmp eq i32 43, %20
br i1 %21, label %26, label %22
22: ; preds = %18
%23 = load i8, i8* %4
%24 = sext i8 %23 to i32
%25 = icmp eq i32 45, %24
br i1 %25, label %26, label %27
26: ; preds = %22, %18
store i32 0, i32* %5
br label %43
27: ; preds = %22
%28 = load i8, i8* %4
%29 = sext i8 %28 to i32
%30 = icmp eq i32 42, %29
br i1 %30, label %35, label %31
31: ; preds = %27
%32 = load i8, i8* %4
%33 = sext i8 %32 to i32
%34 = icmp eq i32 47, %33
br i1 %34, label %35, label %36
35: ; preds = %31, %27
store i32 -1, i32* %5
br label %42
36: ; preds = %31
%37 = load i8, i8* %4
%38 = sext i8 %37 to i32
%39 = icmp eq i32 40, %38
br i1 %39, label %40, label %41
40: ; preds = %36
store i32 1, i32* %5
br label %41
41: ; preds = %40, %36
br label %42
42: ; preds = %41, %35
br label %43
43: ; preds = %42, %26
br label %44
44: ; preds = %43, %17
br label %86
45: ; preds = %9
%46 = load i8, i8* %3
%47 = sext i8 %46 to i32
%48 = icmp eq i32 42, %47
br i1 %48, label %53, label %49
49: ; preds = %45
%50 = load i8, i8* %3
%51 = sext i8 %50 to i32
%52 = icmp eq i32 47, %51
br i1 %52, label %53, label %85
53: ; preds = %49, %45
%54 = load i8, i8* %4
%55 = sext i8 %54 to i32
%56 = icmp eq i32 35, %55
br i1 %56, label %57, label %58
57: ; preds = %53
store i32 1, i32* %5
br label %84
58: ; preds = %53
%59 = load i8, i8* %4
%60 = sext i8 %59 to i32
%61 = icmp eq i32 43, %60
br i1 %61, label %66, label %62
62: ; preds = %58
%63 = load i8, i8* %4
%64 = sext i8 %63 to i32
%65 = icmp eq i32 45, %64
br i1 %65, label %66, label %67
66: ; preds = %62, %58
store i32 1, i32* %5
br label %83
67: ; preds = %62
%68 = load i8, i8* %4
%69 = sext i8 %68 to i32
%70 = icmp eq i32 42, %69
br i1 %70, label %75, label %71
71: ; preds = %67
%72 = load i8, i8* %4
%73 = sext i8 %72 to i32
%74 = icmp eq i32 47, %73
br i1 %74, label %75, label %76
75: ; preds = %71, %67
store i32 0, i32* %5
br label %82
76: ; preds = %71
%77 = load i8, i8* %4
%78 = sext i8 %77 to i32
%79 = icmp eq i32 40, %78
br i1 %79, label %80, label %81
80: ; preds = %76
store i32 1, i32* %5
br label %81
81: ; preds = %80, %76
br label %82
82: ; preds = %81, %75
br label %83
83: ; preds = %82, %66
br label %84
84: ; preds = %83, %57
br label %85
85: ; preds = %84, %49
br label %86
86: ; preds = %85, %44
%87 = load i32, i32* %5
ret i32 %87
}

LLVM IR (-O2):
@switch.table.tools_operator_compare = [13 x i32] [i32 1, i32 0, i32 0, i32 0, i32 0, i32 1, i32 0, i32 -1, i32 0, i32 0, i32 0, i32 0, i32 -1]
define i32 @tools_operator_compare(i8 signext %0, i8 signext %1) {
switch i8 %0, label %12 [
i8 45, label %3
i8 43, label %3
i8 47, label %6
i8 42, label %6
]
3: ; preds = %2, %2
%4 = add i8 %1, -35
%5 = icmp ult i8 %4, 13
br i1 %5, label %8, label %12
6: ; preds = %2, %2
switch i8 %1, label %7 [
i8 35, label %12
i8 45, label %12
i8 43, label %12
i8 40, label %12
]
7: ; preds = %6
br label %12
8: ; preds = %3
%9 = sext i8 %4 to i64
%10 = getelementptr inbounds [13 x i32], [13 x i32]* @switch.table.tools_operator_compare, i64 0, i64 %9
%11 = load i32, i32* %10
br label %12
12: ; preds = %3, %8, %6, %6, %6, %6, %7, %2
%13 = phi i32 [ 1, %6 ], [ 0, %2 ], [ 1, %6 ], [ 1, %6 ], [ 0, %7 ], [ 1, %6 ], [ %11, %8 ], [ 0, %3 ]
ret i32 %13
}