unsigned patt_fitness(unsigned *cellular_automaton, unsigned *pattern) {
  unsigned match = 0;
  for (int i = 0; i < 7 * 14; i++) {
    if (cellular_automaton[i] == pattern[i])
      match++;
  }
  return match;
}


x86 assembly (clang, -O0):
<patt_fitness>:
push   %rbp
mov    %rsp,%rbp
mov    %rdi,-0x8(%rbp)
mov    %rsi,-0x10(%rbp)
movl   $0x0,-0x14(%rbp)
movl   $0x0,-0x18(%rbp)
cmpl   $0x62,-0x18(%rbp)
jge    115c <patt_fitness+0x5c>
mov    -0x8(%rbp),%rax
movslq -0x18(%rbp),%rcx
mov    (%rax,%rcx,4),%eax
mov    -0x10(%rbp),%rcx
movslq -0x18(%rbp),%rdx
cmp    (%rcx,%rdx,4),%eax
jne    1149 <patt_fitness+0x49>
mov    -0x14(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x14(%rbp)
jmp    114e <patt_fitness+0x4e>
mov    -0x18(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x18(%rbp)
jmp    111a <patt_fitness+0x1a>
mov    -0x14(%rbp),%eax
pop    %rbp
ret

x86 assembly (clang, -O2):
<patt_fitness>:
movdqu (%rdi),%xmm1
movdqu 0x10(%rdi),%xmm2
movdqu 0x20(%rdi),%xmm3
movdqu 0x30(%rdi),%xmm4
movdqu (%rsi),%xmm0
pcmpeqd %xmm1,%xmm0
movdqu 0x10(%rsi),%xmm1
pcmpeqd %xmm2,%xmm1
movdqu 0x20(%rsi),%xmm2
pcmpeqd %xmm3,%xmm2
movdqu 0x30(%rsi),%xmm3
pcmpeqd %xmm4,%xmm3
psrld  $0x1f,%xmm0
psubd  %xmm1,%xmm0
psubd  %xmm2,%xmm0
psubd  %xmm3,%xmm0
movdqu 0x40(%rdi),%xmm1
movdqu 0x40(%rsi),%xmm2
pcmpeqd %xmm1,%xmm2
psubd  %xmm2,%xmm0
movdqu 0x50(%rdi),%xmm1
movdqu 0x50(%rsi),%xmm2
pcmpeqd %xmm1,%xmm2
psubd  %xmm2,%xmm0
movdqu 0x60(%rdi),%xmm1
movdqu 0x60(%rsi),%xmm2
pcmpeqd %xmm1,%xmm2
psubd  %xmm2,%xmm0
movdqu 0x70(%rdi),%xmm1
movdqu 0x70(%rsi),%xmm2
pcmpeqd %xmm1,%xmm2
psubd  %xmm2,%xmm0
movdqu 0x80(%rdi),%xmm1
movdqu 0x80(%rsi),%xmm2
pcmpeqd %xmm1,%xmm2
psubd  %xmm2,%xmm0
movdqu 0x90(%rdi),%xmm1
movdqu 0x90(%rsi),%xmm2
pcmpeqd %xmm1,%xmm2
psubd  %xmm2,%xmm0
movdqu 0xa0(%rdi),%xmm1
movdqu 0xa0(%rsi),%xmm2
pcmpeqd %xmm1,%xmm2
psubd  %xmm2,%xmm0
movdqu 0xb0(%rdi),%xmm1
movdqu 0xb0(%rsi),%xmm2
pcmpeqd %xmm1,%xmm2
psubd  %xmm2,%xmm0
movdqu 0xc0(%rdi),%xmm1
movdqu 0xc0(%rsi),%xmm2
pcmpeqd %xmm1,%xmm2
psubd  %xmm2,%xmm0
movdqu 0xd0(%rdi),%xmm1
movdqu 0xd0(%rsi),%xmm2
pcmpeqd %xmm1,%xmm2
psubd  %xmm2,%xmm0
movdqu 0xe0(%rdi),%xmm1
movdqu 0xe0(%rsi),%xmm2
pcmpeqd %xmm1,%xmm2
psubd  %xmm2,%xmm0
movdqu 0xf0(%rdi),%xmm1
movdqu 0xf0(%rsi),%xmm2
pcmpeqd %xmm1,%xmm2
psubd  %xmm2,%xmm0
movdqu 0x100(%rdi),%xmm1
movdqu 0x100(%rsi),%xmm2
pcmpeqd %xmm1,%xmm2
psubd  %xmm2,%xmm0
movdqu 0x110(%rdi),%xmm1
movdqu 0x110(%rsi),%xmm2
pcmpeqd %xmm1,%xmm2
psubd  %xmm2,%xmm0
movdqu 0x120(%rdi),%xmm1
movdqu 0x120(%rsi),%xmm2
pcmpeqd %xmm1,%xmm2
psubd  %xmm2,%xmm0
movdqu 0x130(%rdi),%xmm1
movdqu 0x130(%rsi),%xmm2
pcmpeqd %xmm1,%xmm2
psubd  %xmm2,%xmm0
movdqu 0x140(%rdi),%xmm1
movdqu 0x140(%rsi),%xmm2
pcmpeqd %xmm1,%xmm2
psubd  %xmm2,%xmm0
movdqu 0x150(%rdi),%xmm1
movdqu 0x150(%rsi),%xmm2
pcmpeqd %xmm1,%xmm2
psubd  %xmm2,%xmm0
movdqu 0x160(%rdi),%xmm1
movdqu 0x160(%rsi),%xmm2
pcmpeqd %xmm1,%xmm2
psubd  %xmm2,%xmm0
movdqu 0x170(%rdi),%xmm1
movdqu 0x170(%rsi),%xmm2
pcmpeqd %xmm1,%xmm2
psubd  %xmm2,%xmm0
pshufd $0xee,%xmm0,%xmm1
paddd  %xmm0,%xmm1
pshufd $0x55,%xmm1,%xmm0
paddd  %xmm1,%xmm0
movd   %xmm0,%eax
mov    0x180(%rdi),%ecx
xor    %edx,%edx
cmp    0x180(%rsi),%ecx
sete   %dl
add    %eax,%edx
mov    0x184(%rdi),%ecx
xor    %eax,%eax
cmp    0x184(%rsi),%ecx
sete   %al
add    %edx,%eax
ret

LLVM IR (-O0):
define i32 @patt_fitness(i32* %0, i32* %1) {
%3 = alloca i32*
%4 = alloca i32*
%5 = alloca i32
%6 = alloca i32
store i32* %0, i32** %3
store i32* %1, i32** %4
store i32 0, i32* %5
store i32 0, i32* %6
br label %7
7: ; preds = %26, %2
%8 = load i32, i32* %6
%9 = icmp slt i32 %8, 98
br i1 %9, label %10, label %29
10: ; preds = %7
%11 = load i32*, i32** %3
%12 = load i32, i32* %6
%13 = sext i32 %12 to i64
%14 = getelementptr inbounds i32, i32* %11, i64 %13
%15 = load i32, i32* %14
%16 = load i32*, i32** %4
%17 = load i32, i32* %6
%18 = sext i32 %17 to i64
%19 = getelementptr inbounds i32, i32* %16, i64 %18
%20 = load i32, i32* %19
%21 = icmp eq i32 %15, %20
br i1 %21, label %22, label %25
22: ; preds = %10
%23 = load i32, i32* %5
%24 = add i32 %23, 1
store i32 %24, i32* %5
br label %25
25: ; preds = %22, %10
br label %26
26: ; preds = %25
%27 = load i32, i32* %6
%28 = add nsw i32 %27, 1
store i32 %28, i32* %6
br label %7
29: ; preds = %7
%30 = load i32, i32* %5
ret i32 %30
}

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