int match_rules(unsigned char *A, int n) {
  if (n == 0)
    return 1;
  if (A[0] == 0)
    return 0;
  if (n < 4)
    return 1;
  if ((A[1] * 100 + A[2] * 10 + A[3]) % 2)
    return 0;
  if (n < 5)
    return 1;
  if ((A[2] * 100 + A[3] * 10 + A[4]) % 3)
    return 0;
  if (n < 6)
    return 1;
  if ((A[3] * 100 + A[4] * 10 + A[5]) % 5)
    return 0;
  if (n < 7)
    return 1;
  if ((A[4] * 100 + A[5] * 10 + A[6]) % 7)
    return 0;
  if (n < 8)
    return 1;
  if ((A[5] * 100 + A[6] * 10 + A[7]) % 11)
    return 0;
  if (n < 9)
    return 1;
  if ((A[6] * 100 + A[7] * 10 + A[8]) % 13)
    return 0;
  if (n < 10)
    return 1;
  if ((A[7] * 100 + A[8] * 10 + A[9]) % 17)
    return 0;
  return 1;
}


x86 assembly (clang, -O0):
<match_rules>:
push   %rbp
mov    %rsp,%rbp
mov    %rdi,-0x10(%rbp)
mov    %esi,-0x14(%rbp)
cmpl   $0x0,-0x14(%rbp)
jne    1121 <match_rules+0x21>
movl   $0x1,-0x4(%rbp)
jmp    1397 <match_rules+0x297>
mov    -0x10(%rbp),%rax
movzbl (%rax),%eax
cmp    $0x0,%eax
jne    113d <match_rules+0x3d>
movl   $0x0,-0x4(%rbp)
jmp    1397 <match_rules+0x297>
cmpl   $0x4,-0x14(%rbp)
jge    1153 <match_rules+0x53>
movl   $0x1,-0x4(%rbp)
jmp    1397 <match_rules+0x297>
mov    -0x10(%rbp),%rax
movzbl 0x1(%rax),%eax
imul   $0x64,%eax,%eax
mov    -0x10(%rbp),%rcx
movzbl 0x2(%rcx),%ecx
imul   $0xa,%ecx,%ecx
add    %ecx,%eax
mov    -0x10(%rbp),%rcx
movzbl 0x3(%rcx),%ecx
add    %ecx,%eax
mov    $0x2,%ecx
cltd
idiv   %ecx
cmp    $0x0,%edx
je     1192 <match_rules+0x92>
movl   $0x0,-0x4(%rbp)
jmp    1397 <match_rules+0x297>
cmpl   $0x5,-0x14(%rbp)
jge    11a8 <match_rules+0xa8>
movl   $0x1,-0x4(%rbp)
jmp    1397 <match_rules+0x297>
mov    -0x10(%rbp),%rax
movzbl 0x2(%rax),%eax
imul   $0x64,%eax,%eax
mov    -0x10(%rbp),%rcx
movzbl 0x3(%rcx),%ecx
imul   $0xa,%ecx,%ecx
add    %ecx,%eax
mov    -0x10(%rbp),%rcx
movzbl 0x4(%rcx),%ecx
add    %ecx,%eax
mov    $0x3,%ecx
cltd
idiv   %ecx
cmp    $0x0,%edx
je     11e7 <match_rules+0xe7>
movl   $0x0,-0x4(%rbp)
jmp    1397 <match_rules+0x297>
cmpl   $0x6,-0x14(%rbp)
jge    11fd <match_rules+0xfd>
movl   $0x1,-0x4(%rbp)
jmp    1397 <match_rules+0x297>
mov    -0x10(%rbp),%rax
movzbl 0x3(%rax),%eax
imul   $0x64,%eax,%eax
mov    -0x10(%rbp),%rcx
movzbl 0x4(%rcx),%ecx
imul   $0xa,%ecx,%ecx
add    %ecx,%eax
mov    -0x10(%rbp),%rcx
movzbl 0x5(%rcx),%ecx
add    %ecx,%eax
mov    $0x5,%ecx
cltd
idiv   %ecx
cmp    $0x0,%edx
je     123c <match_rules+0x13c>
movl   $0x0,-0x4(%rbp)
jmp    1397 <match_rules+0x297>
cmpl   $0x7,-0x14(%rbp)
jge    1252 <match_rules+0x152>
movl   $0x1,-0x4(%rbp)
jmp    1397 <match_rules+0x297>
mov    -0x10(%rbp),%rax
movzbl 0x4(%rax),%eax
imul   $0x64,%eax,%eax
mov    -0x10(%rbp),%rcx
movzbl 0x5(%rcx),%ecx
imul   $0xa,%ecx,%ecx
add    %ecx,%eax
mov    -0x10(%rbp),%rcx
movzbl 0x6(%rcx),%ecx
add    %ecx,%eax
mov    $0x7,%ecx
cltd
idiv   %ecx
cmp    $0x0,%edx
je     1291 <match_rules+0x191>
movl   $0x0,-0x4(%rbp)
jmp    1397 <match_rules+0x297>
cmpl   $0x8,-0x14(%rbp)
jge    12a7 <match_rules+0x1a7>
movl   $0x1,-0x4(%rbp)
jmp    1397 <match_rules+0x297>
mov    -0x10(%rbp),%rax
movzbl 0x5(%rax),%eax
imul   $0x64,%eax,%eax
mov    -0x10(%rbp),%rcx
movzbl 0x6(%rcx),%ecx
imul   $0xa,%ecx,%ecx
add    %ecx,%eax
mov    -0x10(%rbp),%rcx
movzbl 0x7(%rcx),%ecx
add    %ecx,%eax
mov    $0xb,%ecx
cltd
idiv   %ecx
cmp    $0x0,%edx
je     12e6 <match_rules+0x1e6>
movl   $0x0,-0x4(%rbp)
jmp    1397 <match_rules+0x297>
cmpl   $0x9,-0x14(%rbp)
jge    12fc <match_rules+0x1fc>
movl   $0x1,-0x4(%rbp)
jmp    1397 <match_rules+0x297>
mov    -0x10(%rbp),%rax
movzbl 0x6(%rax),%eax
imul   $0x64,%eax,%eax
mov    -0x10(%rbp),%rcx
movzbl 0x7(%rcx),%ecx
imul   $0xa,%ecx,%ecx
add    %ecx,%eax
mov    -0x10(%rbp),%rcx
movzbl 0x8(%rcx),%ecx
add    %ecx,%eax
mov    $0xd,%ecx
cltd
idiv   %ecx
cmp    $0x0,%edx
je     133b <match_rules+0x23b>
movl   $0x0,-0x4(%rbp)
jmp    1397 <match_rules+0x297>
cmpl   $0xa,-0x14(%rbp)
jge    1351 <match_rules+0x251>
movl   $0x1,-0x4(%rbp)
jmp    1397 <match_rules+0x297>
mov    -0x10(%rbp),%rax
movzbl 0x7(%rax),%eax
imul   $0x64,%eax,%eax
mov    -0x10(%rbp),%rcx
movzbl 0x8(%rcx),%ecx
imul   $0xa,%ecx,%ecx
add    %ecx,%eax
mov    -0x10(%rbp),%rcx
movzbl 0x9(%rcx),%ecx
add    %ecx,%eax
mov    $0x11,%ecx
cltd
idiv   %ecx
cmp    $0x0,%edx
je     1390 <match_rules+0x290>
movl   $0x0,-0x4(%rbp)
jmp    1397 <match_rules+0x297>
movl   $0x1,-0x4(%rbp)
mov    -0x4(%rbp),%eax
pop    %rbp
ret

x86 assembly (clang, -O2):
<match_rules>:
test   %esi,%esi
je     111e <match_rules+0x1e>
xor    %eax,%eax
cmpb   $0x0,(%rdi)
je     1123 <match_rules+0x23>
cmp    $0x4,%esi
jl     111e <match_rules+0x1e>
movzbl 0x3(%rdi),%edx
test   $0x1,%dl
jne    1123 <match_rules+0x23>
cmp    $0x5,%esi
jae    1124 <match_rules+0x24>
mov    $0x1,%eax
ret
movzbl 0x2(%rdi),%ecx
imul   $0x64,%ecx,%r8d
lea    (%rdx,%rdx,4),%ecx
lea    (%r8,%rcx,2),%ecx
movzbl 0x4(%rdi),%r8d
add    %r8d,%ecx
imul   $0xffffaaab,%ecx,%ecx
movzwl %cx,%ecx
cmp    $0x5555,%ecx
ja     1123 <match_rules+0x23>
cmp    $0x6,%esi
jb     111e <match_rules+0x1e>
imul   $0x64,%edx,%ecx
lea    (%r8,%r8,4),%edx
lea    (%rcx,%rdx,2),%ecx
movzbl 0x5(%rdi),%edx
add    %edx,%ecx
imul   $0xffffcccd,%ecx,%ecx
movzwl %cx,%ecx
cmp    $0x3333,%ecx
ja     1123 <match_rules+0x23>
cmp    $0x7,%esi
jb     111e <match_rules+0x1e>
imul   $0x64,%r8d,%r8d
lea    (%rdx,%rdx,4),%ecx
lea    (%r8,%rcx,2),%ecx
movzbl 0x6(%rdi),%r8d
add    %r8d,%ecx
imul   $0x6db7,%ecx,%ecx
movzwl %cx,%ecx
cmp    $0x2492,%ecx
ja     1123 <match_rules+0x23>
cmp    $0x8,%esi
jb     111e <match_rules+0x1e>
imul   $0x64,%edx,%ecx
lea    (%r8,%r8,4),%edx
lea    (%rcx,%rdx,2),%ecx
movzbl 0x7(%rdi),%edx
add    %edx,%ecx
imul   $0xffff8ba3,%ecx,%ecx
movzwl %cx,%ecx
cmp    $0x1745,%ecx
ja     1123 <match_rules+0x23>
cmp    $0x9,%esi
jb     111e <match_rules+0x1e>
imul   $0x64,%r8d,%r8d
lea    (%rdx,%rdx,4),%ecx
lea    (%r8,%rcx,2),%ecx
movzbl 0x8(%rdi),%r8d
add    %r8d,%ecx
imul   $0x4ec5,%ecx,%ecx
movzwl %cx,%ecx
cmp    $0x13b1,%ecx
ja     1123 <match_rules+0x23>
mov    $0x1,%eax
cmp    $0xa,%esi
jb     1123 <match_rules+0x23>
imul   $0x64,%edx,%eax
lea    (%r8,%r8,4),%ecx
lea    (%rax,%rcx,2),%eax
movzbl 0x9(%rdi),%ecx
add    %eax,%ecx
imul   $0xfffff0f1,%ecx,%eax
movzwl %ax,%ecx
xor    %eax,%eax
cmp    $0xf10,%ecx
setb   %al
ret

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

LLVM IR (-O2):
define i32 @match_rules(i8* nocapture %0, i32 %1) {
%3 = icmp eq i32 %1, 0
br i1 %3, label %97, label %4
4: ; preds = %2
%5 = load i8, i8* %0
%6 = icmp eq i8 %5, 0
br i1 %6, label %97, label %7
7: ; preds = %4
%8 = icmp slt i32 %1, 4
br i1 %8, label %97, label %9
9: ; preds = %7
%10 = getelementptr inbounds i8, i8* %0, i64 2
%11 = load i8, i8* %10
%12 = zext i8 %11 to i32
%13 = getelementptr inbounds i8, i8* %0, i64 3
%14 = load i8, i8* %13
%15 = zext i8 %14 to i32
%16 = and i32 %15, 1
%17 = icmp eq i32 %16, 0
br i1 %17, label %18, label %97
18: ; preds = %9
%19 = icmp ult i32 %1, 5
br i1 %19, label %97, label %20
20: ; preds = %18
%21 = mul nuw nsw i32 %12, 100
%22 = mul nuw nsw i32 %15, 10
%23 = add nuw nsw i32 %22, %21
%24 = getelementptr inbounds i8, i8* %0, i64 4
%25 = load i8, i8* %24
%26 = zext i8 %25 to i32
%27 = add nuw nsw i32 %23, %26
%28 = trunc i32 %27 to i16
%29 = urem i16 %28, 3
%30 = icmp eq i16 %29, 0
br i1 %30, label %31, label %97
31: ; preds = %20
%32 = icmp ult i32 %1, 6
br i1 %32, label %97, label %33
33: ; preds = %31
%34 = mul nuw nsw i32 %15, 100
%35 = mul nuw nsw i32 %26, 10
%36 = add nuw nsw i32 %35, %34
%37 = getelementptr inbounds i8, i8* %0, i64 5
%38 = load i8, i8* %37
%39 = zext i8 %38 to i32
%40 = add nuw nsw i32 %36, %39
%41 = trunc i32 %40 to i16
%42 = urem i16 %41, 5
%43 = icmp eq i16 %42, 0
br i1 %43, label %44, label %97
44: ; preds = %33
%45 = icmp ult i32 %1, 7
br i1 %45, label %97, label %46
46: ; preds = %44
%47 = mul nuw nsw i32 %26, 100
%48 = mul nuw nsw i32 %39, 10
%49 = add nuw nsw i32 %48, %47
%50 = getelementptr inbounds i8, i8* %0, i64 6
%51 = load i8, i8* %50
%52 = zext i8 %51 to i32
%53 = add nuw nsw i32 %49, %52
%54 = trunc i32 %53 to i16
%55 = urem i16 %54, 7
%56 = icmp eq i16 %55, 0
br i1 %56, label %57, label %97
57: ; preds = %46
%58 = icmp ult i32 %1, 8
br i1 %58, label %97, label %59
59: ; preds = %57
%60 = mul nuw nsw i32 %39, 100
%61 = mul nuw nsw i32 %52, 10
%62 = add nuw nsw i32 %61, %60
%63 = getelementptr inbounds i8, i8* %0, i64 7
%64 = load i8, i8* %63
%65 = zext i8 %64 to i32
%66 = add nuw nsw i32 %62, %65
%67 = trunc i32 %66 to i16
%68 = urem i16 %67, 11
%69 = icmp eq i16 %68, 0
br i1 %69, label %70, label %97
70: ; preds = %59
%71 = icmp ult i32 %1, 9
br i1 %71, label %97, label %72
72: ; preds = %70
%73 = mul nuw nsw i32 %52, 100
%74 = mul nuw nsw i32 %65, 10
%75 = add nuw nsw i32 %74, %73
%76 = getelementptr inbounds i8, i8* %0, i64 8
%77 = load i8, i8* %76
%78 = zext i8 %77 to i32
%79 = add nuw nsw i32 %75, %78
%80 = trunc i32 %79 to i16
%81 = urem i16 %80, 13
%82 = icmp eq i16 %81, 0
br i1 %82, label %83, label %97
83: ; preds = %72
%84 = icmp ult i32 %1, 10
br i1 %84, label %97, label %85
85: ; preds = %83
%86 = mul nuw nsw i32 %65, 100
%87 = mul nuw nsw i32 %78, 10
%88 = add nuw nsw i32 %87, %86
%89 = getelementptr inbounds i8, i8* %0, i64 9
%90 = load i8, i8* %89
%91 = zext i8 %90 to i32
%92 = add nuw nsw i32 %88, %91
%93 = trunc i32 %92 to i16
%94 = urem i16 %93, 17
%95 = icmp eq i16 %94, 0
%96 = zext i1 %95 to i32
br label %97
97: ; preds = %85, %83, %72, %70, %59, %57, %46, %44, %33, %31, %20, %18, %9, %7, %4, %2
%98 = phi i32 [ 1, %2 ], [ 0, %4 ], [ 1, %7 ], [ 0, %9 ], [ 1, %18 ], [ 0, %20 ], [ 1, %31 ], [ 0, %33 ], [ 1, %44 ], [ 0, %46 ], [ 1, %57 ], [ 0, %59 ], [ 1, %70 ], [ 0, %72 ], [ 1, %83 ], [ %96, %85 ]
ret i32 %98
}