double transitionFunction(int s_prime[], int s[], int a) {
  int xAdd = 0;
  int yAdd = 0;
  if ((s_prime[3] != s[3]) && (s_prime[4] != s[4]))
    return 0.0;
  if ((0 == a) && (s[1] < (5 - 1)))
    yAdd = 1;
  else if ((1 == a) && (s[0] > 0))
    xAdd = -1;
  else if ((2 == a) && (s[1] > 0))
    yAdd = -1;
  else if ((3 == a) && (s[0] < (5 - 1)))
    xAdd = 1;
  if (((s[0] + xAdd) == s_prime[0]) && ((s[1] + yAdd) == s_prime[1]) &&
      (s[2] == s_prime[2]) && (s[3] == s_prime[3]))
    return 1.0;
  else
    return 0.0;
}


x86 assembly (clang, -O0):
<transitionFunction>:
push   %rbp
mov    %rsp,%rbp
mov    %rdi,-0x10(%rbp)
mov    %rsi,-0x18(%rbp)
mov    %edx,-0x1c(%rbp)
movl   $0x0,-0x20(%rbp)
movl   $0x0,-0x24(%rbp)
mov    -0x10(%rbp),%rax
mov    0xc(%rax),%eax
mov    -0x18(%rbp),%rcx
cmp    0xc(%rcx),%eax
je     1152 <transitionFunction+0x52>
mov    -0x10(%rbp),%rax
mov    0x10(%rax),%eax
mov    -0x18(%rbp),%rcx
cmp    0x10(%rcx),%eax
je     1152 <transitionFunction+0x52>
xorps  %xmm0,%xmm0
movsd  %xmm0,-0x8(%rbp)
jmp    1265 <transitionFunction+0x165>
xor    %eax,%eax
cmp    -0x1c(%rbp),%eax
jne    1177 <transitionFunction+0x77>
mov    -0x18(%rbp),%rax
cmpl   $0x4,0x4(%rax)
jge    1177 <transitionFunction+0x77>
movl   $0x1,-0x24(%rbp)
jmp    11f7 <transitionFunction+0xf7>
mov    $0x1,%eax
cmp    -0x1c(%rbp),%eax
jne    119e <transitionFunction+0x9e>
mov    -0x18(%rbp),%rax
cmpl   $0x0,(%rax)
jle    119e <transitionFunction+0x9e>
movl   $0xffffffff,-0x20(%rbp)
jmp    11f2 <transitionFunction+0xf2>
mov    $0x2,%eax
cmp    -0x1c(%rbp),%eax
jne    11c6 <transitionFunction+0xc6>
mov    -0x18(%rbp),%rax
cmpl   $0x0,0x4(%rax)
jle    11c6 <transitionFunction+0xc6>
movl   $0xffffffff,-0x24(%rbp)
jmp    11ed <transitionFunction+0xed>
mov    $0x3,%eax
cmp    -0x1c(%rbp),%eax
jne    11e8 <transitionFunction+0xe8>
mov    -0x18(%rbp),%rax
cmpl   $0x4,(%rax)
jge    11e8 <transitionFunction+0xe8>
movl   $0x1,-0x20(%rbp)
jmp    11ed <transitionFunction+0xed>
jmp    11f2 <transitionFunction+0xf2>
jmp    11f7 <transitionFunction+0xf7>
mov    -0x18(%rbp),%rax
mov    (%rax),%eax
add    -0x20(%rbp),%eax
mov    -0x10(%rbp),%rcx
cmp    (%rcx),%eax
jne    125d <transitionFunction+0x15d>
mov    -0x18(%rbp),%rax
mov    0x4(%rax),%eax
add    -0x24(%rbp),%eax
mov    -0x10(%rbp),%rcx
cmp    0x4(%rcx),%eax
jne    125d <transitionFunction+0x15d>
mov    -0x18(%rbp),%rax
mov    0x8(%rax),%eax
mov    -0x10(%rbp),%rcx
cmp    0x8(%rcx),%eax
jne    125d <transitionFunction+0x15d>
mov    -0x18(%rbp),%rax
mov    0xc(%rax),%eax
mov    -0x10(%rbp),%rcx
cmp    0xc(%rcx),%eax
jne    125d <transitionFunction+0x15d>
movsd  0xdad(%rip),%xmm0
movsd  %xmm0,-0x8(%rbp)
jmp    1265 <transitionFunction+0x165>
xorps  %xmm0,%xmm0
movsd  %xmm0,-0x8(%rbp)
movsd  -0x8(%rbp),%xmm0
pop    %rbp
ret

x86 assembly (clang, -O2):
<transitionFunction>:
mov    0xc(%rdi),%r8d
mov    0xc(%rsi),%r9d
cmp    %r9d,%r8d
je     1118 <transitionFunction+0x18>
mov    0x10(%rdi),%eax
xorps  %xmm0,%xmm0
cmp    0x10(%rsi),%eax
jne    1188 <transitionFunction+0x88>
xor    %eax,%eax
cmp    $0x3,%edx
ja     113a <transitionFunction+0x3a>
mov    %edx,%edx
lea    0xee0(%rip),%rcx
movslq (%rcx,%rdx,4),%rdx
add    %rcx,%rdx
jmp    *%rdx
xor    %eax,%eax
cmpl   $0x4,0x4(%rsi)
setl   %al
xor    %edx,%edx
jmp    1161 <transitionFunction+0x61>
xor    %edx,%edx
cmpl   $0x0,(%rsi)
setg   %dl
neg    %edx
jmp    1161 <transitionFunction+0x61>
xor    %eax,%eax
cmpl   $0x0,0x4(%rsi)
setg   %al
neg    %eax
xor    %edx,%edx
jmp    1161 <transitionFunction+0x61>
xor    %edx,%edx
cmpl   $0x4,(%rsi)
setl   %dl
add    (%rsi),%edx
cmp    (%rdi),%edx
jne    1185 <transitionFunction+0x85>
add    0x4(%rsi),%eax
cmp    0x4(%rdi),%eax
jne    1185 <transitionFunction+0x85>
mov    0x8(%rsi),%eax
cmp    0x8(%rdi),%eax
jne    1185 <transitionFunction+0x85>
cmp    %r9d,%r8d
jne    1185 <transitionFunction+0x85>
movsd  0xe7c(%rip),%xmm0
ret
xorps  %xmm0,%xmm0
ret

LLVM IR (-O0):
define double @transitionFunction(i32* %0, i32* %1, i32 %2) {
%4 = alloca double
%5 = alloca i32*
%6 = alloca i32*
%7 = alloca i32
%8 = alloca i32
%9 = alloca i32
store i32* %0, i32** %5
store i32* %1, i32** %6
store i32 %2, i32* %7
store i32 0, i32* %8
store i32 0, i32* %9
%10 = load i32*, i32** %5
%11 = getelementptr inbounds i32, i32* %10, i64 3
%12 = load i32, i32* %11
%13 = load i32*, i32** %6
%14 = getelementptr inbounds i32, i32* %13, i64 3
%15 = load i32, i32* %14
%16 = icmp ne i32 %12, %15
br i1 %16, label %17, label %26
17: ; preds = %3
%18 = load i32*, i32** %5
%19 = getelementptr inbounds i32, i32* %18, i64 4
%20 = load i32, i32* %19
%21 = load i32*, i32** %6
%22 = getelementptr inbounds i32, i32* %21, i64 4
%23 = load i32, i32* %22
%24 = icmp ne i32 %20, %23
br i1 %24, label %25, label %26
25: ; preds = %17
store double 0.000000e+00, double* %4
br label %103
26: ; preds = %17, %3
%27 = load i32, i32* %7
%28 = icmp eq i32 0, %27
br i1 %28, label %29, label %35
29: ; preds = %26
%30 = load i32*, i32** %6
%31 = getelementptr inbounds i32, i32* %30, i64 1
%32 = load i32, i32* %31
%33 = icmp slt i32 %32, 4
br i1 %33, label %34, label %35
34: ; preds = %29
store i32 1, i32* %9
br label %65
35: ; preds = %29, %26
%36 = load i32, i32* %7
%37 = icmp eq i32 1, %36
br i1 %37, label %38, label %44
38: ; preds = %35
%39 = load i32*, i32** %6
%40 = getelementptr inbounds i32, i32* %39, i64 0
%41 = load i32, i32* %40
%42 = icmp sgt i32 %41, 0
br i1 %42, label %43, label %44
43: ; preds = %38
store i32 -1, i32* %8
br label %64
44: ; preds = %38, %35
%45 = load i32, i32* %7
%46 = icmp eq i32 2, %45
br i1 %46, label %47, label %53
47: ; preds = %44
%48 = load i32*, i32** %6
%49 = getelementptr inbounds i32, i32* %48, i64 1
%50 = load i32, i32* %49
%51 = icmp sgt i32 %50, 0
br i1 %51, label %52, label %53
52: ; preds = %47
store i32 -1, i32* %9
br label %63
53: ; preds = %47, %44
%54 = load i32, i32* %7
%55 = icmp eq i32 3, %54
br i1 %55, label %56, label %62
56: ; preds = %53
%57 = load i32*, i32** %6
%58 = getelementptr inbounds i32, i32* %57, i64 0
%59 = load i32, i32* %58
%60 = icmp slt i32 %59, 4
br i1 %60, label %61, label %62
61: ; preds = %56
store i32 1, i32* %8
br label %62
62: ; preds = %61, %56, %53
br label %63
63: ; preds = %62, %52
br label %64
64: ; preds = %63, %43
br label %65
65: ; preds = %64, %34
%66 = load i32*, i32** %6
%67 = getelementptr inbounds i32, i32* %66, i64 0
%68 = load i32, i32* %67
%69 = load i32, i32* %8
%70 = add nsw i32 %68, %69
%71 = load i32*, i32** %5
%72 = getelementptr inbounds i32, i32* %71, i64 0
%73 = load i32, i32* %72
%74 = icmp eq i32 %70, %73
br i1 %74, label %75, label %102
75: ; preds = %65
%76 = load i32*, i32** %6
%77 = getelementptr inbounds i32, i32* %76, i64 1
%78 = load i32, i32* %77
%79 = load i32, i32* %9
%80 = add nsw i32 %78, %79
%81 = load i32*, i32** %5
%82 = getelementptr inbounds i32, i32* %81, i64 1
%83 = load i32, i32* %82
%84 = icmp eq i32 %80, %83
br i1 %84, label %85, label %102
85: ; preds = %75
%86 = load i32*, i32** %6
%87 = getelementptr inbounds i32, i32* %86, i64 2
%88 = load i32, i32* %87
%89 = load i32*, i32** %5
%90 = getelementptr inbounds i32, i32* %89, i64 2
%91 = load i32, i32* %90
%92 = icmp eq i32 %88, %91
br i1 %92, label %93, label %102
93: ; preds = %85
%94 = load i32*, i32** %6
%95 = getelementptr inbounds i32, i32* %94, i64 3
%96 = load i32, i32* %95
%97 = load i32*, i32** %5
%98 = getelementptr inbounds i32, i32* %97, i64 3
%99 = load i32, i32* %98
%100 = icmp eq i32 %96, %99
br i1 %100, label %101, label %102
101: ; preds = %93
store double 1.000000e+00, double* %4
br label %103
102: ; preds = %93, %85, %75, %65
store double 0.000000e+00, double* %4
br label %103
103: ; preds = %102, %101, %25
%104 = load double, double* %4
ret double %104
}

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