void checkChip(char grid[9][9], int directs[8], int x, int y, char chip) {
  int i = 0;
  if (grid[x][y - 1] == chip) {
    directs[i] = 1;
    i++;
  }
  if (grid[x + 1][y - 1] == chip) {
    directs[i] = 2;
    i++;
  }
  if (grid[x + 1][y] == chip) {
    directs[i] = 3;
    i++;
  }
  if (grid[x + 1][y + 1] == chip) {
    directs[i] = 4;
    i++;
  }
  if (grid[x][y + 1] == chip) {
    directs[i] = 5;
    i++;
  }
  if (grid[x - 1][y + 1] == chip) {
    directs[i] = 6;
    i++;
  }
  if (grid[x - 1][y] == chip) {
    directs[i] = 7;
    i++;
  }
  if (grid[x - 1][y - 1] == chip) {
    directs[i] = 8;
    i++;
  }
}


x86 assembly (clang, -O0):
<checkChip>:
push   %rbp
mov    %rsp,%rbp
mov    %r8b,%al
mov    %rdi,-0x8(%rbp)
mov    %rsi,-0x10(%rbp)
mov    %edx,-0x14(%rbp)
mov    %ecx,-0x18(%rbp)
mov    %al,-0x19(%rbp)
movl   $0x0,-0x20(%rbp)
mov    -0x8(%rbp),%rax
movslq -0x14(%rbp),%rcx
imul   $0x9,%rcx,%rcx
add    %rcx,%rax
mov    -0x18(%rbp),%ecx
sub    $0x1,%ecx
movslq %ecx,%rcx
movsbl (%rax,%rcx,1),%eax
movsbl -0x19(%rbp),%ecx
cmp    %ecx,%eax
jne    115f <checkChip+0x5f>
mov    -0x10(%rbp),%rax
movslq -0x20(%rbp),%rcx
movl   $0x1,(%rax,%rcx,4)
mov    -0x20(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x20(%rbp)
mov    -0x8(%rbp),%rax
mov    -0x14(%rbp),%ecx
add    $0x1,%ecx
movslq %ecx,%rcx
imul   $0x9,%rcx,%rcx
add    %rcx,%rax
mov    -0x18(%rbp),%ecx
sub    $0x1,%ecx
movslq %ecx,%rcx
movsbl (%rax,%rcx,1),%eax
movsbl -0x19(%rbp),%ecx
cmp    %ecx,%eax
jne    11a4 <checkChip+0xa4>
mov    -0x10(%rbp),%rax
movslq -0x20(%rbp),%rcx
movl   $0x2,(%rax,%rcx,4)
mov    -0x20(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x20(%rbp)
mov    -0x8(%rbp),%rax
mov    -0x14(%rbp),%ecx
add    $0x1,%ecx
movslq %ecx,%rcx
imul   $0x9,%rcx,%rcx
add    %rcx,%rax
movslq -0x18(%rbp),%rcx
movsbl (%rax,%rcx,1),%eax
movsbl -0x19(%rbp),%ecx
cmp    %ecx,%eax
jne    11e4 <checkChip+0xe4>
mov    -0x10(%rbp),%rax
movslq -0x20(%rbp),%rcx
movl   $0x3,(%rax,%rcx,4)
mov    -0x20(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x20(%rbp)
mov    -0x8(%rbp),%rax
mov    -0x14(%rbp),%ecx
add    $0x1,%ecx
movslq %ecx,%rcx
imul   $0x9,%rcx,%rcx
add    %rcx,%rax
mov    -0x18(%rbp),%ecx
add    $0x1,%ecx
movslq %ecx,%rcx
movsbl (%rax,%rcx,1),%eax
movsbl -0x19(%rbp),%ecx
cmp    %ecx,%eax
jne    1229 <checkChip+0x129>
mov    -0x10(%rbp),%rax
movslq -0x20(%rbp),%rcx
movl   $0x4,(%rax,%rcx,4)
mov    -0x20(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x20(%rbp)
mov    -0x8(%rbp),%rax
movslq -0x14(%rbp),%rcx
imul   $0x9,%rcx,%rcx
add    %rcx,%rax
mov    -0x18(%rbp),%ecx
add    $0x1,%ecx
movslq %ecx,%rcx
movsbl (%rax,%rcx,1),%eax
movsbl -0x19(%rbp),%ecx
cmp    %ecx,%eax
jne    1269 <checkChip+0x169>
mov    -0x10(%rbp),%rax
movslq -0x20(%rbp),%rcx
movl   $0x5,(%rax,%rcx,4)
mov    -0x20(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x20(%rbp)
mov    -0x8(%rbp),%rax
mov    -0x14(%rbp),%ecx
sub    $0x1,%ecx
movslq %ecx,%rcx
imul   $0x9,%rcx,%rcx
add    %rcx,%rax
mov    -0x18(%rbp),%ecx
add    $0x1,%ecx
movslq %ecx,%rcx
movsbl (%rax,%rcx,1),%eax
movsbl -0x19(%rbp),%ecx
cmp    %ecx,%eax
jne    12ae <checkChip+0x1ae>
mov    -0x10(%rbp),%rax
movslq -0x20(%rbp),%rcx
movl   $0x6,(%rax,%rcx,4)
mov    -0x20(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x20(%rbp)
mov    -0x8(%rbp),%rax
mov    -0x14(%rbp),%ecx
sub    $0x1,%ecx
movslq %ecx,%rcx
imul   $0x9,%rcx,%rcx
add    %rcx,%rax
movslq -0x18(%rbp),%rcx
movsbl (%rax,%rcx,1),%eax
movsbl -0x19(%rbp),%ecx
cmp    %ecx,%eax
jne    12ee <checkChip+0x1ee>
mov    -0x10(%rbp),%rax
movslq -0x20(%rbp),%rcx
movl   $0x7,(%rax,%rcx,4)
mov    -0x20(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x20(%rbp)
mov    -0x8(%rbp),%rax
mov    -0x14(%rbp),%ecx
sub    $0x1,%ecx
movslq %ecx,%rcx
imul   $0x9,%rcx,%rcx
add    %rcx,%rax
mov    -0x18(%rbp),%ecx
sub    $0x1,%ecx
movslq %ecx,%rcx
movsbl (%rax,%rcx,1),%eax
movsbl -0x19(%rbp),%ecx
cmp    %ecx,%eax
jne    1333 <checkChip+0x233>
mov    -0x10(%rbp),%rax
movslq -0x20(%rbp),%rcx
movl   $0x8,(%rax,%rcx,4)
mov    -0x20(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x20(%rbp)
pop    %rbp
ret

x86 assembly (clang, -O2):
<checkChip>:
push   %r14
push   %rbx
movslq %edx,%rax
movslq %ecx,%r10
lea    -0x1(%r10),%r9
lea    (%rax,%rax,8),%r14
add    %rdi,%r14
xor    %ecx,%ecx
cmp    %r8b,-0x1(%r10,%r14,1)
jne    1128 <checkChip+0x28>
movl   $0x1,(%rsi)
mov    $0x1,%ecx
lea    0x1(%rdx),%ebx
movslq %ebx,%rbx
lea    (%rbx,%rbx,8),%rbx
add    %rdi,%rbx
cmp    %r8b,(%r9,%rbx,1)
jne    1147 <checkChip+0x47>
mov    %ecx,%eax
movl   $0x2,(%rsi,%rax,4)
add    $0x1,%ecx
cmp    %r8b,(%r10,%rbx,1)
jne    1159 <checkChip+0x59>
mov    %ecx,%eax
movl   $0x3,(%rsi,%rax,4)
add    $0x1,%ecx
lea    0x1(%r10),%r11
cmp    %r8b,0x1(%r10,%rbx,1)
jne    1170 <checkChip+0x70>
mov    %ecx,%eax
movl   $0x4,(%rsi,%rax,4)
add    $0x1,%ecx
cmp    %r8b,(%r11,%r14,1)
jne    1182 <checkChip+0x82>
mov    %ecx,%eax
movl   $0x5,(%rsi,%rax,4)
add    $0x1,%ecx
add    $0xffffffff,%edx
movslq %edx,%rax
lea    (%rax,%rax,8),%rax
add    %rax,%rdi
cmp    %r8b,(%r11,%rdi,1)
je     11ae <checkChip+0xae>
cmp    %r8b,(%r10,%rdi,1)
je     11c0 <checkChip+0xc0>
cmp    %r8b,(%r9,%rdi,1)
jne    11aa <checkChip+0xaa>
mov    %ecx,%eax
movl   $0x8,(%rsi,%rax,4)
pop    %rbx
pop    %r14
ret
mov    %ecx,%eax
movl   $0x6,(%rsi,%rax,4)
add    $0x1,%ecx
cmp    %r8b,(%r10,%rdi,1)
jne    119b <checkChip+0x9b>
mov    %ecx,%eax
movl   $0x7,(%rsi,%rax,4)
add    $0x1,%ecx
cmp    %r8b,(%r9,%rdi,1)
je     11a1 <checkChip+0xa1>
jmp    11aa <checkChip+0xaa>

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

LLVM IR (-O2):
define void @checkChip([9 x i8]* nocapture %0, i32* nocapture writeonly %1, i32 %2, i32 %3, i8 signext %4) {
%6 = sext i32 %2 to i64
%7 = add nsw i32 %3, -1
%8 = sext i32 %7 to i64
%9 = getelementptr inbounds [9 x i8], [9 x i8]* %0, i64 %6, i64 %8
%10 = load i8, i8* %9
%11 = icmp eq i8 %10, %4
br i1 %11, label %12, label %13
12: ; preds = %5
store i32 1, i32* %1
br label %13
13: ; preds = %12, %5
%14 = phi i32 [ 1, %12 ], [ 0, %5 ]
%15 = add nsw i32 %2, 1
%16 = sext i32 %15 to i64
%17 = getelementptr inbounds [9 x i8], [9 x i8]* %0, i64 %16, i64 %8
%18 = load i8, i8* %17
%19 = icmp eq i8 %18, %4
br i1 %19, label %20, label %24
20: ; preds = %13
%21 = zext i32 %14 to i64
%22 = getelementptr inbounds i32, i32* %1, i64 %21
store i32 2, i32* %22
%23 = add nuw nsw i32 %14, 1
br label %24
24: ; preds = %20, %13
%25 = phi i32 [ %23, %20 ], [ %14, %13 ]
%26 = sext i32 %3 to i64
%27 = getelementptr inbounds [9 x i8], [9 x i8]* %0, i64 %16, i64 %26
%28 = load i8, i8* %27
%29 = icmp eq i8 %28, %4
br i1 %29, label %30, label %34
30: ; preds = %24
%31 = zext i32 %25 to i64
%32 = getelementptr inbounds i32, i32* %1, i64 %31
store i32 3, i32* %32
%33 = add nuw nsw i32 %25, 1
br label %34
34: ; preds = %30, %24
%35 = phi i32 [ %33, %30 ], [ %25, %24 ]
%36 = add nsw i32 %3, 1
%37 = sext i32 %36 to i64
%38 = getelementptr inbounds [9 x i8], [9 x i8]* %0, i64 %16, i64 %37
%39 = load i8, i8* %38
%40 = icmp eq i8 %39, %4
br i1 %40, label %41, label %45
41: ; preds = %34
%42 = zext i32 %35 to i64
%43 = getelementptr inbounds i32, i32* %1, i64 %42
store i32 4, i32* %43
%44 = add nuw nsw i32 %35, 1
br label %45
45: ; preds = %41, %34
%46 = phi i32 [ %44, %41 ], [ %35, %34 ]
%47 = getelementptr inbounds [9 x i8], [9 x i8]* %0, i64 %6, i64 %37
%48 = load i8, i8* %47
%49 = icmp eq i8 %48, %4
br i1 %49, label %50, label %54
50: ; preds = %45
%51 = zext i32 %46 to i64
%52 = getelementptr inbounds i32, i32* %1, i64 %51
store i32 5, i32* %52
%53 = add nuw nsw i32 %46, 1
br label %54
54: ; preds = %50, %45
%55 = phi i32 [ %53, %50 ], [ %46, %45 ]
%56 = add nsw i32 %2, -1
%57 = sext i32 %56 to i64
%58 = getelementptr inbounds [9 x i8], [9 x i8]* %0, i64 %57, i64 %37
%59 = load i8, i8* %58
%60 = icmp eq i8 %59, %4
br i1 %60, label %61, label %65
61: ; preds = %54
%62 = zext i32 %55 to i64
%63 = getelementptr inbounds i32, i32* %1, i64 %62
store i32 6, i32* %63
%64 = add nuw nsw i32 %55, 1
br label %65
65: ; preds = %61, %54
%66 = phi i32 [ %64, %61 ], [ %55, %54 ]
%67 = getelementptr inbounds [9 x i8], [9 x i8]* %0, i64 %57, i64 %26
%68 = load i8, i8* %67
%69 = icmp eq i8 %68, %4
br i1 %69, label %70, label %74
70: ; preds = %65
%71 = zext i32 %66 to i64
%72 = getelementptr inbounds i32, i32* %1, i64 %71
store i32 7, i32* %72
%73 = add nuw nsw i32 %66, 1
br label %74
74: ; preds = %70, %65
%75 = phi i32 [ %73, %70 ], [ %66, %65 ]
%76 = getelementptr inbounds [9 x i8], [9 x i8]* %0, i64 %57, i64 %8
%77 = load i8, i8* %76
%78 = icmp eq i8 %77, %4
br i1 %78, label %79, label %82
79: ; preds = %74
%80 = zext i32 %75 to i64
%81 = getelementptr inbounds i32, i32* %1, i64 %80
store i32 8, i32* %81
br label %82
82: ; preds = %79, %74
ret void
}