int ft_findtype(char *str) {
  int k;
  char *types;
  k = 0;
  types = "idDsScC%pUOXxou";
  while (types[k] != '\0') {
    if (types[k] == *str)
      return (k);
    k++;
  }
  return (-1);
}


x86 assembly (clang, -O0):
<ft_findtype>:
push   %rbp
mov    %rsp,%rbp
mov    %rdi,-0x10(%rbp)
movl   $0x0,-0x14(%rbp)
lea    0xeea(%rip),%rax
mov    %rax,-0x20(%rbp)
mov    -0x20(%rbp),%rax
movslq -0x14(%rbp),%rcx
movsbl (%rax,%rcx,1),%eax
cmp    $0x0,%eax
je     1163 <ft_findtype+0x63>
mov    -0x20(%rbp),%rax
movslq -0x14(%rbp),%rcx
movsbl (%rax,%rcx,1),%eax
mov    -0x10(%rbp),%rcx
movsbl (%rcx),%ecx
cmp    %ecx,%eax
jne    1155 <ft_findtype+0x55>
mov    -0x14(%rbp),%eax
mov    %eax,-0x4(%rbp)
jmp    116a <ft_findtype+0x6a>
mov    -0x14(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x14(%rbp)
jmp    111a <ft_findtype+0x1a>
movl   $0xffffffff,-0x4(%rbp)
mov    -0x4(%rbp),%eax
pop    %rbp
ret

x86 assembly (clang, -O2):
<ft_findtype>:
mov    (%rdi),%cl
add    $0xdb,%cl
cmp    $0x53,%cl
ja     1125 <ft_findtype+0x25>
xor    %eax,%eax
movzbl %cl,%ecx
lea    0xeea(%rip),%rdx
movslq (%rdx,%rcx,4),%rcx
add    %rdx,%rcx
jmp    *%rcx
mov    $0x7,%eax
ret
mov    $0xffffffff,%eax
ret
mov    $0x6,%eax
ret
mov    $0x2,%eax
ret
mov    $0xa,%eax
ret
mov    $0x4,%eax
ret
mov    $0x9,%eax
ret
mov    $0xb,%eax
ret
mov    $0x5,%eax
ret
mov    $0xd,%eax
ret
mov    $0x8,%eax
ret
mov    $0x3,%eax
ret
mov    $0xe,%eax
ret
mov    $0xc,%eax
ret
mov    $0x1,%eax
ret

LLVM IR (-O0):
@.str = [16 x i8] c"idDsScC%pUOXxou\00"
define i32 @ft_findtype(i8* %0) {
%2 = alloca i32
%3 = alloca i8*
%4 = alloca i32
%5 = alloca i8*
store i8* %0, i8** %3
store i32 0, i32* %4
store i8* getelementptr inbounds ([16 x i8], [16 x i8]* @.str, i64 0, i64 0), i8** %5
br label %6
6: ; preds = %27, %1
%7 = load i8*, i8** %5
%8 = load i32, i32* %4
%9 = sext i32 %8 to i64
%10 = getelementptr inbounds i8, i8* %7, i64 %9
%11 = load i8, i8* %10
%12 = sext i8 %11 to i32
%13 = icmp ne i32 %12, 0
br i1 %13, label %14, label %30
14: ; preds = %6
%15 = load i8*, i8** %5
%16 = load i32, i32* %4
%17 = sext i32 %16 to i64
%18 = getelementptr inbounds i8, i8* %15, i64 %17
%19 = load i8, i8* %18
%20 = sext i8 %19 to i32
%21 = load i8*, i8** %3
%22 = load i8, i8* %21
%23 = sext i8 %22 to i32
%24 = icmp eq i32 %20, %23
br i1 %24, label %25, label %27
25: ; preds = %14
%26 = load i32, i32* %4
store i32 %26, i32* %2
br label %31
27: ; preds = %14
%28 = load i32, i32* %4
%29 = add nsw i32 %28, 1
store i32 %29, i32* %4
br label %6
30: ; preds = %6
store i32 -1, i32* %2
br label %31
31: ; preds = %30, %25
%32 = load i32, i32* %2
ret i32 %32
}

LLVM IR (-O2):
define i32 @ft_findtype(i8* nocapture %0) {
%2 = load i8, i8* %0
switch i8 %2, label %3 [
i8 105, label %18
i8 100, label %4
i8 68, label %5
i8 115, label %6
i8 83, label %7
i8 99, label %8
i8 67, label %9
i8 37, label %10
i8 112, label %11
i8 85, label %12
i8 79, label %13
i8 88, label %14
i8 120, label %15
i8 111, label %16
i8 117, label %17
]
3: ; preds = %1
br label %18
4: ; preds = %1
br label %18
5: ; preds = %1
br label %18
6: ; preds = %1
br label %18
7: ; preds = %1
br label %18
8: ; preds = %1
br label %18
9: ; preds = %1
br label %18
10: ; preds = %1
br label %18
11: ; preds = %1
br label %18
12: ; preds = %1
br label %18
13: ; preds = %1
br label %18
14: ; preds = %1
br label %18
15: ; preds = %1
br label %18
16: ; preds = %1
br label %18
17: ; preds = %1
br label %18
18: ; preds = %1, %17, %16, %15, %14, %13, %12, %11, %10, %9, %8, %7, %6, %5, %4, %3
%19 = phi i32 [ 0, %1 ], [ -1, %3 ], [ 1, %4 ], [ 2, %5 ], [ 3, %6 ], [ 4, %7 ], [ 5, %8 ], [ 6, %9 ], [ 7, %10 ], [ 8, %11 ], [ 9, %12 ], [ 10, %13 ], [ 11, %14 ], [ 12, %15 ], [ 13, %16 ], [ 14, %17 ]
ret i32 %19
}