void soundex(char *input, char *output) {
  int i = 1, index = 1;
  char temp;
  output[0] = input[0];
  while (input[i] != '\0' && index < 4) {
    if (input[i] == 'b' || input[i] == 'p' || input[i] == 'f' ||
        input[i] == 'v')
      temp = '1';
    else if (input[i] == 'c' || input[i] == 's' || input[i] == 'k' ||
             input[i] == 'g' || input[i] == 'j' || input[i] == 'q' ||
             input[i] == 'x' || input[i] == 'z')
      temp = '2';
    else if (input[i] == 'd' || input[i] == 't')
      temp = '3';
    else if (input[i] == 'l')
      temp = '4';
    else if (input[i] == 'm' || input[i] == 'n')
      temp = '5';
    else if (input[i] == 'r')
      temp = '6';
    else
      temp = '0';
    if (temp != '0' && temp != output[index - 1]) {
      output[index] = temp;
      index++;
    }
    i++;
  }
  while (index < 4)
    output[index++] = '0';
  output[index] = '\0';
}


x86 assembly (clang, -O0):
<soundex>:
push   %rbp
mov    %rsp,%rbp
mov    %rdi,-0x8(%rbp)
mov    %rsi,-0x10(%rbp)
movl   $0x1,-0x14(%rbp)
movl   $0x1,-0x18(%rbp)
mov    -0x8(%rbp),%rax
mov    (%rax),%cl
mov    -0x10(%rbp),%rax
mov    %cl,(%rax)
mov    -0x8(%rbp),%rax
movslq -0x14(%rbp),%rcx
movsbl (%rax,%rcx,1),%ecx
xor    %eax,%eax
cmp    $0x0,%ecx
mov    %al,-0x1a(%rbp)
je     114a <soundex+0x4a>
cmpl   $0x4,-0x18(%rbp)
setl   %al
mov    %al,-0x1a(%rbp)
mov    -0x1a(%rbp),%al
test   $0x1,%al
jne    115a <soundex+0x5a>
jmp    1376 <soundex+0x276>
mov    -0x8(%rbp),%rax
movslq -0x14(%rbp),%rcx
movsbl (%rax,%rcx,1),%eax
cmp    $0x62,%eax
je     11ae <soundex+0xae>
mov    -0x8(%rbp),%rax
movslq -0x14(%rbp),%rcx
movsbl (%rax,%rcx,1),%eax
cmp    $0x70,%eax
je     11ae <soundex+0xae>
mov    -0x8(%rbp),%rax
movslq -0x14(%rbp),%rcx
movsbl (%rax,%rcx,1),%eax
cmp    $0x66,%eax
je     11ae <soundex+0xae>
mov    -0x8(%rbp),%rax
movslq -0x14(%rbp),%rcx
movsbl (%rax,%rcx,1),%eax
cmp    $0x76,%eax
jne    11b7 <soundex+0xb7>
movb   $0x31,-0x19(%rbp)
jmp    1327 <soundex+0x227>
mov    -0x8(%rbp),%rax
movslq -0x14(%rbp),%rcx
movsbl (%rax,%rcx,1),%eax
cmp    $0x63,%eax
je     125f <soundex+0x15f>
mov    -0x8(%rbp),%rax
movslq -0x14(%rbp),%rcx
movsbl (%rax,%rcx,1),%eax
cmp    $0x73,%eax
je     125f <soundex+0x15f>
mov    -0x8(%rbp),%rax
movslq -0x14(%rbp),%rcx
movsbl (%rax,%rcx,1),%eax
cmp    $0x6b,%eax
je     125f <soundex+0x15f>
mov    -0x8(%rbp),%rax
movslq -0x14(%rbp),%rcx
movsbl (%rax,%rcx,1),%eax
cmp    $0x67,%eax
je     125f <soundex+0x15f>
mov    -0x8(%rbp),%rax
movslq -0x14(%rbp),%rcx
movsbl (%rax,%rcx,1),%eax
cmp    $0x6a,%eax
je     125f <soundex+0x15f>
mov    -0x8(%rbp),%rax
movslq -0x14(%rbp),%rcx
movsbl (%rax,%rcx,1),%eax
cmp    $0x71,%eax
je     125f <soundex+0x15f>
mov    -0x8(%rbp),%rax
movslq -0x14(%rbp),%rcx
movsbl (%rax,%rcx,1),%eax
cmp    $0x78,%eax
je     125f <soundex+0x15f>
mov    -0x8(%rbp),%rax
movslq -0x14(%rbp),%rcx
movsbl (%rax,%rcx,1),%eax
cmp    $0x7a,%eax
jne    1268 <soundex+0x168>
movb   $0x32,-0x19(%rbp)
jmp    1322 <soundex+0x222>
mov    -0x8(%rbp),%rax
movslq -0x14(%rbp),%rcx
movsbl (%rax,%rcx,1),%eax
cmp    $0x64,%eax
je     1292 <soundex+0x192>
mov    -0x8(%rbp),%rax
movslq -0x14(%rbp),%rcx
movsbl (%rax,%rcx,1),%eax
cmp    $0x74,%eax
jne    129b <soundex+0x19b>
movb   $0x33,-0x19(%rbp)
jmp    131d <soundex+0x21d>
mov    -0x8(%rbp),%rax
movslq -0x14(%rbp),%rcx
movsbl (%rax,%rcx,1),%eax
cmp    $0x6c,%eax
jne    12b9 <soundex+0x1b9>
movb   $0x34,-0x19(%rbp)
jmp    1318 <soundex+0x218>
mov    -0x8(%rbp),%rax
movslq -0x14(%rbp),%rcx
movsbl (%rax,%rcx,1),%eax
cmp    $0x6d,%eax
je     12e3 <soundex+0x1e3>
mov    -0x8(%rbp),%rax
movslq -0x14(%rbp),%rcx
movsbl (%rax,%rcx,1),%eax
cmp    $0x6e,%eax
jne    12ec <soundex+0x1ec>
movb   $0x35,-0x19(%rbp)
jmp    1313 <soundex+0x213>
mov    -0x8(%rbp),%rax
movslq -0x14(%rbp),%rcx
movsbl (%rax,%rcx,1),%eax
cmp    $0x72,%eax
jne    130a <soundex+0x20a>
movb   $0x36,-0x19(%rbp)
jmp    130e <soundex+0x20e>
movb   $0x30,-0x19(%rbp)
jmp    1313 <soundex+0x213>
jmp    1318 <soundex+0x218>
jmp    131d <soundex+0x21d>
jmp    1322 <soundex+0x222>
jmp    1327 <soundex+0x227>
movsbl -0x19(%rbp),%eax
cmp    $0x30,%eax
je     1368 <soundex+0x268>
movsbl -0x19(%rbp),%eax
mov    -0x10(%rbp),%rcx
mov    -0x18(%rbp),%edx
sub    $0x1,%edx
movslq %edx,%rdx
movsbl (%rcx,%rdx,1),%ecx
cmp    %ecx,%eax
je     1368 <soundex+0x268>
mov    -0x19(%rbp),%dl
mov    -0x10(%rbp),%rax
movslq -0x18(%rbp),%rcx
mov    %dl,(%rax,%rcx,1)
mov    -0x18(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x18(%rbp)
mov    -0x14(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x14(%rbp)
jmp    1126 <soundex+0x26>
jmp    137b <soundex+0x27b>
cmpl   $0x4,-0x18(%rbp)
jge    13a0 <soundex+0x2a0>
mov    -0x10(%rbp),%rax
mov    -0x18(%rbp),%ecx
mov    %ecx,%edx
add    $0x1,%edx
mov    %edx,-0x18(%rbp)
movslq %ecx,%rcx
movb   $0x30,(%rax,%rcx,1)
jmp    137b <soundex+0x27b>
mov    -0x10(%rbp),%rax
movslq -0x18(%rbp),%rcx
movb   $0x0,(%rax,%rcx,1)
pop    %rbp
ret

x86 assembly (clang, -O2):
<soundex>:
push   %rbx
mov    %rsi,%rbx
mov    (%rdi),%al
mov    %al,(%rsi)
mov    0x1(%rdi),%dl
test   %dl,%dl
je     1187 <soundex+0x77>
add    $0x2,%rdi
mov    $0x1,%eax
mov    $0x157df37,%r9d
lea    0xecb(%rip),%r8
cs nopw 0x0(%rax,%rax,1)
nop
add    $0x9e,%dl
cmp    $0x18,%dl
ja     1170 <soundex+0x60>
movzbl %dl,%esi
bt     %esi,%r9d
jae    1170 <soundex+0x60>
movsbq %dl,%rdx
movzbl (%rdx,%r8,1),%esi
movslq %eax,%rdx
movsbl -0x1(%rdx,%rbx,1),%ecx
cmp    %ecx,%esi
je     1170 <soundex+0x60>
mov    %sil,(%rbx,%rdx,1)
add    $0x1,%edx
mov    %edx,%eax
nop
movzbl (%rdi),%edx
test   %dl,%dl
je     1180 <soundex+0x70>
add    $0x1,%rdi
cmp    $0x4,%eax
jl     1140 <soundex+0x30>
cmp    $0x3,%eax
jle    118c <soundex+0x7c>
jmp    11a7 <soundex+0x97>
mov    $0x1,%eax
cltq
lea    (%rbx,%rax,1),%rdi
mov    $0x3,%edx
sub    %eax,%edx
add    $0x1,%rdx
mov    $0x30,%esi
call   1030 <memset@plt>
movb   $0x0,0x4(%rbx)
pop    %rbx
ret

LLVM IR (-O0):
define void @soundex(i8* %0, i8* %1) {
%3 = alloca i8*
%4 = alloca i8*
%5 = alloca i32
%6 = alloca i32
%7 = alloca i8
store i8* %0, i8** %3
store i8* %1, i8** %4
store i32 1, i32* %5
store i32 1, i32* %6
%8 = load i8*, i8** %3
%9 = getelementptr inbounds i8, i8* %8, i64 0
%10 = load i8, i8* %9
%11 = load i8*, i8** %4
%12 = getelementptr inbounds i8, i8* %11, i64 0
store i8 %10, i8* %12
br label %13
13: ; preds = %205, %2
%14 = load i8*, i8** %3
%15 = load i32, i32* %5
%16 = sext i32 %15 to i64
%17 = getelementptr inbounds i8, i8* %14, i64 %16
%18 = load i8, i8* %17
%19 = sext i8 %18 to i32
%20 = icmp ne i32 %19, 0
br i1 %20, label %21, label %24
21: ; preds = %13
%22 = load i32, i32* %6
%23 = icmp slt i32 %22, 4
br label %24
24: ; preds = %21, %13
%25 = phi i1 [ false, %13 ], [ %23, %21 ]
br i1 %25, label %26, label %208
26: ; preds = %24
%27 = load i8*, i8** %3
%28 = load i32, i32* %5
%29 = sext i32 %28 to i64
%30 = getelementptr inbounds i8, i8* %27, i64 %29
%31 = load i8, i8* %30
%32 = sext i8 %31 to i32
%33 = icmp eq i32 %32, 98
br i1 %33, label %58, label %34
34: ; preds = %26
%35 = load i8*, i8** %3
%36 = load i32, i32* %5
%37 = sext i32 %36 to i64
%38 = getelementptr inbounds i8, i8* %35, i64 %37
%39 = load i8, i8* %38
%40 = sext i8 %39 to i32
%41 = icmp eq i32 %40, 112
br i1 %41, label %58, label %42
42: ; preds = %34
%43 = load i8*, i8** %3
%44 = load i32, i32* %5
%45 = sext i32 %44 to i64
%46 = getelementptr inbounds i8, i8* %43, i64 %45
%47 = load i8, i8* %46
%48 = sext i8 %47 to i32
%49 = icmp eq i32 %48, 102
br i1 %49, label %58, label %50
50: ; preds = %42
%51 = load i8*, i8** %3
%52 = load i32, i32* %5
%53 = sext i32 %52 to i64
%54 = getelementptr inbounds i8, i8* %51, i64 %53
%55 = load i8, i8* %54
%56 = sext i8 %55 to i32
%57 = icmp eq i32 %56, 118
br i1 %57, label %58, label %59
58: ; preds = %50, %42, %34, %26
store i8 49, i8* %7
br label %182
59: ; preds = %50
%60 = load i8*, i8** %3
%61 = load i32, i32* %5
%62 = sext i32 %61 to i64
%63 = getelementptr inbounds i8, i8* %60, i64 %62
%64 = load i8, i8* %63
%65 = sext i8 %64 to i32
%66 = icmp eq i32 %65, 99
br i1 %66, label %123, label %67
67: ; preds = %59
%68 = load i8*, i8** %3
%69 = load i32, i32* %5
%70 = sext i32 %69 to i64
%71 = getelementptr inbounds i8, i8* %68, i64 %70
%72 = load i8, i8* %71
%73 = sext i8 %72 to i32
%74 = icmp eq i32 %73, 115
br i1 %74, label %123, label %75
75: ; preds = %67
%76 = load i8*, i8** %3
%77 = load i32, i32* %5
%78 = sext i32 %77 to i64
%79 = getelementptr inbounds i8, i8* %76, i64 %78
%80 = load i8, i8* %79
%81 = sext i8 %80 to i32
%82 = icmp eq i32 %81, 107
br i1 %82, label %123, label %83
83: ; preds = %75
%84 = load i8*, i8** %3
%85 = load i32, i32* %5
%86 = sext i32 %85 to i64
%87 = getelementptr inbounds i8, i8* %84, i64 %86
%88 = load i8, i8* %87
%89 = sext i8 %88 to i32
%90 = icmp eq i32 %89, 103
br i1 %90, label %123, label %91
91: ; preds = %83
%92 = load i8*, i8** %3
%93 = load i32, i32* %5
%94 = sext i32 %93 to i64
%95 = getelementptr inbounds i8, i8* %92, i64 %94
%96 = load i8, i8* %95
%97 = sext i8 %96 to i32
%98 = icmp eq i32 %97, 106
br i1 %98, label %123, label %99
99: ; preds = %91
%100 = load i8*, i8** %3
%101 = load i32, i32* %5
%102 = sext i32 %101 to i64
%103 = getelementptr inbounds i8, i8* %100, i64 %102
%104 = load i8, i8* %103
%105 = sext i8 %104 to i32
%106 = icmp eq i32 %105, 113
br i1 %106, label %123, label %107
107: ; preds = %99
%108 = load i8*, i8** %3
%109 = load i32, i32* %5
%110 = sext i32 %109 to i64
%111 = getelementptr inbounds i8, i8* %108, i64 %110
%112 = load i8, i8* %111
%113 = sext i8 %112 to i32
%114 = icmp eq i32 %113, 120
br i1 %114, label %123, label %115
115: ; preds = %107
%116 = load i8*, i8** %3
%117 = load i32, i32* %5
%118 = sext i32 %117 to i64
%119 = getelementptr inbounds i8, i8* %116, i64 %118
%120 = load i8, i8* %119
%121 = sext i8 %120 to i32
%122 = icmp eq i32 %121, 122
br i1 %122, label %123, label %124
123: ; preds = %115, %107, %99, %91, %83, %75, %67, %59
store i8 50, i8* %7
br label %181
124: ; preds = %115
%125 = load i8*, i8** %3
%126 = load i32, i32* %5
%127 = sext i32 %126 to i64
%128 = getelementptr inbounds i8, i8* %125, i64 %127
%129 = load i8, i8* %128
%130 = sext i8 %129 to i32
%131 = icmp eq i32 %130, 100
br i1 %131, label %140, label %132
132: ; preds = %124
%133 = load i8*, i8** %3
%134 = load i32, i32* %5
%135 = sext i32 %134 to i64
%136 = getelementptr inbounds i8, i8* %133, i64 %135
%137 = load i8, i8* %136
%138 = sext i8 %137 to i32
%139 = icmp eq i32 %138, 116
br i1 %139, label %140, label %141
140: ; preds = %132, %124
store i8 51, i8* %7
br label %180
141: ; preds = %132
%142 = load i8*, i8** %3
%143 = load i32, i32* %5
%144 = sext i32 %143 to i64
%145 = getelementptr inbounds i8, i8* %142, i64 %144
%146 = load i8, i8* %145
%147 = sext i8 %146 to i32
%148 = icmp eq i32 %147, 108
br i1 %148, label %149, label %150
149: ; preds = %141
store i8 52, i8* %7
br label %179
150: ; preds = %141
%151 = load i8*, i8** %3
%152 = load i32, i32* %5
%153 = sext i32 %152 to i64
%154 = getelementptr inbounds i8, i8* %151, i64 %153
%155 = load i8, i8* %154
%156 = sext i8 %155 to i32
%157 = icmp eq i32 %156, 109
br i1 %157, label %166, label %158
158: ; preds = %150
%159 = load i8*, i8** %3
%160 = load i32, i32* %5
%161 = sext i32 %160 to i64
%162 = getelementptr inbounds i8, i8* %159, i64 %161
%163 = load i8, i8* %162
%164 = sext i8 %163 to i32
%165 = icmp eq i32 %164, 110
br i1 %165, label %166, label %167
166: ; preds = %158, %150
store i8 53, i8* %7
br label %178
167: ; preds = %158
%168 = load i8*, i8** %3
%169 = load i32, i32* %5
%170 = sext i32 %169 to i64
%171 = getelementptr inbounds i8, i8* %168, i64 %170
%172 = load i8, i8* %171
%173 = sext i8 %172 to i32
%174 = icmp eq i32 %173, 114
br i1 %174, label %175, label %176
175: ; preds = %167
store i8 54, i8* %7
br label %177
176: ; preds = %167
store i8 48, i8* %7
br label %177
177: ; preds = %176, %175
br label %178
178: ; preds = %177, %166
br label %179
179: ; preds = %178, %149
br label %180
180: ; preds = %179, %140
br label %181
181: ; preds = %180, %123
br label %182
182: ; preds = %181, %58
%183 = load i8, i8* %7
%184 = sext i8 %183 to i32
%185 = icmp ne i32 %184, 48
br i1 %185, label %186, label %205
186: ; preds = %182
%187 = load i8, i8* %7
%188 = sext i8 %187 to i32
%189 = load i8*, i8** %4
%190 = load i32, i32* %6
%191 = sub nsw i32 %190, 1
%192 = sext i32 %191 to i64
%193 = getelementptr inbounds i8, i8* %189, i64 %192
%194 = load i8, i8* %193
%195 = sext i8 %194 to i32
%196 = icmp ne i32 %188, %195
br i1 %196, label %197, label %205
197: ; preds = %186
%198 = load i8, i8* %7
%199 = load i8*, i8** %4
%200 = load i32, i32* %6
%201 = sext i32 %200 to i64
%202 = getelementptr inbounds i8, i8* %199, i64 %201
store i8 %198, i8* %202
%203 = load i32, i32* %6
%204 = add nsw i32 %203, 1
store i32 %204, i32* %6
br label %205
205: ; preds = %197, %186, %182
%206 = load i32, i32* %5
%207 = add nsw i32 %206, 1
store i32 %207, i32* %5
br label %13
208: ; preds = %24
br label %209
209: ; preds = %212, %208
%210 = load i32, i32* %6
%211 = icmp slt i32 %210, 4
br i1 %211, label %212, label %218
212: ; preds = %209
%213 = load i8*, i8** %4
%214 = load i32, i32* %6
%215 = add nsw i32 %214, 1
store i32 %215, i32* %6
%216 = sext i32 %214 to i64
%217 = getelementptr inbounds i8, i8* %213, i64 %216
store i8 48, i8* %217
br label %209
218: ; preds = %209
%219 = load i8*, i8** %4
%220 = load i32, i32* %6
%221 = sext i32 %220 to i64
%222 = getelementptr inbounds i8, i8* %219, i64 %221
store i8 0, i8* %222
ret void
}

LLVM IR (-O2):
@switch.table.soundex = [25 x i8] c"1231121122455112623111212"
define void @soundex(i8* nocapture %0, i8* nocapture %1) {
%3 = load i8, i8* %0
store i8 %3, i8* %1
%4 = getelementptr inbounds i8, i8* %0, i64 1
%5 = load i8, i8* %4
%6 = icmp eq i8 %5, 0
br i1 %6, label %9, label %16
7: ; preds = %42
%8 = icmp slt i32 %43, 4
br i1 %8, label %9, label %50
9: ; preds = %2, %7
%10 = phi i32 [ %43, %7 ], [ 1, %2 ]
%11 = sext i32 %10 to i64
%12 = getelementptr i8, i8* %1, i64 %11
%13 = sub i32 3, %10
%14 = zext i32 %13 to i64
%15 = add nuw nsw i64 %14, 1
br label %50
16: ; preds = %2, %42
%17 = phi i64 [ %44, %42 ], [ 1, %2 ]
%18 = phi i8 [ %46, %42 ], [ %5, %2 ]
%19 = phi i32 [ %43, %42 ], [ 1, %2 ]
%20 = add i8 %18, -98
%21 = icmp ult i8 %20, 25
br i1 %21, label %22, label %42
22: ; preds = %16
%23 = zext i8 %20 to i32
%24 = lshr i32 22535991, %23
%25 = and i32 %24, 1
%26 = icmp eq i32 %25, 0
br i1 %26, label %42, label %27
27: ; preds = %22
%28 = sext i8 %20 to i64
%29 = getelementptr inbounds [25 x i8], [25 x i8]* @switch.table.soundex, i64 0, i64 %28
%30 = load i8, i8* %29
%31 = zext i8 %30 to i32
%32 = add nsw i32 %19, -1
%33 = sext i32 %32 to i64
%34 = getelementptr inbounds i8, i8* %1, i64 %33
%35 = load i8, i8* %34
%36 = sext i8 %35 to i32
%37 = icmp eq i32 %31, %36
br i1 %37, label %42, label %38
38: ; preds = %27
%39 = sext i32 %19 to i64
%40 = getelementptr inbounds i8, i8* %1, i64 %39
store i8 %30, i8* %40
%41 = add nsw i32 %19, 1
br label %42
42: ; preds = %22, %16, %38, %27
%43 = phi i32 [ %41, %38 ], [ %19, %27 ], [ %19, %16 ], [ %19, %22 ]
%44 = add nuw i64 %17, 1
%45 = getelementptr inbounds i8, i8* %0, i64 %44
%46 = load i8, i8* %45
%47 = icmp ne i8 %46, 0
%48 = icmp slt i32 %43, 4
%49 = select i1 %47, i1 %48, i1 false
br i1 %49, label %16, label %7
50: ; preds = %9, %7
%51 = getelementptr inbounds i8, i8* %1, i64 4
store i8 0, i8* %51
ret void
}