int get_base(char c) {
  int b;
  b = 0;
  if ((c == 'u' || c == 'U' || c == 'b'))
    b = (c == 'b') ? 2 : 10;
  else if ((c == 'o' || c == 'O' || c == 'x' || c == 'X'))
    b = ((c == 'o' || c == 'O') ? 8 : 16);
  return (b);
}


x86 assembly (clang, -O0):
<get_base>:
push   %rbp
mov    %rsp,%rbp
mov    %dil,%al
mov    %al,-0x1(%rbp)
movl   $0x0,-0x8(%rbp)
movsbl -0x1(%rbp),%eax
cmp    $0x75,%eax
je     1138 <get_base+0x38>
movsbl -0x1(%rbp),%eax
cmp    $0x55,%eax
je     1138 <get_base+0x38>
movsbl -0x1(%rbp),%eax
cmp    $0x62,%eax
jne    1154 <get_base+0x54>
movsbl -0x1(%rbp),%edx
mov    $0xa,%eax
mov    $0x2,%ecx
cmp    $0x62,%edx
cmove  %ecx,%eax
mov    %eax,-0x8(%rbp)
jmp    11c2 <get_base+0xc2>
movsbl -0x1(%rbp),%eax
cmp    $0x6f,%eax
je     1188 <get_base+0x88>
movsbl -0x1(%rbp),%eax
cmp    $0x4f,%eax
je     1188 <get_base+0x88>
movsbl -0x1(%rbp),%eax
cmp    $0x78,%eax
je     1188 <get_base+0x88>
movsbl -0x1(%rbp),%eax
cmp    $0x58,%eax
jne    11bd <get_base+0xbd>
movsbl -0x1(%rbp),%ecx
mov    $0x1,%al
cmp    $0x6f,%ecx
mov    %al,-0x9(%rbp)
je     11a7 <get_base+0xa7>
movsbl -0x1(%rbp),%eax
cmp    $0x4f,%eax
sete   %al
mov    %al,-0x9(%rbp)
mov    -0x9(%rbp),%dl
mov    $0x10,%eax
mov    $0x8,%ecx
test   $0x1,%dl
cmovne %ecx,%eax
mov    %eax,-0x8(%rbp)
jmp    11c2 <get_base+0xc2>
mov    -0x8(%rbp),%eax
pop    %rbp
ret

x86 assembly (clang, -O2):
<get_base>:
xor    %eax,%eax
lea    -0x4f(%rdi),%ecx
cmp    $0x29,%cl
ja     1131 <get_base+0x31>
movzbl %cl,%ecx
movabs $0x20100000201,%rdx
bt     %rcx,%rdx
jae    1132 <get_base+0x32>
and    $0xdf,%dil
xor    %eax,%eax
cmp    $0x4f,%dil
setne  %al
lea    0x8(,%rax,8),%eax
ret
movabs $0x4000080040,%rdx
bt     %rcx,%rdx
jae    1131 <get_base+0x31>
xor    %eax,%eax
cmp    $0x62,%dil
setne  %al
lea    0x2(,%rax,8),%eax
ret

LLVM IR (-O0):
define i32 @get_base(i8 signext %0) {
%2 = alloca i8
%3 = alloca i32
store i8 %0, i8* %2
store i32 0, i32* %3
%4 = load i8, i8* %2
%5 = sext i8 %4 to i32
%6 = icmp eq i32 %5, 117
br i1 %6, label %15, label %7
7: ; preds = %1
%8 = load i8, i8* %2
%9 = sext i8 %8 to i32
%10 = icmp eq i32 %9, 85
br i1 %10, label %15, label %11
11: ; preds = %7
%12 = load i8, i8* %2
%13 = sext i8 %12 to i32
%14 = icmp eq i32 %13, 98
br i1 %14, label %15, label %21
15: ; preds = %11, %7, %1
%16 = load i8, i8* %2
%17 = sext i8 %16 to i32
%18 = icmp eq i32 %17, 98
%19 = zext i1 %18 to i64
%20 = select i1 %18, i32 2, i32 10
store i32 %20, i32* %3
br label %50
21: ; preds = %11
%22 = load i8, i8* %2
%23 = sext i8 %22 to i32
%24 = icmp eq i32 %23, 111
br i1 %24, label %37, label %25
25: ; preds = %21
%26 = load i8, i8* %2
%27 = sext i8 %26 to i32
%28 = icmp eq i32 %27, 79
br i1 %28, label %37, label %29
29: ; preds = %25
%30 = load i8, i8* %2
%31 = sext i8 %30 to i32
%32 = icmp eq i32 %31, 120
br i1 %32, label %37, label %33
33: ; preds = %29
%34 = load i8, i8* %2
%35 = sext i8 %34 to i32
%36 = icmp eq i32 %35, 88
br i1 %36, label %37, label %49
37: ; preds = %33, %29, %25, %21
%38 = load i8, i8* %2
%39 = sext i8 %38 to i32
%40 = icmp eq i32 %39, 111
br i1 %40, label %45, label %41
41: ; preds = %37
%42 = load i8, i8* %2
%43 = sext i8 %42 to i32
%44 = icmp eq i32 %43, 79
br label %45
45: ; preds = %41, %37
%46 = phi i1 [ true, %37 ], [ %44, %41 ]
%47 = zext i1 %46 to i64
%48 = select i1 %46, i32 8, i32 16
store i32 %48, i32* %3
br label %49
49: ; preds = %45, %33
br label %50
50: ; preds = %49, %15
%51 = load i32, i32* %3
ret i32 %51
}

LLVM IR (-O2):
define i32 @get_base(i8 signext %0) {
switch i8 %0, label %9 [
i8 117, label %2
i8 98, label %2
i8 85, label %2
i8 120, label %5
i8 111, label %5
i8 88, label %5
i8 79, label %5
]
2: ; preds = %1, %1, %1
%3 = icmp eq i8 %0, 98
%4 = select i1 %3, i32 2, i32 10
br label %9
5: ; preds = %1, %1, %1, %1
%6 = and i8 %0, -33
%7 = icmp eq i8 %6, 79
%8 = select i1 %7, i32 8, i32 16
br label %9
9: ; preds = %1, %5, %2
%10 = phi i32 [ %4, %2 ], [ %8, %5 ], [ 0, %1 ]
ret i32 %10
}