int oprio(int c) {
  if (c == '*' || c == '/' || c == '%')
    return (10);
  if (c == '+' || c == '-')
    return (7);
  if (c == '<' || c == '>')
    return (5);
  if (c == '^')
    return (4);
  if (c == '&')
    return (3);
  if (c == '|')
    return (1);
  return (0);
}


x86 assembly (clang, -O0):
<oprio>:
push   %rbp
mov    %rsp,%rbp
mov    %edi,-0x8(%rbp)
cmpl   $0x2a,-0x8(%rbp)
je     1125 <oprio+0x25>
cmpl   $0x2f,-0x8(%rbp)
je     1125 <oprio+0x25>
cmpl   $0x25,-0x8(%rbp)
jne    1131 <oprio+0x31>
movl   $0xa,-0x4(%rbp)
jmp    11ba <oprio+0xba>
cmpl   $0x2b,-0x8(%rbp)
je     1145 <oprio+0x45>
cmpl   $0x2d,-0x8(%rbp)
jne    1151 <oprio+0x51>
movl   $0x7,-0x4(%rbp)
jmp    11ba <oprio+0xba>
cmpl   $0x3c,-0x8(%rbp)
je     1165 <oprio+0x65>
cmpl   $0x3e,-0x8(%rbp)
jne    1171 <oprio+0x71>
movl   $0x5,-0x4(%rbp)
jmp    11ba <oprio+0xba>
cmpl   $0x5e,-0x8(%rbp)
jne    1187 <oprio+0x87>
movl   $0x4,-0x4(%rbp)
jmp    11ba <oprio+0xba>
cmpl   $0x26,-0x8(%rbp)
jne    119d <oprio+0x9d>
movl   $0x3,-0x4(%rbp)
jmp    11ba <oprio+0xba>
cmpl   $0x7c,-0x8(%rbp)
jne    11b3 <oprio+0xb3>
movl   $0x1,-0x4(%rbp)
jmp    11ba <oprio+0xba>
movl   $0x0,-0x4(%rbp)
mov    -0x4(%rbp),%eax
pop    %rbp
ret

x86 assembly (clang, -O2):
<oprio>:
lea    -0x25(%rdi),%eax
cmp    $0xb,%eax
jae    1112 <oprio+0x12>
mov    $0x561,%ecx
bt     %eax,%ecx
jb     1136 <oprio+0x36>
mov    %edi,%ecx
and    $0xfffffffd,%ecx
mov    $0x5,%eax
cmp    $0x3c,%ecx
je     1142 <oprio+0x42>
cmp    $0x7c,%edi
je     1143 <oprio+0x43>
cmp    $0x5e,%edi
je     1149 <oprio+0x49>
cmp    $0x26,%edi
jne    114f <oprio+0x4f>
mov    $0x3,%eax
ret
cltq
lea    0xec1(%rip),%rcx
mov    (%rcx,%rax,4),%eax
ret
mov    $0x1,%eax
ret
mov    $0x4,%eax
ret
xor    %eax,%eax
ret

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

LLVM IR (-O2):
@switch.table.oprio = [11 x i32] [i32 10, i32 10, i32 10, i32 10, i32 10, i32 10, i32 7, i32 10, i32 7, i32 10, i32 10]
define i32 @oprio(i32 %0) {
%2 = add i32 %0, -37
%3 = icmp ult i32 %2, 11
br i1 %3, label %11, label %4
4: ; preds = %11, %1
%5 = and i32 %0, -3
%6 = icmp eq i32 %5, 60
br i1 %6, label %20, label %7
7: ; preds = %4
switch i32 %0, label %10 [
i32 94, label %20
i32 38, label %8
i32 124, label %9
]
8: ; preds = %7
br label %20
9: ; preds = %7
br label %20
10: ; preds = %7
br label %20
11: ; preds = %1
%12 = trunc i32 %2 to i16
%13 = lshr i16 1377, %12
%14 = and i16 %13, 1
%15 = icmp eq i16 %14, 0
br i1 %15, label %4, label %16
16: ; preds = %11
%17 = sext i32 %2 to i64
%18 = getelementptr inbounds [11 x i32], [11 x i32]* @switch.table.oprio, i64 0, i64 %17
%19 = load i32, i32* %18
br label %20
20: ; preds = %16, %7, %4, %10, %9, %8
%21 = phi i32 [ 3, %8 ], [ 1, %9 ], [ 0, %10 ], [ 5, %4 ], [ 4, %7 ], [ %19, %16 ]
ret i32 %21
}