#define NULL ((void *)0)
typedef unsigned long size_t; // Customize by platform.
typedef long intptr_t;
typedef unsigned long uintptr_t;
typedef long scalar_t__; // Either arithmetic or pointer type.
/* By default, we understand bool (as a convenience). */
typedef int bool;
#define false 0
#define true 1

/* Forward declarations */

/* Type definitions */

/* Variables and functions */
int atoi(char *);
int text2color(char *p) {
  int c;
  char *p2;
  if (p[0] == 't' || p[0] == 'T')
    return (-2);
  else if (p[0] == 'r' || p[0] == 'R')
    return (-3);
  else if (*p == '*' || !*p || *p < '0' || *p > '9')
    return (-1);
  p2 = p;
  while (*p2 && *p2 > 32) {
    if (*p2 == ',')
      break;
    p2++;
  }
  if (*p2 == ',') {
    c = (atoi(p2 + 1) & 15) + 16 * (atoi(p) & 15) + 256;
  } else {
    c = (atoi(p) & 15) + 16 * (atoi(p) & 15) + 256;
  }
  return (c);
}


x86 assembly (clang, -O0):
<text2color>:
push   %rbp
mov    %rsp,%rbp
sub    $0x30,%rsp
mov    %rdi,-0x10(%rbp)
mov    -0x10(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x74,%eax
je     113c <text2color+0x2c>
mov    -0x10(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x54,%eax
jne    1148 <text2color+0x38>
movl   $0xfffffffe,-0x4(%rbp)
jmp    12a3 <text2color+0x193>
mov    -0x10(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x72,%eax
je     1168 <text2color+0x58>
mov    -0x10(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x52,%eax
jne    1174 <text2color+0x64>
movl   $0xfffffffd,-0x4(%rbp)
jmp    12a3 <text2color+0x193>
mov    -0x10(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x2a,%eax
je     11b1 <text2color+0xa1>
mov    -0x10(%rbp),%rax
cmpb   $0x0,(%rax)
je     11b1 <text2color+0xa1>
mov    -0x10(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x30,%eax
jl     11b1 <text2color+0xa1>
mov    -0x10(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x39,%eax
jle    11bd <text2color+0xad>
movl   $0xffffffff,-0x4(%rbp)
jmp    12a3 <text2color+0x193>
jmp    11c2 <text2color+0xb2>
jmp    11c7 <text2color+0xb7>
mov    -0x10(%rbp),%rax
mov    %rax,-0x20(%rbp)
mov    -0x20(%rbp),%rax
movsbl (%rax),%ecx
xor    %eax,%eax
cmp    $0x0,%ecx
mov    %al,-0x21(%rbp)
je     11f4 <text2color+0xe4>
mov    -0x20(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x20,%eax
setg   %al
mov    %al,-0x21(%rbp)
mov    -0x21(%rbp),%al
test   $0x1,%al
jne    1204 <text2color+0xf4>
jmp    122a <text2color+0x11a>
mov    -0x20(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x2c,%eax
jne    1219 <text2color+0x109>
jmp    122a <text2color+0x11a>
mov    -0x20(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x20(%rbp)
jmp    11cf <text2color+0xbf>
mov    -0x20(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x2c,%eax
jne    1270 <text2color+0x160>
mov    -0x20(%rbp),%rdi
add    $0x1,%rdi
call   1030 <atoi@plt>
and    $0xf,%eax
mov    %eax,-0x28(%rbp)
mov    -0x10(%rbp),%rdi
call   1030 <atoi@plt>
mov    %eax,%ecx
mov    -0x28(%rbp),%eax
and    $0xf,%ecx
shl    $0x4,%ecx
add    %ecx,%eax
add    $0x100,%eax
mov    %eax,-0x14(%rbp)
jmp    129d <text2color+0x18d>
mov    -0x10(%rbp),%rdi
call   1030 <atoi@plt>
and    $0xf,%eax
mov    %eax,-0x2c(%rbp)
mov    -0x10(%rbp),%rdi
call   1030 <atoi@plt>
mov    %eax,%ecx
mov    -0x2c(%rbp),%eax
and    $0xf,%ecx
shl    $0x4,%ecx
add    %ecx,%eax
add    $0x100,%eax
mov    %eax,-0x14(%rbp)
mov    -0x14(%rbp),%eax
mov    %eax,-0x4(%rbp)
mov    -0x4(%rbp),%eax
add    $0x30,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<text2color>:
push   %rbp
push   %rbx
push   %rax
mov    %rdi,%rbx
mov    (%rdi),%cl
lea    -0x52(%rcx),%edx
cmp    $0x22,%dl
ja     113f <text2color+0x2f>
mov    $0xfffffffe,%eax
movzbl %dl,%edx
lea    0xed1(%rip),%rsi
movslq (%rsi,%rdx,4),%rdx
add    %rsi,%rdx
jmp    *%rdx
mov    $0xfffffffd,%eax
jmp    1155 <text2color+0x45>
test   %cl,%cl
je     1150 <text2color+0x40>
cmp    $0x2a,%cl
je     1150 <text2color+0x40>
add    $0xc6,%cl
cmp    $0xf6,%cl
jae    115c <text2color+0x4c>
mov    $0xffffffff,%eax
add    $0x8,%rsp
pop    %rbx
pop    %rbp
ret
lea    0x1(%rbx),%rdi
movzbl (%rdi),%eax
add    $0x1,%rdi
cmp    $0x21,%al
jl     116f <text2color+0x5f>
cmp    $0x2c,%al
jne    1160 <text2color+0x50>
cmp    $0x2c,%al
jne    118f <text2color+0x7f>
call   1030 <atoi@plt>
mov    %eax,%ebp
and    $0xf,%ebp
mov    %rbx,%rdi
call   1030 <atoi@plt>
shl    $0x4,%eax
movzbl %al,%eax
or     %ebp,%eax
jmp    11a3 <text2color+0x93>
mov    %rbx,%rdi
call   1030 <atoi@plt>
mov    %eax,%ecx
and    $0xf,%ecx
mov    %ecx,%eax
shl    $0x4,%eax
or     %ecx,%eax
or     $0x100,%eax
jmp    1155 <text2color+0x45>

LLVM IR (-O0):
define i32 @text2color(i8* %0) {
%2 = alloca i32
%3 = alloca i8*
%4 = alloca i32
%5 = alloca i8*
store i8* %0, i8** %3
%6 = load i8*, i8** %3
%7 = getelementptr inbounds i8, i8* %6, i64 0
%8 = load i8, i8* %7
%9 = sext i8 %8 to i32
%10 = icmp eq i32 %9, 116
br i1 %10, label %17, label %11
11: ; preds = %1
%12 = load i8*, i8** %3
%13 = getelementptr inbounds i8, i8* %12, i64 0
%14 = load i8, i8* %13
%15 = sext i8 %14 to i32
%16 = icmp eq i32 %15, 84
br i1 %16, label %17, label %18
17: ; preds = %11, %1
store i32 -2, i32* %2
br label %104
18: ; preds = %11
%19 = load i8*, i8** %3
%20 = getelementptr inbounds i8, i8* %19, i64 0
%21 = load i8, i8* %20
%22 = sext i8 %21 to i32
%23 = icmp eq i32 %22, 114
br i1 %23, label %30, label %24
24: ; preds = %18
%25 = load i8*, i8** %3
%26 = getelementptr inbounds i8, i8* %25, i64 0
%27 = load i8, i8* %26
%28 = sext i8 %27 to i32
%29 = icmp eq i32 %28, 82
br i1 %29, label %30, label %31
30: ; preds = %24, %18
store i32 -3, i32* %2
br label %104
31: ; preds = %24
%32 = load i8*, i8** %3
%33 = load i8, i8* %32
%34 = sext i8 %33 to i32
%35 = icmp eq i32 %34, 42
br i1 %35, label %50, label %36
36: ; preds = %31
%37 = load i8*, i8** %3
%38 = load i8, i8* %37
%39 = icmp ne i8 %38, 0
br i1 %39, label %40, label %50
40: ; preds = %36
%41 = load i8*, i8** %3
%42 = load i8, i8* %41
%43 = sext i8 %42 to i32
%44 = icmp slt i32 %43, 48
br i1 %44, label %50, label %45
45: ; preds = %40
%46 = load i8*, i8** %3
%47 = load i8, i8* %46
%48 = sext i8 %47 to i32
%49 = icmp sgt i32 %48, 57
br i1 %49, label %50, label %51
50: ; preds = %45, %40, %36, %31
store i32 -1, i32* %2
br label %104
51: ; preds = %45
br label %52
52: ; preds = %51
br label %53
53: ; preds = %52
%54 = load i8*, i8** %3
store i8* %54, i8** %5
br label %55
55: ; preds = %73, %53
%56 = load i8*, i8** %5
%57 = load i8, i8* %56
%58 = sext i8 %57 to i32
%59 = icmp ne i32 %58, 0
br i1 %59, label %60, label %65
60: ; preds = %55
%61 = load i8*, i8** %5
%62 = load i8, i8* %61
%63 = sext i8 %62 to i32
%64 = icmp sgt i32 %63, 32
br label %65
65: ; preds = %60, %55
%66 = phi i1 [ false, %55 ], [ %64, %60 ]
br i1 %66, label %67, label %76
67: ; preds = %65
%68 = load i8*, i8** %5
%69 = load i8, i8* %68
%70 = sext i8 %69 to i32
%71 = icmp eq i32 %70, 44
br i1 %71, label %72, label %73
72: ; preds = %67
br label %76
73: ; preds = %67
%74 = load i8*, i8** %5
%75 = getelementptr inbounds i8, i8* %74, i32 1
store i8* %75, i8** %5
br label %55
76: ; preds = %72, %65
%77 = load i8*, i8** %5
%78 = load i8, i8* %77
%79 = sext i8 %78 to i32
%80 = icmp eq i32 %79, 44
br i1 %80, label %81, label %92
81: ; preds = %76
%82 = load i8*, i8** %5
%83 = getelementptr inbounds i8, i8* %82, i64 1
%84 = call i32 @atoi(i8* %83)
%85 = and i32 %84, 15
%86 = load i8*, i8** %3
%87 = call i32 @atoi(i8* %86)
%88 = and i32 %87, 15
%89 = mul nsw i32 16, %88
%90 = add nsw i32 %85, %89
%91 = add nsw i32 %90, 256
store i32 %91, i32* %4
br label %102
92: ; preds = %76
%93 = load i8*, i8** %3
%94 = call i32 @atoi(i8* %93)
%95 = and i32 %94, 15
%96 = load i8*, i8** %3
%97 = call i32 @atoi(i8* %96)
%98 = and i32 %97, 15
%99 = mul nsw i32 16, %98
%100 = add nsw i32 %95, %99
%101 = add nsw i32 %100, 256
store i32 %101, i32* %4
br label %102
102: ; preds = %92, %81
%103 = load i32, i32* %4
store i32 %103, i32* %2
br label %104
104: ; preds = %102, %50, %30, %17
%105 = load i32, i32* %2
ret i32 %105
}

LLVM IR (-O2):
define i32 @text2color(i8* nocapture %0) {
%2 = load i8, i8* %0
switch i8 %2, label %4 [
i8 116, label %31
i8 84, label %31
i8 114, label %3
i8 82, label %3
i8 42, label %7
i8 0, label %7
]
3: ; preds = %1, %1
br label %31
4: ; preds = %1
%5 = add i8 %2, -58
%6 = icmp ult i8 %5, -10
br i1 %6, label %7, label %8
7: ; preds = %1, %1, %4
br label %31
8: ; preds = %4, %8
%9 = phi i8* [ %10, %8 ], [ %0, %4 ]
%10 = getelementptr inbounds i8, i8* %9, i64 1
%11 = load i8, i8* %10
%12 = icmp slt i8 %11, 33
%13 = icmp eq i8 %11, 44
%14 = or i1 %12, %13
br i1 %14, label %15, label %8
15: ; preds = %8
br i1 %13, label %16, label %24
16: ; preds = %15
%17 = getelementptr inbounds i8, i8* %9, i64 2
%18 = tail call i32 @atoi(i8* %17)
%19 = and i32 %18, 15
%20 = tail call i32 @atoi(i8* %0)
%21 = shl i32 %20, 4
%22 = and i32 %21, 240
%23 = or i32 %22, %19
br label %28
24: ; preds = %15
%25 = tail call i32 @atoi(i8* %0)
%26 = and i32 %25, 15
%27 = mul nuw nsw i32 %26, 17
br label %28
28: ; preds = %24, %16
%29 = phi i32 [ %23, %16 ], [ %27, %24 ]
%30 = or i32 %29, 256
br label %31
31: ; preds = %1, %1, %28, %7, %3
%32 = phi i32 [ -3, %3 ], [ -1, %7 ], [ %30, %28 ], [ -2, %1 ], [ -2, %1 ]
ret i32 %32
}