#define NULL ((void *)0)
typedef unsigned long size_t; // Customize by platform.
typedef long intptr_t;
typedef unsigned long uintptr_t;
typedef long scalar_t__; // Either arithmetic or pointer type.
/* By default, we understand bool (as a convenience). */
typedef int bool;
#define false 0
#define true 1

/* Forward declarations */

/* Type definitions */

/* Variables and functions */
double fabs(double);
double rgb_to_value(double value_rgb, double mincolor, double maxcolor,
                    int color_mapping_style, double *interval_point,
                    int interval_mapping_num) {
  double value;
  int i;
  if (color_mapping_style == 1) {
    if (fabs(maxcolor - mincolor) > 0.00000001)
      value = value_rgb * (maxcolor - mincolor) + mincolor;
  } else if (color_mapping_style == 2) {
    mincolor = interval_point[0];
    maxcolor = interval_point[1];
    if (fabs(maxcolor - mincolor) > 0.00000001)
      value = value_rgb * (maxcolor - mincolor) + mincolor;
  } else if ((color_mapping_style == 3) || (color_mapping_style == 4)) {
    if (value_rgb <= interval_point[1]) {
      value = mincolor;
    } else if (value_rgb >= interval_point[interval_mapping_num * 2 + 1]) {
      value = maxcolor;
    } else {
      for (i = 1; i < interval_mapping_num + 1; i++) {
        if ((value_rgb <= interval_point[i * 2 + 1]) &&
            (value_rgb > interval_point[(i - 1) * 2 + 1])) {
          value = (value_rgb - interval_point[(i - 1) * 2 + 1]) /
                      (interval_point[i * 2 + 1] -
                       interval_point[(i - 1) * 2 + 1]) *
                      (interval_point[i * 2] - interval_point[(i - 1) * 2]) +
                  interval_point[(i - 1) * 2];
          break;
        }
      }
    }
  }
  return value;
}


x86 assembly (clang, -O0):
<rgb_to_value>:
push   %rbp
mov    %rsp,%rbp
movsd  %xmm0,-0x8(%rbp)
movsd  %xmm1,-0x10(%rbp)
movsd  %xmm2,-0x18(%rbp)
mov    %edi,-0x1c(%rbp)
mov    %rsi,-0x28(%rbp)
mov    %edx,-0x2c(%rbp)
cmpl   $0x1,-0x1c(%rbp)
jne    1174 <rgb_to_value+0x74>
movsd  -0x18(%rbp),%xmm0
subsd  -0x10(%rbp),%xmm0
movaps 0xed8(%rip),%xmm1
pand   %xmm1,%xmm0
movsd  0xebc(%rip),%xmm1
ucomisd %xmm1,%xmm0
jbe    116f <rgb_to_value+0x6f>
movsd  -0x8(%rbp),%xmm0
movsd  -0x18(%rbp),%xmm2
subsd  -0x10(%rbp),%xmm2
movsd  -0x10(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x38(%rbp)
jmp    1377 <rgb_to_value+0x277>
cmpl   $0x2,-0x1c(%rbp)
jne    11e6 <rgb_to_value+0xe6>
mov    -0x28(%rbp),%rax
movsd  (%rax),%xmm0
movsd  %xmm0,-0x10(%rbp)
mov    -0x28(%rbp),%rax
movsd  0x8(%rax),%xmm0
movsd  %xmm0,-0x18(%rbp)
movsd  -0x18(%rbp),%xmm0
subsd  -0x10(%rbp),%xmm0
movaps 0xe66(%rip),%xmm1
pand   %xmm1,%xmm0
movsd  0xe4a(%rip),%xmm1
ucomisd %xmm1,%xmm0
jbe    11e1 <rgb_to_value+0xe1>
movsd  -0x8(%rbp),%xmm0
movsd  -0x18(%rbp),%xmm2
subsd  -0x10(%rbp),%xmm2
movsd  -0x10(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x38(%rbp)
jmp    1372 <rgb_to_value+0x272>
cmpl   $0x3,-0x1c(%rbp)
je     11fa <rgb_to_value+0xfa>
cmpl   $0x4,-0x1c(%rbp)
jne    136d <rgb_to_value+0x26d>
movsd  -0x8(%rbp),%xmm1
mov    -0x28(%rbp),%rax
movsd  0x8(%rax),%xmm0
ucomisd %xmm1,%xmm0
jb     1221 <rgb_to_value+0x121>
movsd  -0x10(%rbp),%xmm0
movsd  %xmm0,-0x38(%rbp)
jmp    1368 <rgb_to_value+0x268>
movsd  -0x8(%rbp),%xmm0
mov    -0x28(%rbp),%rax
mov    -0x2c(%rbp),%ecx
shl    $0x1,%ecx
add    $0x1,%ecx
movslq %ecx,%rcx
ucomisd (%rax,%rcx,8),%xmm0
jb     1250 <rgb_to_value+0x150>
movsd  -0x18(%rbp),%xmm0
movsd  %xmm0,-0x38(%rbp)
jmp    1363 <rgb_to_value+0x263>
movl   $0x1,-0x3c(%rbp)
mov    -0x3c(%rbp),%eax
mov    -0x2c(%rbp),%ecx
add    $0x1,%ecx
cmp    %ecx,%eax
jge    135e <rgb_to_value+0x25e>
movsd  -0x8(%rbp),%xmm1
mov    -0x28(%rbp),%rax
mov    -0x3c(%rbp),%ecx
shl    $0x1,%ecx
add    $0x1,%ecx
movslq %ecx,%rcx
movsd  (%rax,%rcx,8),%xmm0
ucomisd %xmm1,%xmm0
jb     134b <rgb_to_value+0x24b>
movsd  -0x8(%rbp),%xmm0
mov    -0x28(%rbp),%rax
mov    -0x3c(%rbp),%ecx
sub    $0x1,%ecx
shl    $0x1,%ecx
add    $0x1,%ecx
movslq %ecx,%rcx
ucomisd (%rax,%rcx,8),%xmm0
jbe    134b <rgb_to_value+0x24b>
movsd  -0x8(%rbp),%xmm0
mov    -0x28(%rbp),%rax
mov    -0x3c(%rbp),%ecx
sub    $0x1,%ecx
shl    $0x1,%ecx
add    $0x1,%ecx
movslq %ecx,%rcx
subsd  (%rax,%rcx,8),%xmm0
mov    -0x28(%rbp),%rax
mov    -0x3c(%rbp),%ecx
shl    $0x1,%ecx
add    $0x1,%ecx
movslq %ecx,%rcx
movsd  (%rax,%rcx,8),%xmm1
mov    -0x28(%rbp),%rax
mov    -0x3c(%rbp),%ecx
sub    $0x1,%ecx
shl    $0x1,%ecx
add    $0x1,%ecx
movslq %ecx,%rcx
subsd  (%rax,%rcx,8),%xmm1
divsd  %xmm1,%xmm0
mov    -0x28(%rbp),%rax
mov    -0x3c(%rbp),%ecx
shl    $0x1,%ecx
movslq %ecx,%rcx
movsd  (%rax,%rcx,8),%xmm2
mov    -0x28(%rbp),%rax
mov    -0x3c(%rbp),%ecx
sub    $0x1,%ecx
shl    $0x1,%ecx
movslq %ecx,%rcx
subsd  (%rax,%rcx,8),%xmm2
mov    -0x28(%rbp),%rax
mov    -0x3c(%rbp),%ecx
sub    $0x1,%ecx
shl    $0x1,%ecx
movslq %ecx,%rcx
movsd  (%rax,%rcx,8),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x38(%rbp)
jmp    135e <rgb_to_value+0x25e>
jmp    1350 <rgb_to_value+0x250>
mov    -0x3c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x3c(%rbp)
jmp    1257 <rgb_to_value+0x157>
jmp    1363 <rgb_to_value+0x263>
jmp    1368 <rgb_to_value+0x268>
jmp    136d <rgb_to_value+0x26d>
jmp    1372 <rgb_to_value+0x272>
jmp    1377 <rgb_to_value+0x277>
movsd  -0x38(%rbp),%xmm0
pop    %rbp
ret

x86 assembly (clang, -O2):
<rgb_to_value>:
cmp    $0x2,%edi
je     1131 <rgb_to_value+0x31>
cmp    $0x1,%edi
jne    1161 <rgb_to_value+0x61>
subsd  %xmm1,%xmm2
movapd 0xeea(%rip),%xmm3
andpd  %xmm2,%xmm3
ucomisd 0xeee(%rip),%xmm3
jbe    11fa <rgb_to_value+0xfa>
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
ret
movsd  (%rsi),%xmm2
movsd  0x8(%rsi),%xmm3
subsd  %xmm2,%xmm3
movapd 0xeba(%rip),%xmm1
andpd  %xmm3,%xmm1
ucomisd 0xebe(%rip),%xmm1
jbe    11fa <rgb_to_value+0xfa>
mulsd  %xmm3,%xmm0
addsd  %xmm2,%xmm0
ret
add    $0xfffffffd,%edi
cmp    $0x1,%edi
ja     11fa <rgb_to_value+0xfa>
movsd  0x8(%rsi),%xmm3
ucomisd %xmm0,%xmm3
jae    11fa <rgb_to_value+0xfa>
lea    (%rdx,%rdx,1),%eax
add    $0x1,%eax
cltq
ucomisd (%rsi,%rax,8),%xmm0
movapd %xmm2,%xmm1
jae    11fa <rgb_to_value+0xfa>
test   %edx,%edx
jle    11ff <rgb_to_value+0xff>
mov    %edx,%edx
shl    $0x4,%rdx
add    $0x10,%rdx
mov    $0x10,%ecx
xor    %eax,%eax
movabs $0x200000000,%rdi
jmp    11bc <rgb_to_value+0xbc>
add    %rdi,%rax
add    $0x10,%rcx
cmp    %rcx,%rdx
je     11fa <rgb_to_value+0xfa>
movsd  0x8(%rsi,%rcx,1),%xmm1
ucomisd %xmm0,%xmm1
jb     11b0 <rgb_to_value+0xb0>
movsd  -0x8(%rsi,%rcx,1),%xmm2
ucomisd %xmm2,%xmm0
jbe    11b0 <rgb_to_value+0xb0>
subsd  %xmm2,%xmm0
subsd  %xmm2,%xmm1
divsd  %xmm1,%xmm0
movsd  (%rsi,%rcx,1),%xmm1
sar    $0x1d,%rax
movsd  (%rsi,%rax,1),%xmm2
subsd  %xmm2,%xmm1
mulsd  %xmm0,%xmm1
addsd  %xmm2,%xmm1
movapd %xmm1,%xmm0
ret
movaps %xmm1,%xmm0
ret

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

LLVM IR (-O2):
define double @rgb_to_value(double %0, double %1, double %2, i32 %3, double* nocapture %4, i32 %5) {
switch i32 %3, label %22 [
i32 1, label %7
i32 2, label %13
]
7: ; preds = %6
%8 = fsub double %2, %1
%9 = tail call double @llvm.fabs.f64(double %8)
%10 = fcmp ogt double %9, 1.000000e-08
br i1 %10, label %11, label %70
11: ; preds = %7
%12 = tail call double @llvm.fmuladd.f64(double %0, double %8, double %1)
br label %70
13: ; preds = %6
%14 = load double, double* %4
%15 = getelementptr inbounds double, double* %4, i64 1
%16 = load double, double* %15
%17 = fsub double %16, %14
%18 = tail call double @llvm.fabs.f64(double %17)
%19 = fcmp ogt double %18, 1.000000e-08
br i1 %19, label %20, label %70
20: ; preds = %13
%21 = tail call double @llvm.fmuladd.f64(double %0, double %17, double %14)
br label %70
22: ; preds = %6
%23 = add i32 %3, -3
%24 = icmp ult i32 %23, 2
br i1 %24, label %25, label %70
25: ; preds = %22
%26 = getelementptr inbounds double, double* %4, i64 1
%27 = load double, double* %26
%28 = fcmp ult double %27, %0
br i1 %28, label %29, label %70
29: ; preds = %25
%30 = shl nsw i32 %5, 1
%31 = or i32 %30, 1
%32 = sext i32 %31 to i64
%33 = getelementptr inbounds double, double* %4, i64 %32
%34 = load double, double* %33
%35 = fcmp ugt double %34, %0
br i1 %35, label %36, label %70
36: ; preds = %29
%37 = icmp slt i32 %5, 1
br i1 %37, label %70, label %38
38: ; preds = %36
%39 = add nuw i32 %5, 1
%40 = zext i32 %39 to i64
br label %41
41: ; preds = %38, %67
%42 = phi i64 [ 1, %38 ], [ %68, %67 ]
%43 = shl nuw nsw i64 %42, 1
%44 = or i64 %43, 1
%45 = getelementptr inbounds double, double* %4, i64 %44
%46 = load double, double* %45
%47 = fcmp ult double %46, %0
br i1 %47, label %67, label %48
48: ; preds = %41
%49 = add nsw i64 %43, -1
%50 = getelementptr inbounds double, double* %4, i64 %49
%51 = load double, double* %50
%52 = fcmp olt double %51, %0
br i1 %52, label %53, label %67
53: ; preds = %48
%54 = fsub double %0, %51
%55 = fsub double %46, %51
%56 = fdiv double %54, %55
%57 = and i64 %43, 4294967294
%58 = getelementptr inbounds double, double* %4, i64 %57
%59 = load double, double* %58
%60 = shl i64 %42, 33
%61 = add i64 %60, -8589934592
%62 = ashr exact i64 %61, 32
%63 = getelementptr inbounds double, double* %4, i64 %62
%64 = load double, double* %63
%65 = fsub double %59, %64
%66 = tail call double @llvm.fmuladd.f64(double %56, double %65, double %64)
br label %70
67: ; preds = %41, %48
%68 = add nuw nsw i64 %42, 1
%69 = icmp eq i64 %68, %40
br i1 %69, label %70, label %41
70: ; preds = %67, %36, %29, %25, %20, %13, %53, %22, %7, %11
%71 = phi double [ %12, %11 ], [ undef, %7 ], [ %21, %20 ], [ undef, %13 ], [ %66, %53 ], [ undef, %22 ], [ %1, %25 ], [ %2, %29 ], [ undef, %36 ], [ undef, %67 ]
ret double %71
}