int iniziaParola(char m[4][5], int r, int c, int d) {
  if (m[r][c] == '*')
    return 0;
  switch (d) {
  case 0:
    if (c - 1 < 0 || m[r][c - 1] == '*')
      return c + 1 < 5 && m[r][c + 1] != '*';
    return 0;
  case 1:
    if (r - 1 < 0 || m[r - 1][c] == '*') {
      return r + 1 < 4 && m[r + 1][c] != '*';
    }
    return 0;
  default:
    return 0;
  }
}


x86 assembly (clang, -O0):
<iniziaParola>:
push   %rbp
mov    %rsp,%rbp
mov    %rdi,-0x10(%rbp)
mov    %esi,-0x14(%rbp)
mov    %edx,-0x18(%rbp)
mov    %ecx,-0x1c(%rbp)
mov    -0x10(%rbp),%rax
movslq -0x14(%rbp),%rcx
imul   $0x5,%rcx,%rcx
add    %rcx,%rax
movslq -0x18(%rbp),%rcx
movsbl (%rax,%rcx,1),%eax
cmp    $0x2a,%eax
jne    113d <iniziaParola+0x3d>
movl   $0x0,-0x4(%rbp)
jmp    127a <iniziaParola+0x17a>
mov    -0x1c(%rbp),%eax
mov    %eax,-0x20(%rbp)
test   %eax,%eax
je     1161 <iniziaParola+0x61>
jmp    1150 <iniziaParola+0x50>
mov    -0x20(%rbp),%eax
sub    $0x1,%eax
je     11ea <iniziaParola+0xea>
jmp    1273 <iniziaParola+0x173>
mov    -0x18(%rbp),%eax
sub    $0x1,%eax
cmp    $0x0,%eax
jl     1195 <iniziaParola+0x95>
mov    -0x10(%rbp),%rax
movslq -0x14(%rbp),%rcx
imul   $0x5,%rcx,%rcx
add    %rcx,%rax
mov    -0x18(%rbp),%ecx
sub    $0x1,%ecx
movslq %ecx,%rcx
movsbl (%rax,%rcx,1),%eax
cmp    $0x2a,%eax
jne    11de <iniziaParola+0xde>
mov    -0x18(%rbp),%ecx
add    $0x1,%ecx
xor    %eax,%eax
cmp    $0x5,%ecx
mov    %al,-0x21(%rbp)
jge    11ce <iniziaParola+0xce>
mov    -0x10(%rbp),%rax
movslq -0x14(%rbp),%rcx
imul   $0x5,%rcx,%rcx
add    %rcx,%rax
mov    -0x18(%rbp),%ecx
add    $0x1,%ecx
movslq %ecx,%rcx
movsbl (%rax,%rcx,1),%eax
cmp    $0x2a,%eax
setne  %al
mov    %al,-0x21(%rbp)
mov    -0x21(%rbp),%al
and    $0x1,%al
movzbl %al,%eax
mov    %eax,-0x4(%rbp)
jmp    127a <iniziaParola+0x17a>
movl   $0x0,-0x4(%rbp)
jmp    127a <iniziaParola+0x17a>
mov    -0x14(%rbp),%eax
sub    $0x1,%eax
cmp    $0x0,%eax
jl     121e <iniziaParola+0x11e>
mov    -0x10(%rbp),%rax
mov    -0x14(%rbp),%ecx
sub    $0x1,%ecx
movslq %ecx,%rcx
imul   $0x5,%rcx,%rcx
add    %rcx,%rax
movslq -0x18(%rbp),%rcx
movsbl (%rax,%rcx,1),%eax
cmp    $0x2a,%eax
jne    1267 <iniziaParola+0x167>
mov    -0x14(%rbp),%ecx
add    $0x1,%ecx
xor    %eax,%eax
cmp    $0x4,%ecx
mov    %al,-0x22(%rbp)
jge    1257 <iniziaParola+0x157>
mov    -0x10(%rbp),%rax
mov    -0x14(%rbp),%ecx
add    $0x1,%ecx
movslq %ecx,%rcx
imul   $0x5,%rcx,%rcx
add    %rcx,%rax
movslq -0x18(%rbp),%rcx
movsbl (%rax,%rcx,1),%eax
cmp    $0x2a,%eax
setne  %al
mov    %al,-0x22(%rbp)
mov    -0x22(%rbp),%al
and    $0x1,%al
movzbl %al,%eax
mov    %eax,-0x4(%rbp)
jmp    127a <iniziaParola+0x17a>
movl   $0x0,-0x4(%rbp)
jmp    127a <iniziaParola+0x17a>
movl   $0x0,-0x4(%rbp)
mov    -0x4(%rbp),%eax
pop    %rbp
ret

x86 assembly (clang, -O2):
<iniziaParola>:
movslq %esi,%r9
movslq %edx,%r8
lea    (%r9,%r9,4),%r10
add    %rdi,%r10
xor    %eax,%eax
cmpb   $0x2a,(%r8,%r10,1)
je     116b <iniziaParola+0x6b>
cmp    $0x1,%ecx
je     113a <iniziaParola+0x3a>
test   %ecx,%ecx
jne    116b <iniziaParola+0x6b>
test   %edx,%edx
jle    1132 <iniziaParola+0x32>
cmp    $0x3,%edx
ja     116b <iniziaParola+0x6b>
lea    -0x1(%rdx),%ecx
cmpb   $0x2a,(%rcx,%r10,1)
jne    116b <iniziaParola+0x6b>
add    $0x1,%edx
movslq %edx,%r8
jmp    115a <iniziaParola+0x5a>
test   %esi,%esi
jle    1154 <iniziaParola+0x54>
cmp    $0x2,%esi
ja     116b <iniziaParola+0x6b>
lea    -0x1(%rsi),%ecx
lea    (%rcx,%rcx,4),%rcx
add    %rdi,%rcx
cmpb   $0x2a,(%r8,%rcx,1)
jne    116b <iniziaParola+0x6b>
add    $0x1,%esi
movslq %esi,%r9
lea    (%r9,%r9,4),%rax
add    %rax,%rdi
xor    %eax,%eax
cmpb   $0x2a,(%r8,%rdi,1)
setne  %al
ret

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

LLVM IR (-O2):
define i32 @iniziaParola([5 x i8]* nocapture %0, i32 %1, i32 %2, i32 %3) {
%5 = sext i32 %1 to i64
%6 = sext i32 %2 to i64
%7 = getelementptr inbounds [5 x i8], [5 x i8]* %0, i64 %5, i64 %6
%8 = load i8, i8* %7
%9 = icmp eq i8 %8, 42
br i1 %9, label %44, label %10
10: ; preds = %4
switch i32 %3, label %44 [
i32 0, label %11
i32 1, label %24
]
11: ; preds = %10
%12 = icmp slt i32 %2, 1
br i1 %12, label %21, label %13
13: ; preds = %11
%14 = add nsw i32 %2, -1
%15 = zext i32 %14 to i64
%16 = getelementptr inbounds [5 x i8], [5 x i8]* %0, i64 %5, i64 %15
%17 = load i8, i8* %16
%18 = icmp eq i8 %17, 42
%19 = icmp ult i32 %2, 4
%20 = and i1 %19, %18
br i1 %20, label %21, label %44
21: ; preds = %11, %13
%22 = add nsw i32 %2, 1
%23 = sext i32 %22 to i64
br label %37
24: ; preds = %10
%25 = icmp slt i32 %1, 1
br i1 %25, label %34, label %26
26: ; preds = %24
%27 = add nsw i32 %1, -1
%28 = zext i32 %27 to i64
%29 = getelementptr inbounds [5 x i8], [5 x i8]* %0, i64 %28, i64 %6
%30 = load i8, i8* %29
%31 = icmp eq i8 %30, 42
%32 = icmp ult i32 %1, 3
%33 = and i1 %32, %31
br i1 %33, label %34, label %44
34: ; preds = %24, %26
%35 = add nsw i32 %1, 1
%36 = sext i32 %35 to i64
br label %37
37: ; preds = %21, %34
%38 = phi i64 [ %6, %34 ], [ %23, %21 ]
%39 = phi i64 [ %36, %34 ], [ %5, %21 ]
%40 = getelementptr inbounds [5 x i8], [5 x i8]* %0, i64 %39, i64 %38
%41 = load i8, i8* %40
%42 = icmp ne i8 %41, 42
%43 = zext i1 %42 to i32
br label %44
44: ; preds = %37, %10, %26, %13, %4
%45 = phi i32 [ 0, %4 ], [ 0, %13 ], [ 0, %26 ], [ 0, %10 ], [ %43, %37 ]
ret i32 %45
}