void nokia_click(char character, int *counter) {
  if (character == 'a' || character == 'd' || character == 'g' ||
      character == 'j' || character == 'm' || character == 'p' ||
      character == 't' || character == 'w' || character == ' ')
    *counter = *counter + 1;
  if (character == 'b' || character == 'e' || character == 'h' ||
      character == 'k' || character == 'n' || character == 'q' ||
      character == 'u' || character == 'x')
    *counter = *counter + 2;
  if (character == 'c' || character == 'f' || character == 'i' ||
      character == 'l' || character == 'o' || character == 'r' ||
      character == 'v' || character == 'y')
    *counter = *counter + 3;
  if (character == 's' || character == 'z')
    *counter = *counter + 4;
}


x86 assembly (clang, -O0):
<nokia_click>:
push   %rbp
mov    %rsp,%rbp
mov    %dil,%al
mov    %al,-0x1(%rbp)
mov    %rsi,-0x10(%rbp)
movsbl -0x1(%rbp),%eax
cmp    $0x61,%eax
je     1183 <nokia_click+0x83>
movsbl -0x1(%rbp),%eax
cmp    $0x64,%eax
je     1183 <nokia_click+0x83>
movsbl -0x1(%rbp),%eax
cmp    $0x67,%eax
je     1183 <nokia_click+0x83>
movsbl -0x1(%rbp),%eax
cmp    $0x6a,%eax
je     1183 <nokia_click+0x83>
movsbl -0x1(%rbp),%eax
cmp    $0x6d,%eax
je     1183 <nokia_click+0x83>
movsbl -0x1(%rbp),%eax
cmp    $0x70,%eax
je     1183 <nokia_click+0x83>
movsbl -0x1(%rbp),%eax
cmp    $0x74,%eax
je     1183 <nokia_click+0x83>
movsbl -0x1(%rbp),%eax
cmp    $0x77,%eax
je     1183 <nokia_click+0x83>
movsbl -0x1(%rbp),%eax
cmp    $0x20,%eax
jne    1192 <nokia_click+0x92>
mov    -0x10(%rbp),%rax
mov    (%rax),%ecx
add    $0x1,%ecx
mov    -0x10(%rbp),%rax
mov    %ecx,(%rax)
movsbl -0x1(%rbp),%eax
cmp    $0x62,%eax
je     11fa <nokia_click+0xfa>
movsbl -0x1(%rbp),%eax
cmp    $0x65,%eax
je     11fa <nokia_click+0xfa>
movsbl -0x1(%rbp),%eax
cmp    $0x68,%eax
je     11fa <nokia_click+0xfa>
movsbl -0x1(%rbp),%eax
cmp    $0x6b,%eax
je     11fa <nokia_click+0xfa>
movsbl -0x1(%rbp),%eax
cmp    $0x6e,%eax
je     11fa <nokia_click+0xfa>
movsbl -0x1(%rbp),%eax
cmp    $0x71,%eax
je     11fa <nokia_click+0xfa>
movsbl -0x1(%rbp),%eax
cmp    $0x75,%eax
je     11fa <nokia_click+0xfa>
movsbl -0x1(%rbp),%eax
cmp    $0x78,%eax
jne    1209 <nokia_click+0x109>
mov    -0x10(%rbp),%rax
mov    (%rax),%ecx
add    $0x2,%ecx
mov    -0x10(%rbp),%rax
mov    %ecx,(%rax)
movsbl -0x1(%rbp),%eax
cmp    $0x63,%eax
je     1271 <nokia_click+0x171>
movsbl -0x1(%rbp),%eax
cmp    $0x66,%eax
je     1271 <nokia_click+0x171>
movsbl -0x1(%rbp),%eax
cmp    $0x69,%eax
je     1271 <nokia_click+0x171>
movsbl -0x1(%rbp),%eax
cmp    $0x6c,%eax
je     1271 <nokia_click+0x171>
movsbl -0x1(%rbp),%eax
cmp    $0x6f,%eax
je     1271 <nokia_click+0x171>
movsbl -0x1(%rbp),%eax
cmp    $0x72,%eax
je     1271 <nokia_click+0x171>
movsbl -0x1(%rbp),%eax
cmp    $0x76,%eax
je     1271 <nokia_click+0x171>
movsbl -0x1(%rbp),%eax
cmp    $0x79,%eax
jne    1280 <nokia_click+0x180>
mov    -0x10(%rbp),%rax
mov    (%rax),%ecx
add    $0x3,%ecx
mov    -0x10(%rbp),%rax
mov    %ecx,(%rax)
movsbl -0x1(%rbp),%eax
cmp    $0x73,%eax
je     129a <nokia_click+0x19a>
movsbl -0x1(%rbp),%eax
cmp    $0x7a,%eax
jne    12a9 <nokia_click+0x1a9>
mov    -0x10(%rbp),%rax
mov    (%rax),%ecx
add    $0x4,%ecx
mov    -0x10(%rbp),%rax
mov    %ecx,(%rax)
pop    %rbp
ret

x86 assembly (clang, -O2):
<nokia_click>:
lea    -0x20(%rdi),%eax
cmp    $0x5a,%al
ja     1163 <nokia_click+0x63>
movzbl %al,%eax
lea    0xeef(%rip),%rcx
movslq (%rcx,%rax,4),%rax
add    %rcx,%rax
jmp    *%rax
addl   $0x1,(%rsi)
lea    -0x62(%rdi),%eax
cmp    $0x14,%al
ja     115a <nokia_click+0x5a>
movzbl %al,%eax
mov    $0x89249,%ecx
bt     %rax,%rcx
jb     113f <nokia_click+0x3f>
mov    $0x112492,%ecx
bt     %rax,%rcx
jb     1157 <nokia_click+0x57>
jmp    115a <nokia_click+0x5a>
addl   $0x2,(%rsi)
lea    -0x63(%rdi),%eax
cmp    $0x13,%al
ja     1163 <nokia_click+0x63>
movzbl %al,%eax
mov    $0x89249,%ecx
bt     %rax,%rcx
jae    1164 <nokia_click+0x64>
addl   $0x3,(%rsi)
cmp    $0x73,%dil
jne    1163 <nokia_click+0x63>
addl   $0x4,(%rsi)
ret
cmp    $0x10,%rax
je     1160 <nokia_click+0x60>
jmp    1163 <nokia_click+0x63>

LLVM IR (-O0):
define void @nokia_click(i8 signext %0, i32* %1) {
%3 = alloca i8
%4 = alloca i32*
store i8 %0, i8* %3
store i32* %1, i32** %4
%5 = load i8, i8* %3
%6 = sext i8 %5 to i32
%7 = icmp eq i32 %6, 97
br i1 %7, label %40, label %8
8: ; preds = %2
%9 = load i8, i8* %3
%10 = sext i8 %9 to i32
%11 = icmp eq i32 %10, 100
br i1 %11, label %40, label %12
12: ; preds = %8
%13 = load i8, i8* %3
%14 = sext i8 %13 to i32
%15 = icmp eq i32 %14, 103
br i1 %15, label %40, label %16
16: ; preds = %12
%17 = load i8, i8* %3
%18 = sext i8 %17 to i32
%19 = icmp eq i32 %18, 106
br i1 %19, label %40, label %20
20: ; preds = %16
%21 = load i8, i8* %3
%22 = sext i8 %21 to i32
%23 = icmp eq i32 %22, 109
br i1 %23, label %40, label %24
24: ; preds = %20
%25 = load i8, i8* %3
%26 = sext i8 %25 to i32
%27 = icmp eq i32 %26, 112
br i1 %27, label %40, label %28
28: ; preds = %24
%29 = load i8, i8* %3
%30 = sext i8 %29 to i32
%31 = icmp eq i32 %30, 116
br i1 %31, label %40, label %32
32: ; preds = %28
%33 = load i8, i8* %3
%34 = sext i8 %33 to i32
%35 = icmp eq i32 %34, 119
br i1 %35, label %40, label %36
36: ; preds = %32
%37 = load i8, i8* %3
%38 = sext i8 %37 to i32
%39 = icmp eq i32 %38, 32
br i1 %39, label %40, label %45
40: ; preds = %36, %32, %28, %24, %20, %16, %12, %8, %2
%41 = load i32*, i32** %4
%42 = load i32, i32* %41
%43 = add nsw i32 %42, 1
%44 = load i32*, i32** %4
store i32 %43, i32* %44
br label %45
45: ; preds = %40, %36
%46 = load i8, i8* %3
%47 = sext i8 %46 to i32
%48 = icmp eq i32 %47, 98
br i1 %48, label %77, label %49
49: ; preds = %45
%50 = load i8, i8* %3
%51 = sext i8 %50 to i32
%52 = icmp eq i32 %51, 101
br i1 %52, label %77, label %53
53: ; preds = %49
%54 = load i8, i8* %3
%55 = sext i8 %54 to i32
%56 = icmp eq i32 %55, 104
br i1 %56, label %77, label %57
57: ; preds = %53
%58 = load i8, i8* %3
%59 = sext i8 %58 to i32
%60 = icmp eq i32 %59, 107
br i1 %60, label %77, label %61
61: ; preds = %57
%62 = load i8, i8* %3
%63 = sext i8 %62 to i32
%64 = icmp eq i32 %63, 110
br i1 %64, label %77, label %65
65: ; preds = %61
%66 = load i8, i8* %3
%67 = sext i8 %66 to i32
%68 = icmp eq i32 %67, 113
br i1 %68, label %77, label %69
69: ; preds = %65
%70 = load i8, i8* %3
%71 = sext i8 %70 to i32
%72 = icmp eq i32 %71, 117
br i1 %72, label %77, label %73
73: ; preds = %69
%74 = load i8, i8* %3
%75 = sext i8 %74 to i32
%76 = icmp eq i32 %75, 120
br i1 %76, label %77, label %82
77: ; preds = %73, %69, %65, %61, %57, %53, %49, %45
%78 = load i32*, i32** %4
%79 = load i32, i32* %78
%80 = add nsw i32 %79, 2
%81 = load i32*, i32** %4
store i32 %80, i32* %81
br label %82
82: ; preds = %77, %73
%83 = load i8, i8* %3
%84 = sext i8 %83 to i32
%85 = icmp eq i32 %84, 99
br i1 %85, label %114, label %86
86: ; preds = %82
%87 = load i8, i8* %3
%88 = sext i8 %87 to i32
%89 = icmp eq i32 %88, 102
br i1 %89, label %114, label %90
90: ; preds = %86
%91 = load i8, i8* %3
%92 = sext i8 %91 to i32
%93 = icmp eq i32 %92, 105
br i1 %93, label %114, label %94
94: ; preds = %90
%95 = load i8, i8* %3
%96 = sext i8 %95 to i32
%97 = icmp eq i32 %96, 108
br i1 %97, label %114, label %98
98: ; preds = %94
%99 = load i8, i8* %3
%100 = sext i8 %99 to i32
%101 = icmp eq i32 %100, 111
br i1 %101, label %114, label %102
102: ; preds = %98
%103 = load i8, i8* %3
%104 = sext i8 %103 to i32
%105 = icmp eq i32 %104, 114
br i1 %105, label %114, label %106
106: ; preds = %102
%107 = load i8, i8* %3
%108 = sext i8 %107 to i32
%109 = icmp eq i32 %108, 118
br i1 %109, label %114, label %110
110: ; preds = %106
%111 = load i8, i8* %3
%112 = sext i8 %111 to i32
%113 = icmp eq i32 %112, 121
br i1 %113, label %114, label %119
114: ; preds = %110, %106, %102, %98, %94, %90, %86, %82
%115 = load i32*, i32** %4
%116 = load i32, i32* %115
%117 = add nsw i32 %116, 3
%118 = load i32*, i32** %4
store i32 %117, i32* %118
br label %119
119: ; preds = %114, %110
%120 = load i8, i8* %3
%121 = sext i8 %120 to i32
%122 = icmp eq i32 %121, 115
br i1 %122, label %127, label %123
123: ; preds = %119
%124 = load i8, i8* %3
%125 = sext i8 %124 to i32
%126 = icmp eq i32 %125, 122
br i1 %126, label %127, label %132
127: ; preds = %123, %119
%128 = load i32*, i32** %4
%129 = load i32, i32* %128
%130 = add nsw i32 %129, 4
%131 = load i32*, i32** %4
store i32 %130, i32* %131
br label %132
132: ; preds = %127, %123
ret void
}

LLVM IR (-O2):
define void @nokia_click(i8 signext %0, i32* nocapture %1) {
switch i8 %0, label %17 [
i8 119, label %3
i8 116, label %3
i8 112, label %3
i8 109, label %3
i8 106, label %3
i8 103, label %3
i8 100, label %3
i8 97, label %3
i8 32, label %3
i8 120, label %6
i8 117, label %6
i8 113, label %6
i8 110, label %6
i8 107, label %6
i8 104, label %6
i8 101, label %6
i8 98, label %6
i8 121, label %9
i8 118, label %9
i8 114, label %9
i8 111, label %9
i8 108, label %9
i8 105, label %9
i8 102, label %9
i8 99, label %9
i8 122, label %14
i8 115, label %14
]
3: ; preds = %2, %2, %2, %2, %2, %2, %2, %2, %2
%4 = load i32, i32* %1
%5 = add nsw i32 %4, 1
store i32 %5, i32* %1
switch i8 %0, label %12 [
i8 99, label %9
i8 117, label %6
i8 113, label %6
i8 110, label %6
i8 107, label %6
i8 104, label %6
i8 101, label %6
i8 98, label %6
i8 102, label %9
i8 118, label %9
i8 114, label %9
i8 111, label %9
i8 108, label %9
i8 105, label %9
]
6: ; preds = %2, %2, %2, %2, %2, %2, %2, %2, %3, %3, %3, %3, %3, %3, %3
%7 = load i32, i32* %1
%8 = add nsw i32 %7, 2
store i32 %8, i32* %1
switch i8 %0, label %17 [
i8 99, label %9
i8 118, label %9
i8 114, label %9
i8 111, label %9
i8 108, label %9
i8 105, label %9
i8 102, label %9
i8 115, label %14
]
9: ; preds = %6, %6, %6, %6, %6, %6, %6, %3, %3, %2, %2, %2, %2, %2, %2, %2, %2, %3, %3, %3, %3, %3
%10 = load i32, i32* %1
%11 = add nsw i32 %10, 3
store i32 %11, i32* %1
br label %12
12: ; preds = %3, %9
%13 = icmp eq i8 %0, 115
br i1 %13, label %14, label %17
14: ; preds = %6, %12, %2, %2
%15 = load i32, i32* %1
%16 = add nsw i32 %15, 4
store i32 %16, i32* %1
br label %17
17: ; preds = %6, %12, %2, %14
ret void
}