signed int vecinos_m(unsigned char **board, unsigned int x, unsigned int y,
                     unsigned int rows, unsigned int cols) {
  unsigned int vecinos = 0;
  int i, j;
  for (i = -1; i < 2; i++) {
    for (j = -1; j < 2; j++) {
      if (x + i >= 0 && x + i < cols && y + j >= 0 && y + j < rows) {
        if ((!(i == 0 && j == 0)) && board[x + i][y + j] == '1') {
          vecinos++;
        }
      }
    }
  }
  return vecinos;
}


x86 assembly (clang, -O0):
<vecinos_m>:
push   %rbp
mov    %rsp,%rbp
mov    %rdi,-0x8(%rbp)
mov    %esi,-0xc(%rbp)
mov    %edx,-0x10(%rbp)
mov    %ecx,-0x14(%rbp)
mov    %r8d,-0x18(%rbp)
movl   $0x0,-0x1c(%rbp)
movl   $0xffffffff,-0x20(%rbp)
cmpl   $0x2,-0x20(%rbp)
jge    11e7 <vecinos_m+0xe7>
movl   $0xffffffff,-0x24(%rbp)
cmpl   $0x2,-0x24(%rbp)
jge    11d4 <vecinos_m+0xd4>
mov    -0xc(%rbp),%eax
add    -0x20(%rbp),%eax
cmp    $0x0,%eax
jb     11c1 <vecinos_m+0xc1>
mov    -0xc(%rbp),%eax
add    -0x20(%rbp),%eax
cmp    -0x18(%rbp),%eax
jae    11c1 <vecinos_m+0xc1>
mov    -0x10(%rbp),%eax
add    -0x24(%rbp),%eax
cmp    $0x0,%eax
jb     11c1 <vecinos_m+0xc1>
mov    -0x10(%rbp),%eax
add    -0x24(%rbp),%eax
cmp    -0x14(%rbp),%eax
jae    11c1 <vecinos_m+0xc1>
cmpl   $0x0,-0x20(%rbp)
jne    118e <vecinos_m+0x8e>
cmpl   $0x0,-0x24(%rbp)
je     11bc <vecinos_m+0xbc>
mov    -0x8(%rbp),%rax
mov    -0xc(%rbp),%ecx
add    -0x20(%rbp),%ecx
mov    %ecx,%ecx
mov    (%rax,%rcx,8),%rax
mov    -0x10(%rbp),%ecx
add    -0x24(%rbp),%ecx
mov    %ecx,%ecx
movzbl (%rax,%rcx,1),%eax
cmp    $0x31,%eax
jne    11bc <vecinos_m+0xbc>
mov    -0x1c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x1c(%rbp)
jmp    11c1 <vecinos_m+0xc1>
jmp    11c6 <vecinos_m+0xc6>
mov    -0x24(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x24(%rbp)
jmp    1134 <vecinos_m+0x34>
jmp    11d9 <vecinos_m+0xd9>
mov    -0x20(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x20(%rbp)
jmp    1123 <vecinos_m+0x23>
mov    -0x1c(%rbp),%eax
pop    %rbp
ret

x86 assembly (clang, -O2):
<vecinos_m>:
push   %rbx
lea    -0x1(%rsi),%r9d
xor    %eax,%eax
cmp    %r8d,%r9d
jae    115b <vecinos_m+0x5b>
lea    -0x1(%rdx),%r10d
xor    %eax,%eax
cmp    %ecx,%r10d
jae    1128 <vecinos_m+0x28>
mov    (%rdi,%r9,8),%r11
mov    %r10d,%r10d
xor    %eax,%eax
cmpb   $0x31,(%r11,%r10,1)
sete   %al
cmp    %ecx,%edx
jae    113f <vecinos_m+0x3f>
mov    (%rdi,%r9,8),%r10
mov    %edx,%r11d
xor    %ebx,%ebx
cmpb   $0x31,(%r10,%r11,1)
sete   %bl
add    %ebx,%eax
lea    0x1(%rdx),%r10d
cmp    %ecx,%r10d
jae    115b <vecinos_m+0x5b>
mov    (%rdi,%r9,8),%r9
mov    %r10d,%r10d
xor    %ebx,%ebx
cmpb   $0x31,(%r9,%r10,1)
sete   %bl
add    %ebx,%eax
cmp    %r8d,%esi
jae    119b <vecinos_m+0x9b>
mov    %esi,%r9d
lea    -0x1(%rdx),%r10d
cmp    %ecx,%r10d
jae    117f <vecinos_m+0x7f>
mov    (%rdi,%r9,8),%r11
mov    %r10d,%r10d
xor    %ebx,%ebx
cmpb   $0x31,(%r11,%r10,1)
sete   %bl
add    %ebx,%eax
lea    0x1(%rdx),%r10d
cmp    %ecx,%r10d
jae    119b <vecinos_m+0x9b>
mov    (%rdi,%r9,8),%r9
mov    %r10d,%r10d
xor    %ebx,%ebx
cmpb   $0x31,(%r9,%r10,1)
sete   %bl
add    %ebx,%eax
add    $0x1,%esi
cmp    %r8d,%esi
jae    11ef <vecinos_m+0xef>
lea    -0x1(%rdx),%r8d
cmp    %ecx,%r8d
jae    11bf <vecinos_m+0xbf>
mov    (%rdi,%rsi,8),%r9
mov    %r8d,%r8d
xor    %ebx,%ebx
cmpb   $0x31,(%r9,%r8,1)
sete   %bl
add    %ebx,%eax
cmp    %ecx,%edx
jae    11d6 <vecinos_m+0xd6>
mov    (%rdi,%rsi,8),%r8
mov    %edx,%r9d
xor    %ebx,%ebx
cmpb   $0x31,(%r8,%r9,1)
sete   %bl
add    %ebx,%eax
add    $0x1,%edx
cmp    %ecx,%edx
jae    11ef <vecinos_m+0xef>
mov    (%rdi,%rsi,8),%rcx
mov    %edx,%edx
xor    %esi,%esi
cmpb   $0x31,(%rcx,%rdx,1)
sete   %sil
add    %esi,%eax
pop    %rbx
ret

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

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