int score(int x, int border, int width, int prev) {
  int side = 5, leftside = 5, rightside = 100 - 5;
  if (x == 0)
    return prev;
  if (prev == 0 && border - side <= x && x <= border + side)
    return prev + 1;
  if (prev > 0 && prev < 4) {
    if (x < width * rightside / 100 && x > width * leftside / 100)
      return prev + 1;
    else
      return 1;
  }
  if (prev == 4 && border - side <= x && x <= border + side)
    return prev + 1;
  if (prev > 4 && prev < 6) {
    if (x < width * rightside / 100 && x > width * leftside / 100)
      return prev + 1;
    else
      return 5;
  }
  return prev;
}


x86 assembly (clang, -O0):
<score>:
push   %rbp
mov    %rsp,%rbp
mov    %edi,-0x8(%rbp)
mov    %esi,-0xc(%rbp)
mov    %edx,-0x10(%rbp)
mov    %ecx,-0x14(%rbp)
movl   $0x5,-0x18(%rbp)
movl   $0x5,-0x1c(%rbp)
movl   $0x5f,-0x20(%rbp)
cmpl   $0x0,-0x8(%rbp)
jne    113a <score+0x3a>
mov    -0x14(%rbp),%eax
mov    %eax,-0x4(%rbp)
jmp    1294 <score+0x194>
cmpl   $0x0,-0x14(%rbp)
jne    1172 <score+0x72>
mov    -0xc(%rbp),%eax
sub    -0x18(%rbp),%eax
cmp    -0x8(%rbp),%eax
jg     1172 <score+0x72>
mov    -0x8(%rbp),%eax
mov    -0xc(%rbp),%ecx
add    -0x18(%rbp),%ecx
cmp    %ecx,%eax
jg     1172 <score+0x72>
mov    -0x14(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x4(%rbp)
jmp    1294 <score+0x194>
cmpl   $0x0,-0x14(%rbp)
jle    11e4 <score+0xe4>
cmpl   $0x4,-0x14(%rbp)
jge    11e4 <score+0xe4>
mov    -0x8(%rbp),%eax
mov    %eax,-0x24(%rbp)
mov    -0x10(%rbp),%eax
imul   -0x20(%rbp),%eax
mov    $0x64,%ecx
cltd
idiv   %ecx
mov    %eax,%ecx
mov    -0x24(%rbp),%eax
cmp    %ecx,%eax
jge    11d8 <score+0xd8>
mov    -0x8(%rbp),%eax
mov    %eax,-0x28(%rbp)
mov    -0x10(%rbp),%eax
imul   -0x1c(%rbp),%eax
mov    $0x64,%ecx
cltd
idiv   %ecx
mov    %eax,%ecx
mov    -0x28(%rbp),%eax
cmp    %ecx,%eax
jle    11d8 <score+0xd8>
mov    -0x14(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x4(%rbp)
jmp    1294 <score+0x194>
movl   $0x1,-0x4(%rbp)
jmp    1294 <score+0x194>
cmpl   $0x4,-0x14(%rbp)
jne    121c <score+0x11c>
mov    -0xc(%rbp),%eax
sub    -0x18(%rbp),%eax
cmp    -0x8(%rbp),%eax
jg     121c <score+0x11c>
mov    -0x8(%rbp),%eax
mov    -0xc(%rbp),%ecx
add    -0x18(%rbp),%ecx
cmp    %ecx,%eax
jg     121c <score+0x11c>
mov    -0x14(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x4(%rbp)
jmp    1294 <score+0x194>
cmpl   $0x4,-0x14(%rbp)
jle    128e <score+0x18e>
cmpl   $0x6,-0x14(%rbp)
jge    128e <score+0x18e>
mov    -0x8(%rbp),%eax
mov    %eax,-0x2c(%rbp)
mov    -0x10(%rbp),%eax
imul   -0x20(%rbp),%eax
mov    $0x64,%ecx
cltd
idiv   %ecx
mov    %eax,%ecx
mov    -0x2c(%rbp),%eax
cmp    %ecx,%eax
jge    1282 <score+0x182>
mov    -0x8(%rbp),%eax
mov    %eax,-0x30(%rbp)
mov    -0x10(%rbp),%eax
imul   -0x1c(%rbp),%eax
mov    $0x64,%ecx
cltd
idiv   %ecx
mov    %eax,%ecx
mov    -0x30(%rbp),%eax
cmp    %ecx,%eax
jle    1282 <score+0x182>
mov    -0x14(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x4(%rbp)
jmp    1294 <score+0x194>
movl   $0x5,-0x4(%rbp)
jmp    1294 <score+0x194>
mov    -0x14(%rbp),%eax
mov    %eax,-0x4(%rbp)
mov    -0x4(%rbp),%eax
pop    %rbp
ret

x86 assembly (clang, -O2):
<score>:
test   %edi,%edi
je     111e <score+0x1e>
lea    -0x5(%rsi),%r8d
add    $0x5,%esi
test   %ecx,%ecx
jne    1121 <score+0x21>
cmp    %edi,%r8d
jg     1121 <score+0x21>
mov    $0x1,%eax
cmp    %edi,%esi
jl     1121 <score+0x21>
ret
mov    %ecx,%eax
ret
lea    -0x1(%rcx),%eax
cmp    $0x2,%eax
ja     116e <score+0x6e>
imul   $0x5f,%edx,%eax
cltq
imul   $0x51eb851f,%rax,%rax
mov    %rax,%rsi
shr    $0x3f,%rsi
sar    $0x25,%rax
add    %esi,%eax
movslq %edx,%rdx
imul   $0x66666667,%rdx,%rdx
mov    %rdx,%rsi
shr    $0x3f,%rsi
sar    $0x23,%rdx
add    %esi,%edx
add    $0x1,%ecx
cmp    %edi,%eax
mov    $0x1,%eax
cmovle %eax,%ecx
cmp    %edi,%edx
cmovge %eax,%ecx
mov    %ecx,%eax
ret
cmp    $0x4,%ecx
jne    1181 <score+0x81>
cmp    %edi,%r8d
jg     1181 <score+0x81>
mov    $0x5,%eax
cmp    %edi,%esi
jge    111d <score+0x1d>
mov    %ecx,%eax
cmp    $0x5,%ecx
jne    111d <score+0x1d>
imul   $0x5f,%edx,%eax
cltq
imul   $0x51eb851f,%rax,%rax
mov    %rax,%rcx
shr    $0x3f,%rcx
sar    $0x25,%rax
add    %ecx,%eax
cmp    %edi,%eax
setg   %al
movslq %edx,%rcx
imul   $0x66666667,%rcx,%rcx
mov    %rcx,%rdx
shr    $0x3f,%rdx
sar    $0x23,%rcx
add    %edx,%ecx
cmp    %edi,%ecx
setl   %cl
and    %al,%cl
movzbl %cl,%eax
add    $0x5,%eax
ret

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

LLVM IR (-O2):
define i32 @score(i32 %0, i32 %1, i32 %2, i32 %3) {
%5 = icmp eq i32 %0, 0
br i1 %5, label %40, label %6
6: ; preds = %4
%7 = icmp ne i32 %3, 0
%8 = add nsw i32 %1, -5
%9 = icmp sgt i32 %8, %0
%10 = select i1 %7, i1 true, i1 %9
%11 = add nsw i32 %1, 5
%12 = icmp slt i32 %11, %0
%13 = select i1 %10, i1 true, i1 %12
br i1 %13, label %14, label %40
14: ; preds = %6
%15 = add i32 %3, -1
%16 = icmp ult i32 %15, 3
br i1 %16, label %17, label %26
17: ; preds = %14
%18 = mul nsw i32 %2, 95
%19 = sdiv i32 %18, 100
%20 = icmp sgt i32 %19, %0
%21 = sdiv i32 %2, 20
%22 = icmp slt i32 %21, %0
%23 = and i1 %22, %20
%24 = add nuw nsw i32 %3, 1
%25 = select i1 %23, i32 %24, i32 1
br label %40
26: ; preds = %14
%27 = icmp ne i32 %3, 4
%28 = select i1 %27, i1 true, i1 %9
%29 = select i1 %28, i1 true, i1 %12
br i1 %29, label %30, label %40
30: ; preds = %26
%31 = icmp eq i32 %3, 5
br i1 %31, label %32, label %40
32: ; preds = %30
%33 = mul nsw i32 %2, 95
%34 = sdiv i32 %33, 100
%35 = icmp sgt i32 %34, %0
%36 = sdiv i32 %2, 20
%37 = icmp slt i32 %36, %0
%38 = and i1 %37, %35
%39 = select i1 %38, i32 6, i32 5
br label %40
40: ; preds = %32, %17, %30, %26, %6, %4
%41 = phi i32 [ %3, %4 ], [ 1, %6 ], [ 5, %26 ], [ %3, %30 ], [ %25, %17 ], [ %39, %32 ]
ret i32 %41
}