int tdhfunc(const char *s) {
  int i = 0;
  int ret = 0;
  while (i < 3) {
    int out = 0;
    switch (s[i]) {
    case 'S':
    case 's':
      out += (int)'s';
      break;
    case 'U':
    case 'u':
      out += (int)'u';
      break;
    case 'N':
    case 'n':
      out += (int)'n';
      break;
    case 'M':
    case 'm':
      out += (int)'m';
      break;
    case 'O':
    case 'o':
      out += (int)'o';
      break;
    case 'T':
    case 't':
      out += (int)'t';
      break;
    case 'E':
    case 'e':
      out += (int)'e';
      break;
    case 'W':
    case 'w':
      out += (int)'w';
      break;
    case 'D':
    case 'd':
      out += (int)'d';
      break;
    case 'H':
    case 'h':
      out += (int)'h';
      break;
    case 'F':
    case 'f':
      out += (int)'f';
      break;
    case 'R':
    case 'r':
      out += (int)'r';
      break;
    case 'I':
    case 'i':
      out += (int)'i';
      break;
    case 'A':
    case 'a':
      out += (int)'a';
      break;
    default:
      return -1;
      break;
    }
    ret += out;
    i++;
  }
  return ret;
}


x86 assembly (clang, -O0):
<tdhfunc>:
push   %rbp
mov    %rsp,%rbp
mov    %rdi,-0x10(%rbp)
movl   $0x0,-0x14(%rbp)
movl   $0x0,-0x18(%rbp)
cmpl   $0x3,-0x14(%rbp)
jge    1240 <tdhfunc+0x140>
movl   $0x0,-0x1c(%rbp)
mov    -0x10(%rbp),%rax
movslq -0x14(%rbp),%rcx
movsbl (%rax,%rcx,1),%eax
add    $0xffffffbf,%eax
mov    %eax,%ecx
mov    %rcx,-0x28(%rbp)
sub    $0x36,%eax
ja     121d <tdhfunc+0x11d>
mov    -0x28(%rbp),%rax
lea    0xeb0(%rip),%rcx
movslq (%rcx,%rax,4),%rax
add    %rcx,%rax
jmp    *%rax
mov    -0x1c(%rbp),%eax
add    $0x73,%eax
mov    %eax,-0x1c(%rbp)
jmp    1229 <tdhfunc+0x129>
mov    -0x1c(%rbp),%eax
add    $0x75,%eax
mov    %eax,-0x1c(%rbp)
jmp    1229 <tdhfunc+0x129>
mov    -0x1c(%rbp),%eax
add    $0x6e,%eax
mov    %eax,-0x1c(%rbp)
jmp    1229 <tdhfunc+0x129>
mov    -0x1c(%rbp),%eax
add    $0x6d,%eax
mov    %eax,-0x1c(%rbp)
jmp    1229 <tdhfunc+0x129>
mov    -0x1c(%rbp),%eax
add    $0x6f,%eax
mov    %eax,-0x1c(%rbp)
jmp    1229 <tdhfunc+0x129>
mov    -0x1c(%rbp),%eax
add    $0x74,%eax
mov    %eax,-0x1c(%rbp)
jmp    1229 <tdhfunc+0x129>
mov    -0x1c(%rbp),%eax
add    $0x65,%eax
mov    %eax,-0x1c(%rbp)
jmp    1229 <tdhfunc+0x129>
mov    -0x1c(%rbp),%eax
add    $0x77,%eax
mov    %eax,-0x1c(%rbp)
jmp    1229 <tdhfunc+0x129>
mov    -0x1c(%rbp),%eax
add    $0x64,%eax
mov    %eax,-0x1c(%rbp)
jmp    1229 <tdhfunc+0x129>
mov    -0x1c(%rbp),%eax
add    $0x68,%eax
mov    %eax,-0x1c(%rbp)
jmp    1229 <tdhfunc+0x129>
mov    -0x1c(%rbp),%eax
add    $0x66,%eax
mov    %eax,-0x1c(%rbp)
jmp    1229 <tdhfunc+0x129>
mov    -0x1c(%rbp),%eax
add    $0x72,%eax
mov    %eax,-0x1c(%rbp)
jmp    1229 <tdhfunc+0x129>
mov    -0x1c(%rbp),%eax
add    $0x69,%eax
mov    %eax,-0x1c(%rbp)
jmp    1229 <tdhfunc+0x129>
mov    -0x1c(%rbp),%eax
add    $0x61,%eax
mov    %eax,-0x1c(%rbp)
jmp    1229 <tdhfunc+0x129>
movl   $0xffffffff,-0x4(%rbp)
jmp    1246 <tdhfunc+0x146>
mov    -0x1c(%rbp),%eax
add    -0x18(%rbp),%eax
mov    %eax,-0x18(%rbp)
mov    -0x14(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x14(%rbp)
jmp    1116 <tdhfunc+0x16>
mov    -0x18(%rbp),%eax
mov    %eax,-0x4(%rbp)
mov    -0x4(%rbp),%eax
pop    %rbp
ret

x86 assembly (clang, -O2):
<tdhfunc>:
movsbl (%rdi),%ecx
lea    -0x41(%rcx),%edx
mov    $0xffffffff,%eax
cmp    $0x36,%edx
ja     116b <tdhfunc+0x6b>
movabs $0x5e71b9005e71b9,%rsi
bt     %rdx,%rsi
jae    116b <tdhfunc+0x6b>
movsbl 0x1(%rdi),%r8d
lea    -0x41(%r8),%edx
cmp    $0x36,%edx
ja     116b <tdhfunc+0x6b>
bt     %rdx,%rsi
jae    116b <tdhfunc+0x6b>
movsbl 0x2(%rdi),%edi
lea    -0x41(%rdi),%edx
cmp    $0x36,%edx
ja     116b <tdhfunc+0x6b>
bt     %rdx,%rsi
jae    116b <tdhfunc+0x6b>
movslq %ecx,%rax
lea    0xeb0(%rip),%rcx
mov    -0x104(%rcx,%rax,4),%eax
movslq %r8d,%rdx
add    -0x104(%rcx,%rdx,4),%eax
movslq %edi,%rdx
add    -0x104(%rcx,%rdx,4),%eax
ret

LLVM IR (-O0):
define i32 @tdhfunc(i8* %0) {
%2 = alloca i32
%3 = alloca i8*
%4 = alloca i32
%5 = alloca i32
%6 = alloca i32
store i8* %0, i8** %3
store i32 0, i32* %4
store i32 0, i32* %5
br label %7
7: ; preds = %60, %1
%8 = load i32, i32* %4
%9 = icmp slt i32 %8, 3
br i1 %9, label %10, label %66
10: ; preds = %7
store i32 0, i32* %6
%11 = load i8*, i8** %3
%12 = load i32, i32* %4
%13 = sext i32 %12 to i64
%14 = getelementptr inbounds i8, i8* %11, i64 %13
%15 = load i8, i8* %14
%16 = sext i8 %15 to i32
switch i32 %16, label %59 [
i32 83, label %17
i32 115, label %17
i32 85, label %20
i32 117, label %20
i32 78, label %23
i32 110, label %23
i32 77, label %26
i32 109, label %26
i32 79, label %29
i32 111, label %29
i32 84, label %32
i32 116, label %32
i32 69, label %35
i32 101, label %35
i32 87, label %38
i32 119, label %38
i32 68, label %41
i32 100, label %41
i32 72, label %44
i32 104, label %44
i32 70, label %47
i32 102, label %47
i32 82, label %50
i32 114, label %50
i32 73, label %53
i32 105, label %53
i32 65, label %56
i32 97, label %56
]
17: ; preds = %10, %10
%18 = load i32, i32* %6
%19 = add nsw i32 %18, 115
store i32 %19, i32* %6
br label %60
20: ; preds = %10, %10
%21 = load i32, i32* %6
%22 = add nsw i32 %21, 117
store i32 %22, i32* %6
br label %60
23: ; preds = %10, %10
%24 = load i32, i32* %6
%25 = add nsw i32 %24, 110
store i32 %25, i32* %6
br label %60
26: ; preds = %10, %10
%27 = load i32, i32* %6
%28 = add nsw i32 %27, 109
store i32 %28, i32* %6
br label %60
29: ; preds = %10, %10
%30 = load i32, i32* %6
%31 = add nsw i32 %30, 111
store i32 %31, i32* %6
br label %60
32: ; preds = %10, %10
%33 = load i32, i32* %6
%34 = add nsw i32 %33, 116
store i32 %34, i32* %6
br label %60
35: ; preds = %10, %10
%36 = load i32, i32* %6
%37 = add nsw i32 %36, 101
store i32 %37, i32* %6
br label %60
38: ; preds = %10, %10
%39 = load i32, i32* %6
%40 = add nsw i32 %39, 119
store i32 %40, i32* %6
br label %60
41: ; preds = %10, %10
%42 = load i32, i32* %6
%43 = add nsw i32 %42, 100
store i32 %43, i32* %6
br label %60
44: ; preds = %10, %10
%45 = load i32, i32* %6
%46 = add nsw i32 %45, 104
store i32 %46, i32* %6
br label %60
47: ; preds = %10, %10
%48 = load i32, i32* %6
%49 = add nsw i32 %48, 102
store i32 %49, i32* %6
br label %60
50: ; preds = %10, %10
%51 = load i32, i32* %6
%52 = add nsw i32 %51, 114
store i32 %52, i32* %6
br label %60
53: ; preds = %10, %10
%54 = load i32, i32* %6
%55 = add nsw i32 %54, 105
store i32 %55, i32* %6
br label %60
56: ; preds = %10, %10
%57 = load i32, i32* %6
%58 = add nsw i32 %57, 97
store i32 %58, i32* %6
br label %60
59: ; preds = %10
store i32 -1, i32* %2
br label %68
60: ; preds = %56, %53, %50, %47, %44, %41, %38, %35, %32, %29, %26, %23, %20, %17
%61 = load i32, i32* %6
%62 = load i32, i32* %5
%63 = add nsw i32 %62, %61
store i32 %63, i32* %5
%64 = load i32, i32* %4
%65 = add nsw i32 %64, 1
store i32 %65, i32* %4
br label %7
66: ; preds = %7
%67 = load i32, i32* %5
store i32 %67, i32* %2
br label %68
68: ; preds = %66, %59
%69 = load i32, i32* %2
ret i32 %69
}

LLVM IR (-O2):
@switch.table.tdhfunc.2 = [55 x i32] [i32 97, i32 115, i32 115, i32 100, i32 101, i32 102, i32 115, i32 104, i32 105, i32 115, i32 115, i32 115, i32 109, i32 110, i32 111, i32 115, i32 115, i32 114, i32 115, i32 116, i32 117, i32 115, i32 119, i32 115, i32 115, i32 115, i32 115, i32 115, i32 115, i32 115, i32 115, i32 115, i32 97, i32 115, i32 115, i32 100, i32 101, i32 102, i32 115, i32 104, i32 105, i32 115, i32 115, i32 115, i32 109, i32 110, i32 111, i32 115, i32 115, i32 114, i32 115, i32 116, i32 117, i32 115, i32 119]
define i32 @tdhfunc(i8* nocapture %0) {
%2 = load i8, i8* %0
%3 = sext i8 %2 to i32
%4 = add nsw i32 %3, -65
%5 = icmp ult i32 %4, 55
br i1 %5, label %6, label %45
6: ; preds = %1
%7 = zext i32 %4 to i64
%8 = lshr i64 26583687199879609, %7
%9 = and i64 %8, 1
%10 = icmp eq i64 %9, 0
br i1 %10, label %45, label %11
11: ; preds = %6
%12 = sext i32 %4 to i64
%13 = getelementptr inbounds [55 x i32], [55 x i32]* @switch.table.tdhfunc.2, i64 0, i64 %12
%14 = load i32, i32* %13
%15 = getelementptr inbounds i8, i8* %0, i64 1
%16 = load i8, i8* %15
%17 = sext i8 %16 to i32
%18 = add nsw i32 %17, -65
%19 = icmp ult i32 %18, 55
br i1 %19, label %20, label %45
20: ; preds = %11
%21 = zext i32 %18 to i64
%22 = lshr i64 26583687199879609, %21
%23 = and i64 %22, 1
%24 = icmp eq i64 %23, 0
br i1 %24, label %45, label %25
25: ; preds = %20
%26 = sext i32 %18 to i64
%27 = getelementptr inbounds [55 x i32], [55 x i32]* @switch.table.tdhfunc.2, i64 0, i64 %26
%28 = load i32, i32* %27
%29 = add nuw nsw i32 %28, %14
%30 = getelementptr inbounds i8, i8* %0, i64 2
%31 = load i8, i8* %30
%32 = sext i8 %31 to i32
%33 = add nsw i32 %32, -65
%34 = icmp ult i32 %33, 55
br i1 %34, label %35, label %45
35: ; preds = %25
%36 = zext i32 %33 to i64
%37 = lshr i64 26583687199879609, %36
%38 = and i64 %37, 1
%39 = icmp eq i64 %38, 0
br i1 %39, label %45, label %40
40: ; preds = %35
%41 = sext i32 %33 to i64
%42 = getelementptr inbounds [55 x i32], [55 x i32]* @switch.table.tdhfunc.2, i64 0, i64 %41
%43 = load i32, i32* %42
%44 = add nuw nsw i32 %43, %29
br label %45
45: ; preds = %20, %11, %35, %25, %6, %1, %40
%46 = phi i32 [ -1, %1 ], [ -1, %11 ], [ -1, %25 ], [ %44, %40 ], [ -1, %6 ], [ -1, %35 ], [ -1, %20 ]
ret i32 %46
}