double ji(int n) {
  if (n >= 90 && n <= 100)
    return 4.0f;
  else if (n >= 85 && n <= 89)
    return 3.7f;
  else if (n >= 82 && n <= 84)
    return 3.3f;
  else if (n >= 78 && n <= 81)
    return 3.0f;
  else if (n >= 75 && n <= 77)
    return 2.7f;
  else if (n >= 72 && n <= 74)
    return 2.3f;
  else if (n >= 68 && n <= 71)
    return 2.0f;
  else if (n >= 64 && n <= 67)
    return 1.5f;
  else if (n >= 60 && n <= 63)
    return 1.0f;
  else
    return 0;
}


x86 assembly (clang, -O0):
<ji>:
push   %rbp
mov    %rsp,%rbp
mov    %edi,-0xc(%rbp)
cmpl   $0x5a,-0xc(%rbp)
jl     112d <ji+0x2d>
cmpl   $0x64,-0xc(%rbp)
jg     112d <ji+0x2d>
movsd  0xf1d(%rip),%xmm0
movsd  %xmm0,-0x8(%rbp)
jmp    1265 <ji+0x165>
cmpl   $0x55,-0xc(%rbp)
jl     1153 <ji+0x53>
cmpl   $0x59,-0xc(%rbp)
jg     1153 <ji+0x53>
movsd  0xeef(%rip),%xmm0
movsd  %xmm0,-0x8(%rbp)
jmp    1265 <ji+0x165>
cmpl   $0x52,-0xc(%rbp)
jl     1179 <ji+0x79>
cmpl   $0x54,-0xc(%rbp)
jg     1179 <ji+0x79>
movsd  0xec1(%rip),%xmm0
movsd  %xmm0,-0x8(%rbp)
jmp    1265 <ji+0x165>
cmpl   $0x4e,-0xc(%rbp)
jl     119f <ji+0x9f>
cmpl   $0x51,-0xc(%rbp)
jg     119f <ji+0x9f>
movsd  0xe93(%rip),%xmm0
movsd  %xmm0,-0x8(%rbp)
jmp    1265 <ji+0x165>
cmpl   $0x4b,-0xc(%rbp)
jl     11c5 <ji+0xc5>
cmpl   $0x4d,-0xc(%rbp)
jg     11c5 <ji+0xc5>
movsd  0xe65(%rip),%xmm0
movsd  %xmm0,-0x8(%rbp)
jmp    1265 <ji+0x165>
cmpl   $0x48,-0xc(%rbp)
jl     11eb <ji+0xeb>
cmpl   $0x4a,-0xc(%rbp)
jg     11eb <ji+0xeb>
movsd  0xe37(%rip),%xmm0
movsd  %xmm0,-0x8(%rbp)
jmp    1265 <ji+0x165>
cmpl   $0x44,-0xc(%rbp)
jl     1211 <ji+0x111>
cmpl   $0x47,-0xc(%rbp)
jg     1211 <ji+0x111>
movsd  0xe09(%rip),%xmm0
movsd  %xmm0,-0x8(%rbp)
jmp    1265 <ji+0x165>
cmpl   $0x40,-0xc(%rbp)
jl     1237 <ji+0x137>
cmpl   $0x43,-0xc(%rbp)
jg     1237 <ji+0x137>
movsd  0xddb(%rip),%xmm0
movsd  %xmm0,-0x8(%rbp)
jmp    1265 <ji+0x165>
cmpl   $0x3c,-0xc(%rbp)
jl     125d <ji+0x15d>
cmpl   $0x3f,-0xc(%rbp)
jg     125d <ji+0x15d>
movsd  0xdad(%rip),%xmm0
movsd  %xmm0,-0x8(%rbp)
jmp    1265 <ji+0x165>
xorps  %xmm0,%xmm0
movsd  %xmm0,-0x8(%rbp)
movsd  -0x8(%rbp),%xmm0
pop    %rbp
ret

x86 assembly (clang, -O2):
<ji>:
lea    -0x5a(%rdi),%eax
cmp    $0xb,%eax
jae    1111 <ji+0x11>
movsd  0xef0(%rip),%xmm0
ret
lea    -0x55(%rdi),%eax
cmp    $0x5,%eax
jae    1122 <ji+0x22>
movsd  0xee7(%rip),%xmm0
ret
lea    -0x52(%rdi),%eax
cmp    $0x3,%eax
jae    1133 <ji+0x33>
movsd  0xede(%rip),%xmm0
ret
lea    -0x4e(%rdi),%eax
cmp    $0x4,%eax
jae    1144 <ji+0x44>
movsd  0xed5(%rip),%xmm0
ret
lea    -0x4b(%rdi),%eax
cmp    $0x3,%eax
jae    1155 <ji+0x55>
movsd  0xecc(%rip),%xmm0
ret
lea    -0x48(%rdi),%eax
cmp    $0x3,%eax
jae    1166 <ji+0x66>
movsd  0xec3(%rip),%xmm0
ret
and    $0xfffffffc,%edi
cmp    $0x40,%edi
je     117c <ji+0x7c>
cmp    $0x44,%edi
jne    1185 <ji+0x85>
movsd  0xeb5(%rip),%xmm0
ret
movsd  0xeb4(%rip),%xmm0
ret
cmp    $0x3c,%edi
je     118e <ji+0x8e>
xorps  %xmm0,%xmm0
ret
movsd  0xeaa(%rip),%xmm0
ret

LLVM IR (-O0):
define double @ji(i32 %0) {
%2 = alloca double
%3 = alloca i32
store i32 %0, i32* %3
%4 = load i32, i32* %3
%5 = icmp sge i32 %4, 90
br i1 %5, label %6, label %10
6: ; preds = %1
%7 = load i32, i32* %3
%8 = icmp sle i32 %7, 100
br i1 %8, label %9, label %10
9: ; preds = %6
store double 4.000000e+00, double* %2
br label %67
10: ; preds = %6, %1
%11 = load i32, i32* %3
%12 = icmp sge i32 %11, 85
br i1 %12, label %13, label %17
13: ; preds = %10
%14 = load i32, i32* %3
%15 = icmp sle i32 %14, 89
br i1 %15, label %16, label %17
16: ; preds = %13
store double 0x400D9999A0000000, double* %2
br label %67
17: ; preds = %13, %10
%18 = load i32, i32* %3
%19 = icmp sge i32 %18, 82
br i1 %19, label %20, label %24
20: ; preds = %17
%21 = load i32, i32* %3
%22 = icmp sle i32 %21, 84
br i1 %22, label %23, label %24
23: ; preds = %20
store double 0x400A666660000000, double* %2
br label %67
24: ; preds = %20, %17
%25 = load i32, i32* %3
%26 = icmp sge i32 %25, 78
br i1 %26, label %27, label %31
27: ; preds = %24
%28 = load i32, i32* %3
%29 = icmp sle i32 %28, 81
br i1 %29, label %30, label %31
30: ; preds = %27
store double 3.000000e+00, double* %2
br label %67
31: ; preds = %27, %24
%32 = load i32, i32* %3
%33 = icmp sge i32 %32, 75
br i1 %33, label %34, label %38
34: ; preds = %31
%35 = load i32, i32* %3
%36 = icmp sle i32 %35, 77
br i1 %36, label %37, label %38
37: ; preds = %34
store double 0x40059999A0000000, double* %2
br label %67
38: ; preds = %34, %31
%39 = load i32, i32* %3
%40 = icmp sge i32 %39, 72
br i1 %40, label %41, label %45
41: ; preds = %38
%42 = load i32, i32* %3
%43 = icmp sle i32 %42, 74
br i1 %43, label %44, label %45
44: ; preds = %41
store double 0x4002666660000000, double* %2
br label %67
45: ; preds = %41, %38
%46 = load i32, i32* %3
%47 = icmp sge i32 %46, 68
br i1 %47, label %48, label %52
48: ; preds = %45
%49 = load i32, i32* %3
%50 = icmp sle i32 %49, 71
br i1 %50, label %51, label %52
51: ; preds = %48
store double 2.000000e+00, double* %2
br label %67
52: ; preds = %48, %45
%53 = load i32, i32* %3
%54 = icmp sge i32 %53, 64
br i1 %54, label %55, label %59
55: ; preds = %52
%56 = load i32, i32* %3
%57 = icmp sle i32 %56, 67
br i1 %57, label %58, label %59
58: ; preds = %55
store double 1.500000e+00, double* %2
br label %67
59: ; preds = %55, %52
%60 = load i32, i32* %3
%61 = icmp sge i32 %60, 60
br i1 %61, label %62, label %66
62: ; preds = %59
%63 = load i32, i32* %3
%64 = icmp sle i32 %63, 63
br i1 %64, label %65, label %66
65: ; preds = %62
store double 1.000000e+00, double* %2
br label %67
66: ; preds = %62, %59
store double 0.000000e+00, double* %2
br label %67
67: ; preds = %66, %65, %58, %51, %44, %37, %30, %23, %16, %9
%68 = load double, double* %2
ret double %68
}

LLVM IR (-O2):
define double @ji(i32 %0) {
%2 = add i32 %0, -90
%3 = icmp ult i32 %2, 11
br i1 %3, label %25, label %4
4: ; preds = %1
%5 = add i32 %0, -85
%6 = icmp ult i32 %5, 5
br i1 %6, label %25, label %7
7: ; preds = %4
%8 = add i32 %0, -82
%9 = icmp ult i32 %8, 3
br i1 %9, label %25, label %10
10: ; preds = %7
%11 = add i32 %0, -78
%12 = icmp ult i32 %11, 4
br i1 %12, label %25, label %13
13: ; preds = %10
%14 = add i32 %0, -75
%15 = icmp ult i32 %14, 3
br i1 %15, label %25, label %16
16: ; preds = %13
%17 = add i32 %0, -72
%18 = icmp ult i32 %17, 3
br i1 %18, label %25, label %19
19: ; preds = %16
%20 = and i32 %0, -4
switch i32 %20, label %21 [
i32 68, label %25
i32 64, label %24
]
21: ; preds = %19
%22 = icmp eq i32 %20, 60
%23 = select i1 %22, double 1.000000e+00, double 0.000000e+00
br label %25
24: ; preds = %19
br label %25
25: ; preds = %19, %24, %21, %16, %13, %10, %7, %4, %1
%26 = phi double [ 4.000000e+00, %1 ], [ 0x400D9999A0000000, %4 ], [ 0x400A666660000000, %7 ], [ 3.000000e+00, %10 ], [ 0x40059999A0000000, %13 ], [ 0x4002666660000000, %16 ], [ 2.000000e+00, %19 ], [ %23, %21 ], [ 1.500000e+00, %24 ]
ret double %26
}