#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 */
scalar_t__ strlen(char const *);
const char *ASAPInfo_GetExtDescription(const char *ext) {
  switch ((int)strlen(ext) >> 1 == 1
              ? (ext[0] + (ext[1] << 8) +
                 ((int)strlen(ext) == 3 ? ext[2] << 16 : 0)) |
                    2105376
              : 0) {
  case 7364979:
    return "Slight Atari Player";
  case 6516067:
    return "Chaos Music Composer";
  case 3370339:
    return "CMC \"3/4\"";
  case 7499107:
    return "CMC \"Rzog\"";
  case 7564643:
    return "Stereo Double CMC";
  case 6516068:
    return "DoublePlay CMC";
  case 7629924:
    return "Delta Music Composer";
  case 7630957:
    return "Music ProTracker";
  case 6582381:
    return "MPT DoublePlay";
  case 7630194:
    return "Raster Music Tracker";
  case 6516084:
  case 3698036:
    return "Theta Music Composer 1.x";
  case 3304820:
    return "Theta Music Composer 2.x";
  case 2122598:
    return "Future Composer";
  case 7890296:
    return "Atari 8-bit executable";
  default:
    return NULL;
  }
}


x86 assembly (clang, -O0):
<ASAPInfo_GetExtDescription>:
push   %rbp
mov    %rsp,%rbp
sub    $0x20,%rsp
mov    %rdi,-0x10(%rbp)
mov    -0x10(%rbp),%rdi
call   1030 <strlen@plt>
sar    $0x1,%eax
cmp    $0x1,%eax
jne    118c <ASAPInfo_GetExtDescription+0x7c>
mov    -0x10(%rbp),%rax
movsbl (%rax),%eax
mov    -0x10(%rbp),%rcx
movsbl 0x1(%rcx),%ecx
shl    $0x8,%ecx
add    %ecx,%eax
mov    %eax,-0x14(%rbp)
mov    -0x10(%rbp),%rdi
call   1030 <strlen@plt>
cmp    $0x3,%eax
jne    116d <ASAPInfo_GetExtDescription+0x5d>
mov    -0x10(%rbp),%rax
movsbl 0x2(%rax),%eax
shl    $0x10,%eax
mov    %eax,-0x18(%rbp)
jmp    1177 <ASAPInfo_GetExtDescription+0x67>
xor    %eax,%eax
mov    %eax,-0x18(%rbp)
jmp    1177 <ASAPInfo_GetExtDescription+0x67>
mov    -0x14(%rbp),%eax
mov    -0x18(%rbp),%ecx
add    %ecx,%eax
or     $0x202020,%eax
mov    %eax,-0x1c(%rbp)
jmp    1196 <ASAPInfo_GetExtDescription+0x86>
xor    %eax,%eax
mov    %eax,-0x1c(%rbp)
jmp    1196 <ASAPInfo_GetExtDescription+0x86>
mov    -0x1c(%rbp),%eax
mov    %eax,-0x20(%rbp)
sub    $0x206366,%eax
je     1376 <ASAPInfo_GetExtDescription+0x266>
jmp    11ac <ASAPInfo_GetExtDescription+0x9c>
mov    -0x20(%rbp),%eax
sub    $0x326d74,%eax
je     1366 <ASAPInfo_GetExtDescription+0x256>
jmp    11bf <ASAPInfo_GetExtDescription+0xaf>
mov    -0x20(%rbp),%eax
sub    $0x336d63,%eax
je     12d6 <ASAPInfo_GetExtDescription+0x1c6>
jmp    11d2 <ASAPInfo_GetExtDescription+0xc2>
mov    -0x20(%rbp),%eax
sub    $0x386d74,%eax
je     1356 <ASAPInfo_GetExtDescription+0x246>
jmp    11e5 <ASAPInfo_GetExtDescription+0xd5>
mov    -0x20(%rbp),%eax
sub    $0x636d63,%eax
je     12c6 <ASAPInfo_GetExtDescription+0x1b6>
jmp    11f8 <ASAPInfo_GetExtDescription+0xe8>
mov    -0x20(%rbp),%eax
sub    $0x636d64,%eax
je     1306 <ASAPInfo_GetExtDescription+0x1f6>
jmp    120b <ASAPInfo_GetExtDescription+0xfb>
mov    -0x20(%rbp),%eax
sub    $0x636d74,%eax
je     1356 <ASAPInfo_GetExtDescription+0x246>
jmp    121e <ASAPInfo_GetExtDescription+0x10e>
mov    -0x20(%rbp),%eax
sub    $0x64706d,%eax
je     1336 <ASAPInfo_GetExtDescription+0x226>
jmp    1231 <ASAPInfo_GetExtDescription+0x121>
mov    -0x20(%rbp),%eax
sub    $0x706173,%eax
je     12b6 <ASAPInfo_GetExtDescription+0x1a6>
jmp    1244 <ASAPInfo_GetExtDescription+0x134>
mov    -0x20(%rbp),%eax
sub    $0x726d63,%eax
je     12e6 <ASAPInfo_GetExtDescription+0x1d6>
jmp    1257 <ASAPInfo_GetExtDescription+0x147>
mov    -0x20(%rbp),%eax
sub    $0x736d63,%eax
je     12f6 <ASAPInfo_GetExtDescription+0x1e6>
jmp    126a <ASAPInfo_GetExtDescription+0x15a>
mov    -0x20(%rbp),%eax
sub    $0x746c64,%eax
je     1316 <ASAPInfo_GetExtDescription+0x206>
jmp    127d <ASAPInfo_GetExtDescription+0x16d>
mov    -0x20(%rbp),%eax
sub    $0x746d72,%eax
je     1346 <ASAPInfo_GetExtDescription+0x236>
jmp    1290 <ASAPInfo_GetExtDescription+0x180>
mov    -0x20(%rbp),%eax
sub    $0x74706d,%eax
je     1326 <ASAPInfo_GetExtDescription+0x216>
jmp    12a3 <ASAPInfo_GetExtDescription+0x193>
mov    -0x20(%rbp),%eax
sub    $0x786578,%eax
je     1386 <ASAPInfo_GetExtDescription+0x276>
jmp    1396 <ASAPInfo_GetExtDescription+0x286>
lea    0xd43(%rip),%rax
mov    %rax,-0x8(%rbp)
jmp    139e <ASAPInfo_GetExtDescription+0x28e>
lea    0xd47(%rip),%rax
mov    %rax,-0x8(%rbp)
jmp    139e <ASAPInfo_GetExtDescription+0x28e>
lea    0xd4c(%rip),%rax
mov    %rax,-0x8(%rbp)
jmp    139e <ASAPInfo_GetExtDescription+0x28e>
lea    0xd46(%rip),%rax
mov    %rax,-0x8(%rbp)
jmp    139e <ASAPInfo_GetExtDescription+0x28e>
lea    0xd41(%rip),%rax
mov    %rax,-0x8(%rbp)
jmp    139e <ASAPInfo_GetExtDescription+0x28e>
lea    0xd43(%rip),%rax
mov    %rax,-0x8(%rbp)
jmp    139e <ASAPInfo_GetExtDescription+0x28e>
lea    0xd42(%rip),%rax
mov    %rax,-0x8(%rbp)
jmp    139e <ASAPInfo_GetExtDescription+0x28e>
lea    0xd47(%rip),%rax
mov    %rax,-0x8(%rbp)
jmp    139e <ASAPInfo_GetExtDescription+0x28e>
lea    0xd48(%rip),%rax
mov    %rax,-0x8(%rbp)
jmp    139e <ASAPInfo_GetExtDescription+0x28e>
lea    0xd47(%rip),%rax
mov    %rax,-0x8(%rbp)
jmp    139e <ASAPInfo_GetExtDescription+0x28e>
lea    0xd4c(%rip),%rax
mov    %rax,-0x8(%rbp)
jmp    139e <ASAPInfo_GetExtDescription+0x28e>
lea    0xd55(%rip),%rax
mov    %rax,-0x8(%rbp)
jmp    139e <ASAPInfo_GetExtDescription+0x28e>
lea    0xd5e(%rip),%rax
mov    %rax,-0x8(%rbp)
jmp    139e <ASAPInfo_GetExtDescription+0x28e>
lea    0xd5e(%rip),%rax
mov    %rax,-0x8(%rbp)
jmp    139e <ASAPInfo_GetExtDescription+0x28e>
movq   $0x0,-0x8(%rbp)
mov    -0x8(%rbp),%rax
add    $0x20,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<ASAPInfo_GetExtDescription>:
push   %rbx
mov    %rdi,%rbx
call   1030 <strlen@plt>
mov    %eax,%ecx
and    $0xfffffffe,%ecx
cmp    $0x2,%ecx
jne    124c <ASAPInfo_GetExtDescription+0x13c>
movsbl (%rbx),%edx
movsbl 0x1(%rbx),%ecx
shl    $0x8,%ecx
add    %edx,%ecx
xor    %edx,%edx
cmp    $0x3,%eax
jne    1141 <ASAPInfo_GetExtDescription+0x31>
movsbl 0x2(%rbx),%edx
shl    $0x10,%edx
add    %edx,%ecx
or     $0x202020,%ecx
cmp    $0x64706c,%ecx
jle    1186 <ASAPInfo_GetExtDescription+0x76>
cmp    $0x746c63,%ecx
jg     11bb <ASAPInfo_GetExtDescription+0xab>
cmp    $0x726d62,%ecx
jg     1201 <ASAPInfo_GetExtDescription+0xf1>
cmp    $0x64706d,%ecx
je     1250 <ASAPInfo_GetExtDescription+0x140>
cmp    $0x706173,%ecx
jne    124c <ASAPInfo_GetExtDescription+0x13c>
lea    0xe7c(%rip),%rax
pop    %rbx
ret
cmp    $0x386d73,%ecx
jle    11e0 <ASAPInfo_GetExtDescription+0xd0>
cmp    $0x636d63,%ecx
jg     121a <ASAPInfo_GetExtDescription+0x10a>
cmp    $0x386d74,%ecx
je     122a <ASAPInfo_GetExtDescription+0x11a>
cmp    $0x636d63,%ecx
jne    124c <ASAPInfo_GetExtDescription+0x13c>
lea    0xe5b(%rip),%rax
pop    %rbx
ret
cmp    $0x74706c,%ecx
jg     1233 <ASAPInfo_GetExtDescription+0x123>
cmp    $0x746c64,%ecx
je     1259 <ASAPInfo_GetExtDescription+0x149>
cmp    $0x746d72,%ecx
jne    124c <ASAPInfo_GetExtDescription+0x13c>
lea    0xeb6(%rip),%rax
pop    %rbx
ret
cmp    $0x206366,%ecx
je     1262 <ASAPInfo_GetExtDescription+0x152>
cmp    $0x326d74,%ecx
je     126b <ASAPInfo_GetExtDescription+0x15b>
cmp    $0x336d63,%ecx
jne    124c <ASAPInfo_GetExtDescription+0x13c>
lea    0xe2a(%rip),%rax
pop    %rbx
ret
cmp    $0x726d63,%ecx
je     1274 <ASAPInfo_GetExtDescription+0x164>
cmp    $0x736d63,%ecx
jne    124c <ASAPInfo_GetExtDescription+0x13c>
lea    0xe26(%rip),%rax
pop    %rbx
ret
cmp    $0x636d64,%ecx
je     127d <ASAPInfo_GetExtDescription+0x16d>
cmp    $0x636d74,%ecx
jne    124c <ASAPInfo_GetExtDescription+0x13c>
lea    0xe78(%rip),%rax
pop    %rbx
ret
cmp    $0x74706d,%ecx
je     1286 <ASAPInfo_GetExtDescription+0x176>
cmp    $0x786578,%ecx
jne    124c <ASAPInfo_GetExtDescription+0x13c>
lea    0xea1(%rip),%rax
pop    %rbx
ret
xor    %eax,%eax
pop    %rbx
ret
lea    0xe2e(%rip),%rax
pop    %rbx
ret
lea    0xdff(%rip),%rax
pop    %rbx
ret
lea    0xe72(%rip),%rax
pop    %rbx
ret
lea    0xe50(%rip),%rax
pop    %rbx
ret
lea    0xdb8(%rip),%rax
pop    %rbx
ret
lea    0xdcc(%rip),%rax
pop    %rbx
ret
lea    0xde7(%rip),%rax
pop    %rbx
ret

LLVM IR (-O0):
@.str = [20 x i8] c"Slight Atari Player\00"
@.str.1 = [21 x i8] c"Chaos Music Composer\00"
@.str.2 = [10 x i8] c"CMC \223/4\22\00"
@.str.3 = [11 x i8] c"CMC \22Rzog\22\00"
@.str.4 = [18 x i8] c"Stereo Double CMC\00"
@.str.5 = [15 x i8] c"DoublePlay CMC\00"
@.str.6 = [21 x i8] c"Delta Music Composer\00"
@.str.7 = [17 x i8] c"Music ProTracker\00"
@.str.8 = [15 x i8] c"MPT DoublePlay\00"
@.str.9 = [21 x i8] c"Raster Music Tracker\00"
@.str.10 = [25 x i8] c"Theta Music Composer 1.x\00"
@.str.11 = [25 x i8] c"Theta Music Composer 2.x\00"
@.str.12 = [16 x i8] c"Future Composer\00"
@.str.13 = [23 x i8] c"Atari 8-bit executable\00"
define i8* @ASAPInfo_GetExtDescription(i8* %0) {
%2 = alloca i8*
%3 = alloca i8*
store i8* %0, i8** %3
%4 = load i8*, i8** %3
%5 = call i64 @strlen(i8* %4)
%6 = trunc i64 %5 to i32
%7 = ashr i32 %6, 1
%8 = icmp eq i32 %7, 1
br i1 %8, label %9, label %35
9: ; preds = %1
%10 = load i8*, i8** %3
%11 = getelementptr inbounds i8, i8* %10, i64 0
%12 = load i8, i8* %11
%13 = sext i8 %12 to i32
%14 = load i8*, i8** %3
%15 = getelementptr inbounds i8, i8* %14, i64 1
%16 = load i8, i8* %15
%17 = sext i8 %16 to i32
%18 = shl i32 %17, 8
%19 = add nsw i32 %13, %18
%20 = load i8*, i8** %3
%21 = call i64 @strlen(i8* %20)
%22 = trunc i64 %21 to i32
%23 = icmp eq i32 %22, 3
br i1 %23, label %24, label %30
24: ; preds = %9
%25 = load i8*, i8** %3
%26 = getelementptr inbounds i8, i8* %25, i64 2
%27 = load i8, i8* %26
%28 = sext i8 %27 to i32
%29 = shl i32 %28, 16
br label %31
30: ; preds = %9
br label %31
31: ; preds = %30, %24
%32 = phi i32 [ %29, %24 ], [ 0, %30 ]
%33 = add nsw i32 %19, %32
%34 = or i32 %33, 2105376
br label %36
35: ; preds = %1
br label %36
36: ; preds = %35, %31
%37 = phi i32 [ %34, %31 ], [ 0, %35 ]
switch i32 %37, label %52 [
i32 7364979, label %38
i32 6516067, label %39
i32 3370339, label %40
i32 7499107, label %41
i32 7564643, label %42
i32 6516068, label %43
i32 7629924, label %44
i32 7630957, label %45
i32 6582381, label %46
i32 7630194, label %47
i32 6516084, label %48
i32 3698036, label %48
i32 3304820, label %49
i32 2122598, label %50
i32 7890296, label %51
]
38: ; preds = %36
store i8* getelementptr inbounds ([20 x i8], [20 x i8]* @.str, i64 0, i64 0), i8** %2
br label %53
39: ; preds = %36
store i8* getelementptr inbounds ([21 x i8], [21 x i8]* @.str.1, i64 0, i64 0), i8** %2
br label %53
40: ; preds = %36
store i8* getelementptr inbounds ([10 x i8], [10 x i8]* @.str.2, i64 0, i64 0), i8** %2
br label %53
41: ; preds = %36
store i8* getelementptr inbounds ([11 x i8], [11 x i8]* @.str.3, i64 0, i64 0), i8** %2
br label %53
42: ; preds = %36
store i8* getelementptr inbounds ([18 x i8], [18 x i8]* @.str.4, i64 0, i64 0), i8** %2
br label %53
43: ; preds = %36
store i8* getelementptr inbounds ([15 x i8], [15 x i8]* @.str.5, i64 0, i64 0), i8** %2
br label %53
44: ; preds = %36
store i8* getelementptr inbounds ([21 x i8], [21 x i8]* @.str.6, i64 0, i64 0), i8** %2
br label %53
45: ; preds = %36
store i8* getelementptr inbounds ([17 x i8], [17 x i8]* @.str.7, i64 0, i64 0), i8** %2
br label %53
46: ; preds = %36
store i8* getelementptr inbounds ([15 x i8], [15 x i8]* @.str.8, i64 0, i64 0), i8** %2
br label %53
47: ; preds = %36
store i8* getelementptr inbounds ([21 x i8], [21 x i8]* @.str.9, i64 0, i64 0), i8** %2
br label %53
48: ; preds = %36, %36
store i8* getelementptr inbounds ([25 x i8], [25 x i8]* @.str.10, i64 0, i64 0), i8** %2
br label %53
49: ; preds = %36
store i8* getelementptr inbounds ([25 x i8], [25 x i8]* @.str.11, i64 0, i64 0), i8** %2
br label %53
50: ; preds = %36
store i8* getelementptr inbounds ([16 x i8], [16 x i8]* @.str.12, i64 0, i64 0), i8** %2
br label %53
51: ; preds = %36
store i8* getelementptr inbounds ([23 x i8], [23 x i8]* @.str.13, i64 0, i64 0), i8** %2
br label %53
52: ; preds = %36
store i8* null, i8** %2
br label %53
53: ; preds = %52, %51, %50, %49, %48, %47, %46, %45, %44, %43, %42, %41, %40, %39, %38
%54 = load i8*, i8** %2
ret i8* %54
}

LLVM IR (-O2):
@.str = [20 x i8] c"Slight Atari Player\00"
@.str.1 = [21 x i8] c"Chaos Music Composer\00"
@.str.2 = [10 x i8] c"CMC \223/4\22\00"
@.str.3 = [11 x i8] c"CMC \22Rzog\22\00"
@.str.4 = [18 x i8] c"Stereo Double CMC\00"
@.str.5 = [15 x i8] c"DoublePlay CMC\00"
@.str.6 = [21 x i8] c"Delta Music Composer\00"
@.str.7 = [17 x i8] c"Music ProTracker\00"
@.str.8 = [15 x i8] c"MPT DoublePlay\00"
@.str.9 = [21 x i8] c"Raster Music Tracker\00"
@.str.10 = [25 x i8] c"Theta Music Composer 1.x\00"
@.str.11 = [25 x i8] c"Theta Music Composer 2.x\00"
@.str.12 = [16 x i8] c"Future Composer\00"
@.str.13 = [23 x i8] c"Atari 8-bit executable\00"
define i8* @ASAPInfo_GetExtDescription(i8* nocapture %0) {
%2 = tail call i64 @strlen(i8* dereferenceable(1) %0)
%3 = trunc i64 %2 to i32
%4 = and i32 %3, -2
%5 = icmp eq i32 %4, 2
br i1 %5, label %6, label %37
6: ; preds = %1
%7 = load i8, i8* %0
%8 = sext i8 %7 to i32
%9 = getelementptr inbounds i8, i8* %0, i64 1
%10 = load i8, i8* %9
%11 = sext i8 %10 to i32
%12 = shl nsw i32 %11, 8
%13 = add nsw i32 %12, %8
%14 = icmp eq i32 %3, 3
br i1 %14, label %15, label %20
15: ; preds = %6
%16 = getelementptr inbounds i8, i8* %0, i64 2
%17 = load i8, i8* %16
%18 = sext i8 %17 to i32
%19 = shl nsw i32 %18, 16
br label %20
20: ; preds = %15, %6
%21 = phi i32 [ %19, %15 ], [ 0, %6 ]
%22 = add nsw i32 %13, %21
%23 = or i32 %22, 2105376
switch i32 %23, label %37 [
i32 7364979, label %38
i32 6516067, label %24
i32 3370339, label %25
i32 7499107, label %26
i32 7564643, label %27
i32 6516068, label %28
i32 7629924, label %29
i32 7630957, label %30
i32 6582381, label %31
i32 7630194, label %32
i32 6516084, label %33
i32 3698036, label %33
i32 3304820, label %34
i32 2122598, label %35
i32 7890296, label %36
]
24: ; preds = %20
br label %38
25: ; preds = %20
br label %38
26: ; preds = %20
br label %38
27: ; preds = %20
br label %38
28: ; preds = %20
br label %38
29: ; preds = %20
br label %38
30: ; preds = %20
br label %38
31: ; preds = %20
br label %38
32: ; preds = %20
br label %38
33: ; preds = %20, %20
br label %38
34: ; preds = %20
br label %38
35: ; preds = %20
br label %38
36: ; preds = %20
br label %38
37: ; preds = %1, %20
br label %38
38: ; preds = %20, %37, %36, %35, %34, %33, %32, %31, %30, %29, %28, %27, %26, %25, %24
%39 = phi i8* [ null, %37 ], [ getelementptr inbounds ([23 x i8], [23 x i8]* @.str.13, i64 0, i64 0), %36 ], [ getelementptr inbounds ([16 x i8], [16 x i8]* @.str.12, i64 0, i64 0), %35 ], [ getelementptr inbounds ([25 x i8], [25 x i8]* @.str.11, i64 0, i64 0), %34 ], [ getelementptr inbounds ([25 x i8], [25 x i8]* @.str.10, i64 0, i64 0), %33 ], [ getelementptr inbounds ([21 x i8], [21 x i8]* @.str.9, i64 0, i64 0), %32 ], [ getelementptr inbounds ([15 x i8], [15 x i8]* @.str.8, i64 0, i64 0), %31 ], [ getelementptr inbounds ([17 x i8], [17 x i8]* @.str.7, i64 0, i64 0), %30 ], [ getelementptr inbounds ([21 x i8], [21 x i8]* @.str.6, i64 0, i64 0), %29 ], [ getelementptr inbounds ([15 x i8], [15 x i8]* @.str.5, i64 0, i64 0), %28 ], [ getelementptr inbounds ([18 x i8], [18 x i8]* @.str.4, i64 0, i64 0), %27 ], [ getelementptr inbounds ([11 x i8], [11 x i8]* @.str.3, i64 0, i64 0), %26 ], [ getelementptr inbounds ([10 x i8], [10 x i8]* @.str.2, i64 0, i64 0), %25 ], [ getelementptr inbounds ([21 x i8], [21 x i8]* @.str.1, i64 0, i64 0), %24 ], [ getelementptr inbounds ([20 x i8], [20 x i8]* @.str, i64 0, i64 0), %20 ]
ret i8* %39
}