char screen_str(char *str) {
  if (str[0] == 27) {
    if (str[1] == 91) {
      switch (str[2]) {
      case 65:
        return 'u';
      case 66:
        return 'd';
      case 67:
        return 'r';
      case 68:
        return 'l';
      }
    }
  }
  return -1;
}


x86 assembly (clang, -O0):
<screen_str>:
push   %rbp
mov    %rsp,%rbp
mov    %rdi,-0x10(%rbp)
mov    -0x10(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x1b,%eax
jne    1185 <screen_str+0x85>
mov    -0x10(%rbp),%rax
movsbl 0x1(%rax),%eax
cmp    $0x5b,%eax
jne    1180 <screen_str+0x80>
mov    -0x10(%rbp),%rax
movsbl 0x2(%rax),%eax
add    $0xffffffbf,%eax
mov    %eax,%ecx
mov    %rcx,-0x18(%rbp)
sub    $0x3,%eax
ja     117b <screen_str+0x7b>
mov    -0x18(%rbp),%rax
lea    0xeb2(%rip),%rcx
movslq (%rcx,%rax,4),%rax
add    %rcx,%rax
jmp    *%rax
movb   $0x75,-0x1(%rbp)
jmp    1189 <screen_str+0x89>
movb   $0x64,-0x1(%rbp)
jmp    1189 <screen_str+0x89>
movb   $0x72,-0x1(%rbp)
jmp    1189 <screen_str+0x89>
movb   $0x6c,-0x1(%rbp)
jmp    1189 <screen_str+0x89>
jmp    1180 <screen_str+0x80>
jmp    1185 <screen_str+0x85>
movb   $0xff,-0x1(%rbp)
movsbl -0x1(%rbp),%eax
pop    %rbp
ret

x86 assembly (clang, -O2):
<screen_str>:
mov    $0xff,%al
cmpb   $0x1b,(%rdi)
jne    1123 <screen_str+0x23>
cmpb   $0x5b,0x1(%rdi)
jne    1123 <screen_str+0x23>
movsbl 0x2(%rdi),%ecx
add    $0xffffffbf,%ecx
cmp    $0x3,%ecx
ja     1123 <screen_str+0x23>
shl    $0x3,%ecx
mov    $0x6c726475,%eax
shr    %cl,%eax
ret

LLVM IR (-O0):
define signext i8 @screen_str(i8* %0) {
%2 = alloca i8
%3 = alloca i8*
store i8* %0, i8** %3
%4 = load i8*, i8** %3
%5 = getelementptr inbounds i8, i8* %4, i64 0
%6 = load i8, i8* %5
%7 = sext i8 %6 to i32
%8 = icmp eq i32 %7, 27
br i1 %8, label %9, label %26
9: ; preds = %1
%10 = load i8*, i8** %3
%11 = getelementptr inbounds i8, i8* %10, i64 1
%12 = load i8, i8* %11
%13 = sext i8 %12 to i32
%14 = icmp eq i32 %13, 91
br i1 %14, label %15, label %25
15: ; preds = %9
%16 = load i8*, i8** %3
%17 = getelementptr inbounds i8, i8* %16, i64 2
%18 = load i8, i8* %17
%19 = sext i8 %18 to i32
switch i32 %19, label %24 [
i32 65, label %20
i32 66, label %21
i32 67, label %22
i32 68, label %23
]
20: ; preds = %15
store i8 117, i8* %2
br label %27
21: ; preds = %15
store i8 100, i8* %2
br label %27
22: ; preds = %15
store i8 114, i8* %2
br label %27
23: ; preds = %15
store i8 108, i8* %2
br label %27
24: ; preds = %15
br label %25
25: ; preds = %24, %9
br label %26
26: ; preds = %25, %1
store i8 -1, i8* %2
br label %27
27: ; preds = %26, %23, %22, %21, %20
%28 = load i8, i8* %2
ret i8 %28
}

LLVM IR (-O2):
define signext i8 @screen_str(i8* nocapture %0) {
%2 = load i8, i8* %0
%3 = icmp eq i8 %2, 27
br i1 %3, label %4, label %18
4: ; preds = %1
%5 = getelementptr inbounds i8, i8* %0, i64 1
%6 = load i8, i8* %5
%7 = icmp eq i8 %6, 91
br i1 %7, label %8, label %18
8: ; preds = %4
%9 = getelementptr inbounds i8, i8* %0, i64 2
%10 = load i8, i8* %9
%11 = sext i8 %10 to i32
%12 = add nsw i32 %11, -65
%13 = icmp ult i32 %12, 4
br i1 %13, label %14, label %18
14: ; preds = %8
%15 = shl nsw i32 %12, 3
%16 = lshr i32 1819436149, %15
%17 = trunc i32 %16 to i8
br label %18
18: ; preds = %1, %4, %8, %14
%19 = phi i8 [ %17, %14 ], [ -1, %8 ], [ -1, %4 ], [ -1, %1 ]
ret i8 %19
}