int cypherDiff(s1, s2, cypher)
int s1, s2;
unsigned char **cypher;
{
  int i, count, split;
  unsigned char val_11, val_12;
  count = 0;
  if (s1 == s2)
    return (count);
  for (i = 0; i < 64; i++) {
    if (cypher[s1][i] != cypher[s2][i]) {
      for (split = 0; split < 2; split++) {
        if (split == 0) {
          val_11 = (cypher[s1][i]) & 0x0f;
          val_12 = (cypher[s2][i]) & 0x0f;
        } else {
          val_11 = (cypher[s1][i] >> 4) & 0x0f;
          val_12 = (cypher[s2][i] >> 4) & 0x0f;
        }
        if ((val_11 | val_12) == (0x04 | 0x08)) {
          count = 1;
        } else if ((val_11 != val_12) && (val_11 != 0x04 && val_12 != 0x08 &&
                                          val_12 != 0x04 && val_11 != 0x08)) {
          count = 1;
        }
      }
    }
  }
  return (count);
}


x86 assembly (clang, -O0):
<cypherDiff>:
push   %rbp
mov    %rsp,%rbp
mov    %edi,-0x8(%rbp)
mov    %esi,-0xc(%rbp)
mov    %rdx,-0x18(%rbp)
movl   $0x0,-0x20(%rbp)
mov    -0x8(%rbp),%eax
cmp    -0xc(%rbp),%eax
jne    112c <cypherDiff+0x2c>
mov    -0x20(%rbp),%eax
mov    %eax,-0x4(%rbp)
jmp    129b <cypherDiff+0x19b>
movl   $0x0,-0x1c(%rbp)
cmpl   $0x40,-0x1c(%rbp)
jge    1295 <cypherDiff+0x195>
mov    -0x18(%rbp),%rax
movslq -0x8(%rbp),%rcx
mov    (%rax,%rcx,8),%rax
movslq -0x1c(%rbp),%rcx
movzbl (%rax,%rcx,1),%eax
mov    -0x18(%rbp),%rcx
movslq -0xc(%rbp),%rdx
mov    (%rcx,%rdx,8),%rcx
movslq -0x1c(%rbp),%rdx
movzbl (%rcx,%rdx,1),%ecx
cmp    %ecx,%eax
je     1282 <cypherDiff+0x182>
movl   $0x0,-0x24(%rbp)
cmpl   $0x2,-0x24(%rbp)
jge    127d <cypherDiff+0x17d>
cmpl   $0x0,-0x24(%rbp)
jne    11c1 <cypherDiff+0xc1>
mov    -0x18(%rbp),%rax
movslq -0x8(%rbp),%rcx
mov    (%rax,%rcx,8),%rax
movslq -0x1c(%rbp),%rcx
movzbl (%rax,%rcx,1),%eax
and    $0xf,%eax
mov    %al,-0x25(%rbp)
mov    -0x18(%rbp),%rax
movslq -0xc(%rbp),%rcx
mov    (%rax,%rcx,8),%rax
movslq -0x1c(%rbp),%rcx
movzbl (%rax,%rcx,1),%eax
and    $0xf,%eax
mov    %al,-0x26(%rbp)
jmp    11fb <cypherDiff+0xfb>
mov    -0x18(%rbp),%rax
movslq -0x8(%rbp),%rcx
mov    (%rax,%rcx,8),%rax
movslq -0x1c(%rbp),%rcx
movzbl (%rax,%rcx,1),%eax
sar    $0x4,%eax
and    $0xf,%eax
mov    %al,-0x25(%rbp)
mov    -0x18(%rbp),%rax
movslq -0xc(%rbp),%rcx
mov    (%rax,%rcx,8),%rax
movslq -0x1c(%rbp),%rcx
movzbl (%rax,%rcx,1),%eax
sar    $0x4,%eax
and    $0xf,%eax
mov    %al,-0x26(%rbp)
movzbl -0x25(%rbp),%eax
movzbl -0x26(%rbp),%ecx
or     %ecx,%eax
cmp    $0xc,%eax
jne    121a <cypherDiff+0x11a>
movl   $0x1,-0x20(%rbp)
jmp    126a <cypherDiff+0x16a>
movzbl -0x25(%rbp),%eax
movzbl -0x26(%rbp),%ecx
cmp    %ecx,%eax
je     1265 <cypherDiff+0x165>
movzbl -0x25(%rbp),%eax
cmp    $0x4,%eax
je     1265 <cypherDiff+0x165>
movzbl -0x26(%rbp),%eax
cmp    $0x8,%eax
je     1265 <cypherDiff+0x165>
movzbl -0x26(%rbp),%eax
cmp    $0x4,%eax
je     1265 <cypherDiff+0x165>
movzbl -0x25(%rbp),%eax
cmp    $0x8,%eax
je     1265 <cypherDiff+0x165>
movl   $0x1,-0x20(%rbp)
jmp    126a <cypherDiff+0x16a>
jmp    126f <cypherDiff+0x16f>
mov    -0x24(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x24(%rbp)
jmp    1174 <cypherDiff+0x74>
jmp    1282 <cypherDiff+0x182>
jmp    1287 <cypherDiff+0x187>
mov    -0x1c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x1c(%rbp)
jmp    1133 <cypherDiff+0x33>
mov    -0x20(%rbp),%eax
mov    %eax,-0x4(%rbp)
mov    -0x4(%rbp),%eax
pop    %rbp
ret

x86 assembly (clang, -O2):
<cypherDiff>:
push   %rbp
push   %r14
push   %rbx
xor    %eax,%eax
cmp    %esi,%edi
jne    110f <cypherDiff+0xf>
pop    %rbx
pop    %r14
pop    %rbp
ret
movslq %edi,%rax
mov    (%rdx,%rax,8),%r9
movslq %esi,%rax
mov    (%rdx,%rax,8),%r10
xor    %esi,%esi
mov    $0x1,%r8d
xor    %edx,%edx
jmp    113e <cypherDiff+0x3e>
nopl   0x0(%rax)
mov    %edx,%eax
add    $0x1,%rsi
mov    %eax,%edx
cmp    $0x40,%rsi
je     110a <cypherDiff+0xa>
movzbl (%r9,%rsi,1),%edi
movzbl (%r10,%rsi,1),%ecx
cmp    %cl,%dil
je     1130 <cypherDiff+0x30>
mov    %edi,%r14d
and    $0xf,%r14b
mov    %ecx,%ebp
and    $0xf,%bpl
shr    $0x4,%dil
shr    $0x4,%cl
mov    %r14d,%ebx
or     %bpl,%bl
mov    $0x1,%eax
mov    $0x1,%r11d
cmp    $0xc,%bl
je     1198 <cypherDiff+0x98>
lea    -0x4(%r14),%ebx
test   $0xfb,%bl
mov    %edx,%r11d
cmovne %r8d,%r11d
cmp    %bpl,%r14b
cmove  %edx,%r11d
add    $0xfc,%bpl
test   $0xfb,%bpl
cmove  %edx,%r11d
mov    %edi,%edx
or     %cl,%dl
cmp    $0xc,%dl
je     1132 <cypherDiff+0x32>
lea    -0x4(%rdi),%eax
test   $0xfb,%al
mov    %r11d,%eax
cmovne %r8d,%eax
cmp    %cl,%dil
cmove  %r11d,%eax
add    $0xfc,%cl
test   $0xfb,%cl
cmove  %r11d,%eax
jmp    1132 <cypherDiff+0x32>

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

LLVM IR (-O2):
define i32 @cypherDiff(i32 %0, i32 %1, i8** nocapture %2) {
%4 = icmp eq i32 %0, %1
br i1 %4, label %57, label %5
5: ; preds = %3
%6 = sext i32 %0 to i64
%7 = getelementptr inbounds i8*, i8** %2, i64 %6
%8 = load i8*, i8** %7
%9 = sext i32 %1 to i64
%10 = getelementptr inbounds i8*, i8** %2, i64 %9
%11 = load i8*, i8** %10
br label %12
12: ; preds = %5, %53
%13 = phi i64 [ 0, %5 ], [ %55, %53 ]
%14 = phi i32 [ 0, %5 ], [ %54, %53 ]
%15 = getelementptr inbounds i8, i8* %8, i64 %13
%16 = load i8, i8* %15
%17 = getelementptr inbounds i8, i8* %11, i64 %13
%18 = load i8, i8* %17
%19 = icmp eq i8 %16, %18
br i1 %19, label %53, label %20
20: ; preds = %12
%21 = and i8 %16, 15
%22 = and i8 %18, 15
%23 = lshr i8 %16, 4
%24 = lshr i8 %18, 4
%25 = or i8 %21, %22
%26 = icmp eq i8 %25, 12
br i1 %26, label %38, label %27
27: ; preds = %20
%28 = icmp ne i8 %21, %22
%29 = icmp ne i8 %21, 4
%30 = and i1 %28, %29
%31 = icmp ne i8 %22, 8
%32 = and i1 %31, %30
%33 = icmp ne i8 %22, 4
%34 = and i1 %33, %32
%35 = icmp ne i8 %21, 8
%36 = select i1 %34, i1 %35, i1 false
%37 = select i1 %36, i32 1, i32 %14
br label %38
38: ; preds = %27, %20
%39 = phi i32 [ 1, %20 ], [ %37, %27 ]
%40 = or i8 %23, %24
%41 = icmp eq i8 %40, 12
br i1 %41, label %53, label %42
42: ; preds = %38
%43 = icmp ne i8 %23, %24
%44 = icmp ne i8 %23, 4
%45 = and i1 %43, %44
%46 = icmp ne i8 %24, 8
%47 = and i1 %46, %45
%48 = icmp ne i8 %24, 4
%49 = and i1 %48, %47
%50 = icmp ne i8 %23, 8
%51 = select i1 %49, i1 %50, i1 false
%52 = select i1 %51, i32 1, i32 %39
br label %53
53: ; preds = %38, %42, %12
%54 = phi i32 [ %14, %12 ], [ 1, %38 ], [ %52, %42 ]
%55 = add nuw nsw i64 %13, 1
%56 = icmp eq i64 %55, 64
br i1 %56, label %57, label %12
57: ; preds = %53, %3
%58 = phi i32 [ 0, %3 ], [ %54, %53 ]
ret i32 %58
}