int reduce8(int r, int g, int b) {
  int colors_len = 8;
  int select = 0;
  int odistance = -1;
  int i, k = 1;
  int colors[][3] = {
      {0x00, 0x00, 0x00}, {0xd0, 0x10, 0x10}, {0x10, 0xe0, 0x10},
      {0xf7, 0xf5, 0x3a}, {0x10, 0x10, 0xf0}, {0xfb, 0x3d, 0xf8},
      {0x10, 0xf0, 0xf0}, {0xf0, 0xf0, 0xf0},
  };
  r /= k;
  r *= k;
  g /= k;
  g *= k;
  b /= k;
  b *= k;
  if (r < 30 && g < 30 && b < 30)
    return 0;
  if (r > 200 && g > 200 && b > 200)
    return 7;
  odistance = -1;
  for (i = 0; i < colors_len; i++) {
    int distance = (((((colors[i][0] - r)) < 0) ? -((colors[i][0] - r))
                                                : ((colors[i][0] - r))) *
                    (r)) +
                   (((((colors[i][1] - g)) < 0) ? -((colors[i][1] - g))
                                                : ((colors[i][1] - g))) *
                    (g)) +
                   (((((colors[i][2] - b)) < 0) ? -((colors[i][2] - b))
                                                : ((colors[i][2] - b))) *
                    (b));
    if (odistance == -1 || distance < odistance) {
      odistance = distance;
      select = i;
    }
  }
  return select;
}


x86 assembly (clang, -O0):
<reduce8>:
push   %rbp
mov    %rsp,%rbp
sub    $0xb0,%rsp
mov    %edi,-0x8(%rbp)
mov    %esi,-0xc(%rbp)
mov    %edx,-0x10(%rbp)
movl   $0x8,-0x14(%rbp)
movl   $0x0,-0x18(%rbp)
movl   $0xffffffff,-0x1c(%rbp)
movl   $0x1,-0x24(%rbp)
lea    -0x90(%rbp),%rdi
lea    0xeb2(%rip),%rsi
mov    $0x60,%edx
call   1030 <memcpy@plt>
mov    -0x24(%rbp),%ecx
mov    -0x8(%rbp),%eax
cltd
idiv   %ecx
mov    %eax,-0x8(%rbp)
mov    -0x24(%rbp),%eax
imul   -0x8(%rbp),%eax
mov    %eax,-0x8(%rbp)
mov    -0x24(%rbp),%ecx
mov    -0xc(%rbp),%eax
cltd
idiv   %ecx
mov    %eax,-0xc(%rbp)
mov    -0x24(%rbp),%eax
imul   -0xc(%rbp),%eax
mov    %eax,-0xc(%rbp)
mov    -0x24(%rbp),%ecx
mov    -0x10(%rbp),%eax
cltd
idiv   %ecx
mov    %eax,-0x10(%rbp)
mov    -0x24(%rbp),%eax
imul   -0x10(%rbp),%eax
mov    %eax,-0x10(%rbp)
cmpl   $0x1e,-0x8(%rbp)
jge    11c4 <reduce8+0xb4>
cmpl   $0x1e,-0xc(%rbp)
jge    11c4 <reduce8+0xb4>
cmpl   $0x1e,-0x10(%rbp)
jge    11c4 <reduce8+0xb4>
movl   $0x0,-0x4(%rbp)
jmp    13c1 <reduce8+0x2b1>
cmpl   $0xc8,-0x8(%rbp)
jle    11f7 <reduce8+0xe7>
cmpl   $0xc8,-0xc(%rbp)
jle    11f7 <reduce8+0xe7>
cmpl   $0xc8,-0x10(%rbp)
jle    11f7 <reduce8+0xe7>
movl   $0x7,-0x4(%rbp)
jmp    13c1 <reduce8+0x2b1>
movl   $0xffffffff,-0x1c(%rbp)
movl   $0x0,-0x20(%rbp)
mov    -0x20(%rbp),%eax
cmp    -0x14(%rbp),%eax
jge    13bb <reduce8+0x2ab>
movslq -0x20(%rbp),%rcx
lea    -0x90(%rbp),%rax
imul   $0xc,%rcx,%rcx
add    %rcx,%rax
mov    (%rax),%eax
sub    -0x8(%rbp),%eax
cmp    $0x0,%eax
jge    1257 <reduce8+0x147>
movslq -0x20(%rbp),%rcx
lea    -0x90(%rbp),%rax
imul   $0xc,%rcx,%rcx
add    %rcx,%rax
mov    (%rax),%ecx
sub    -0x8(%rbp),%ecx
xor    %eax,%eax
sub    %ecx,%eax
mov    %eax,-0x98(%rbp)
jmp    1274 <reduce8+0x164>
movslq -0x20(%rbp),%rcx
lea    -0x90(%rbp),%rax
imul   $0xc,%rcx,%rcx
add    %rcx,%rax
mov    (%rax),%eax
sub    -0x8(%rbp),%eax
mov    %eax,-0x98(%rbp)
mov    -0x98(%rbp),%eax
imul   -0x8(%rbp),%eax
mov    %eax,-0x9c(%rbp)
movslq -0x20(%rbp),%rcx
lea    -0x90(%rbp),%rax
imul   $0xc,%rcx,%rcx
add    %rcx,%rax
mov    0x4(%rax),%eax
sub    -0xc(%rbp),%eax
cmp    $0x0,%eax
jge    12cc <reduce8+0x1bc>
movslq -0x20(%rbp),%rcx
lea    -0x90(%rbp),%rax
imul   $0xc,%rcx,%rcx
add    %rcx,%rax
mov    0x4(%rax),%ecx
sub    -0xc(%rbp),%ecx
xor    %eax,%eax
sub    %ecx,%eax
mov    %eax,-0xa0(%rbp)
jmp    12ea <reduce8+0x1da>
movslq -0x20(%rbp),%rcx
lea    -0x90(%rbp),%rax
imul   $0xc,%rcx,%rcx
add    %rcx,%rax
mov    0x4(%rax),%eax
sub    -0xc(%rbp),%eax
mov    %eax,-0xa0(%rbp)
mov    -0x9c(%rbp),%eax
mov    -0xa0(%rbp),%ecx
imul   -0xc(%rbp),%ecx
add    %ecx,%eax
mov    %eax,-0xa4(%rbp)
movslq -0x20(%rbp),%rcx
lea    -0x90(%rbp),%rax
imul   $0xc,%rcx,%rcx
add    %rcx,%rax
mov    0x8(%rax),%eax
sub    -0x10(%rbp),%eax
cmp    $0x0,%eax
jge    134a <reduce8+0x23a>
movslq -0x20(%rbp),%rcx
lea    -0x90(%rbp),%rax
imul   $0xc,%rcx,%rcx
add    %rcx,%rax
mov    0x8(%rax),%ecx
sub    -0x10(%rbp),%ecx
xor    %eax,%eax
sub    %ecx,%eax
mov    %eax,-0xa8(%rbp)
jmp    1368 <reduce8+0x258>
movslq -0x20(%rbp),%rcx
lea    -0x90(%rbp),%rax
imul   $0xc,%rcx,%rcx
add    %rcx,%rax
mov    0x8(%rax),%eax
sub    -0x10(%rbp),%eax
mov    %eax,-0xa8(%rbp)
mov    -0xa4(%rbp),%eax
mov    -0xa8(%rbp),%ecx
imul   -0x10(%rbp),%ecx
add    %ecx,%eax
mov    %eax,-0x94(%rbp)
cmpl   $0xffffffff,-0x1c(%rbp)
je     1399 <reduce8+0x289>
mov    -0x94(%rbp),%eax
cmp    -0x1c(%rbp),%eax
jge    13a8 <reduce8+0x298>
mov    -0x94(%rbp),%eax
mov    %eax,-0x1c(%rbp)
mov    -0x20(%rbp),%eax
mov    %eax,-0x18(%rbp)
jmp    13ad <reduce8+0x29d>
mov    -0x20(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x20(%rbp)
jmp    1205 <reduce8+0xf5>
mov    -0x18(%rbp),%eax
mov    %eax,-0x4(%rbp)
mov    -0x4(%rbp),%eax
add    $0xb0,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<reduce8>:
push   %rbx
cmp    $0x1d,%edi
jg     1112 <reduce8+0x12>
cmp    $0x1d,%esi
jg     1112 <reduce8+0x12>
xor    %eax,%eax
cmp    $0x1e,%edx
jl     112f <reduce8+0x2f>
cmp    $0xc9,%edi
jl     1131 <reduce8+0x31>
cmp    $0xc9,%esi
jl     1131 <reduce8+0x31>
mov    $0x7,%eax
cmp    $0xc8,%edx
jle    1131 <reduce8+0x31>
pop    %rbx
ret
xor    %r8d,%r8d
mov    $0xffffffff,%r9d
lea    0xec7(%rip),%r11
xor    %r10d,%r10d
jmp    1164 <reduce8+0x64>
cs nopw 0x0(%rax,%rax,1)
add    $0x1,%r8
add    $0xc,%r11
mov    %ecx,%r9d
mov    %eax,%r10d
cmp    $0x8,%r8
je     112f <reduce8+0x2f>
mov    -0x8(%r11),%eax
mov    -0x4(%r11),%ecx
sub    %edi,%eax
mov    %eax,%ebx
neg    %ebx
cmovs  %eax,%ebx
imul   %edi,%ebx
sub    %esi,%ecx
mov    %ecx,%eax
neg    %eax
cmovs  %ecx,%eax
imul   %esi,%eax
add    %ebx,%eax
mov    (%r11),%ebx
sub    %edx,%ebx
mov    %ebx,%ecx
neg    %ecx
cmovs  %ebx,%ecx
imul   %edx,%ecx
add    %eax,%ecx
cmp    $0xffffffff,%r9d
sete   %al
cmp    %r9d,%ecx
setl   %bl
or     %al,%bl
mov    %r8d,%eax
jne    1150 <reduce8+0x50>
mov    %r10d,%eax
mov    %r9d,%ecx
jmp    1150 <reduce8+0x50>

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

LLVM IR (-O2):
@__const.reduce8.colors = [8 x [3 x i32]] [[3 x i32] zeroinitializer, [3 x i32] [i32 208, i32 16, i32 16], [3 x i32] [i32 16, i32 224, i32 16], [3 x i32] [i32 247, i32 245, i32 58], [3 x i32] [i32 16, i32 16, i32 240], [3 x i32] [i32 251, i32 61, i32 248], [3 x i32] [i32 16, i32 240, i32 240], [3 x i32] [i32 240, i32 240, i32 240]]
define i32 @reduce8(i32 %0, i32 %1, i32 %2) {
%4 = icmp slt i32 %0, 30
%5 = icmp slt i32 %1, 30
%6 = and i1 %4, %5
%7 = icmp slt i32 %2, 30
%8 = and i1 %6, %7
br i1 %8, label %44, label %9
9: ; preds = %3
%10 = icmp sgt i32 %0, 200
%11 = icmp sgt i32 %1, 200
%12 = and i1 %10, %11
%13 = icmp sgt i32 %2, 200
%14 = and i1 %12, %13
br i1 %14, label %44, label %15
15: ; preds = %9, %15
%16 = phi i64 [ %42, %15 ], [ 0, %9 ]
%17 = phi i32 [ %41, %15 ], [ -1, %9 ]
%18 = phi i32 [ %40, %15 ], [ 0, %9 ]
%19 = getelementptr inbounds [8 x [3 x i32]], [8 x [3 x i32]]* @__const.reduce8.colors, i64 0, i64 %16, i64 0
%20 = load i32, i32* %19
%21 = sub nsw i32 %20, %0
%22 = tail call i32 @llvm.abs.i32(i32 %21, i1 true)
%23 = mul nsw i32 %22, %0
%24 = getelementptr inbounds [8 x [3 x i32]], [8 x [3 x i32]]* @__const.reduce8.colors, i64 0, i64 %16, i64 1
%25 = load i32, i32* %24
%26 = sub nsw i32 %25, %1
%27 = tail call i32 @llvm.abs.i32(i32 %26, i1 true)
%28 = mul nsw i32 %27, %1
%29 = add nsw i32 %28, %23
%30 = getelementptr inbounds [8 x [3 x i32]], [8 x [3 x i32]]* @__const.reduce8.colors, i64 0, i64 %16, i64 2
%31 = load i32, i32* %30
%32 = sub nsw i32 %31, %2
%33 = tail call i32 @llvm.abs.i32(i32 %32, i1 true)
%34 = mul nsw i32 %33, %2
%35 = add nsw i32 %29, %34
%36 = icmp eq i32 %17, -1
%37 = icmp slt i32 %35, %17
%38 = select i1 %36, i1 true, i1 %37
%39 = trunc i64 %16 to i32
%40 = select i1 %38, i32 %39, i32 %18
%41 = select i1 %38, i32 %35, i32 %17
%42 = add nuw nsw i64 %16, 1
%43 = icmp eq i64 %42, 8
br i1 %43, label %44, label %15
44: ; preds = %15, %9, %3
%45 = phi i32 [ 0, %3 ], [ 7, %9 ], [ %40, %15 ]
ret i32 %45
}