#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 */
float pow(float, float);
float Q_GainForAttenuation(int model, float maxdistance, float refdistance,
                           float dist, float attenuation) {
  float gain = 0.0f;
  switch (model) {
  case 0:
    dist = ((dist) < (maxdistance) ? (dist) : (maxdistance));
    gain =
        (1 - attenuation * (dist - refdistance) / (maxdistance - refdistance));
    break;
  case 1:
  default:
    dist = ((dist) > (refdistance) ? (dist) : (refdistance));
    dist = ((dist) < (maxdistance) ? (dist) : (maxdistance));
    gain =
        (1 - attenuation * (dist - refdistance) / (maxdistance - refdistance));
    break;
  case 2:
    gain = refdistance / (refdistance + attenuation * (dist - refdistance));
    break;
  case 3:
    dist = ((dist) > (refdistance) ? (dist) : (refdistance));
    dist = ((dist) < (maxdistance) ? (dist) : (maxdistance));
    gain = refdistance / (refdistance + attenuation * (dist - refdistance));
    break;
  case 4:
    gain = pow((dist / refdistance), (-attenuation));
    break;
  case 5:
    dist = ((dist) > (refdistance) ? (dist) : (refdistance));
    dist = ((dist) < (maxdistance) ? (dist) : (maxdistance));
    gain = pow((dist / refdistance), (-attenuation));
    break;
  case 6:
    dist -= 80;
    if (dist < 0)
      dist = 0;
    gain = 1.0 - dist * attenuation * 0.0001;
    break;
  }
  return gain;
}


x86 assembly (clang, -O0):
<Q_GainForAttenuation>:
push   %rbp
mov    %rsp,%rbp
sub    $0x40,%rsp
mov    %edi,-0x4(%rbp)
movss  %xmm0,-0x8(%rbp)
movss  %xmm1,-0xc(%rbp)
movss  %xmm2,-0x10(%rbp)
movss  %xmm3,-0x14(%rbp)
movl   $0x0,-0x18(%rbp)
mov    -0x4(%rbp),%eax
mov    %rax,-0x20(%rbp)
sub    $0x6,%rax
ja     11cd <Q_GainForAttenuation+0xbd>
mov    -0x20(%rbp),%rax
lea    0xec6(%rip),%rcx
movslq (%rcx,%rax,4),%rax
add    %rcx,%rax
jmp    *%rax
movss  -0x10(%rbp),%xmm1
movss  -0x8(%rbp),%xmm0
ucomiss %xmm1,%xmm0
jbe    117d <Q_GainForAttenuation+0x6d>
movss  -0x10(%rbp),%xmm0
movss  %xmm0,-0x24(%rbp)
jmp    1187 <Q_GainForAttenuation+0x77>
movss  -0x8(%rbp),%xmm0
movss  %xmm0,-0x24(%rbp)
movss  -0x24(%rbp),%xmm0
movss  %xmm0,-0x10(%rbp)
movss  -0x14(%rbp),%xmm1
movss  -0x10(%rbp),%xmm0
subss  -0xc(%rbp),%xmm0
mulss  %xmm0,%xmm1
movss  -0x8(%rbp),%xmm0
subss  -0xc(%rbp),%xmm0
divss  %xmm0,%xmm1
movss  0xe4a(%rip),%xmm0
subss  %xmm1,%xmm0
movss  %xmm0,-0x18(%rbp)
jmp    1461 <Q_GainForAttenuation+0x351>
jmp    11cd <Q_GainForAttenuation+0xbd>
movss  -0x10(%rbp),%xmm0
ucomiss -0xc(%rbp),%xmm0
jbe    11eb <Q_GainForAttenuation+0xdb>
movss  -0x10(%rbp),%xmm0
movss  %xmm0,-0x28(%rbp)
jmp    11f5 <Q_GainForAttenuation+0xe5>
movss  -0xc(%rbp),%xmm0
movss  %xmm0,-0x28(%rbp)
movss  -0x28(%rbp),%xmm0
movss  %xmm0,-0x10(%rbp)
movss  -0x10(%rbp),%xmm1
movss  -0x8(%rbp),%xmm0
ucomiss %xmm1,%xmm0
jbe    1221 <Q_GainForAttenuation+0x111>
movss  -0x10(%rbp),%xmm0
movss  %xmm0,-0x2c(%rbp)
jmp    122b <Q_GainForAttenuation+0x11b>
movss  -0x8(%rbp),%xmm0
movss  %xmm0,-0x2c(%rbp)
movss  -0x2c(%rbp),%xmm0
movss  %xmm0,-0x10(%rbp)
movss  -0x14(%rbp),%xmm1
movss  -0x10(%rbp),%xmm0
subss  -0xc(%rbp),%xmm0
mulss  %xmm0,%xmm1
movss  -0x8(%rbp),%xmm0
subss  -0xc(%rbp),%xmm0
divss  %xmm0,%xmm1
movss  0xda6(%rip),%xmm0
subss  %xmm1,%xmm0
movss  %xmm0,-0x18(%rbp)
jmp    1461 <Q_GainForAttenuation+0x351>
movss  -0xc(%rbp),%xmm0
movss  -0xc(%rbp),%xmm2
movss  -0x14(%rbp),%xmm1
movss  -0x10(%rbp),%xmm3
subss  -0xc(%rbp),%xmm3
mulss  %xmm3,%xmm1
addss  %xmm2,%xmm1
divss  %xmm1,%xmm0
movss  %xmm0,-0x18(%rbp)
jmp    1461 <Q_GainForAttenuation+0x351>
movss  -0x10(%rbp),%xmm0
ucomiss -0xc(%rbp),%xmm0
jbe    12b9 <Q_GainForAttenuation+0x1a9>
movss  -0x10(%rbp),%xmm0
movss  %xmm0,-0x30(%rbp)
jmp    12c3 <Q_GainForAttenuation+0x1b3>
movss  -0xc(%rbp),%xmm0
movss  %xmm0,-0x30(%rbp)
movss  -0x30(%rbp),%xmm0
movss  %xmm0,-0x10(%rbp)
movss  -0x10(%rbp),%xmm1
movss  -0x8(%rbp),%xmm0
ucomiss %xmm1,%xmm0
jbe    12ef <Q_GainForAttenuation+0x1df>
movss  -0x10(%rbp),%xmm0
movss  %xmm0,-0x34(%rbp)
jmp    12f9 <Q_GainForAttenuation+0x1e9>
movss  -0x8(%rbp),%xmm0
movss  %xmm0,-0x34(%rbp)
movss  -0x34(%rbp),%xmm0
movss  %xmm0,-0x10(%rbp)
movss  -0xc(%rbp),%xmm0
movss  -0xc(%rbp),%xmm2
movss  -0x14(%rbp),%xmm1
movss  -0x10(%rbp),%xmm3
subss  -0xc(%rbp),%xmm3
mulss  %xmm3,%xmm1
addss  %xmm2,%xmm1
divss  %xmm1,%xmm0
movss  %xmm0,-0x18(%rbp)
jmp    1461 <Q_GainForAttenuation+0x351>
movss  -0x10(%rbp),%xmm0
divss  -0xc(%rbp),%xmm0
movss  -0x14(%rbp),%xmm1
movd   %xmm1,%eax
xor    $0x80000000,%eax
movd   %eax,%xmm1
call   1030 <pow@plt>
movss  %xmm0,-0x18(%rbp)
jmp    1461 <Q_GainForAttenuation+0x351>
movss  -0x10(%rbp),%xmm0
ucomiss -0xc(%rbp),%xmm0
jbe    137b <Q_GainForAttenuation+0x26b>
movss  -0x10(%rbp),%xmm0
movss  %xmm0,-0x38(%rbp)
jmp    1385 <Q_GainForAttenuation+0x275>
movss  -0xc(%rbp),%xmm0
movss  %xmm0,-0x38(%rbp)
movss  -0x38(%rbp),%xmm0
movss  %xmm0,-0x10(%rbp)
movss  -0x10(%rbp),%xmm1
movss  -0x8(%rbp),%xmm0
ucomiss %xmm1,%xmm0
jbe    13b1 <Q_GainForAttenuation+0x2a1>
movss  -0x10(%rbp),%xmm0
movss  %xmm0,-0x3c(%rbp)
jmp    13bb <Q_GainForAttenuation+0x2ab>
movss  -0x8(%rbp),%xmm0
movss  %xmm0,-0x3c(%rbp)
movss  -0x3c(%rbp),%xmm0
movss  %xmm0,-0x10(%rbp)
movss  -0x10(%rbp),%xmm0
divss  -0xc(%rbp),%xmm0
movss  -0x14(%rbp),%xmm1
movd   %xmm1,%eax
xor    $0x80000000,%eax
movd   %eax,%xmm1
call   1030 <pow@plt>
movss  %xmm0,-0x18(%rbp)
jmp    1461 <Q_GainForAttenuation+0x351>
movss  -0x10(%rbp),%xmm0
movss  0xc03(%rip),%xmm1
subss  %xmm1,%xmm0
movss  %xmm0,-0x10(%rbp)
xorps  %xmm0,%xmm0
ucomiss -0x10(%rbp),%xmm0
jbe    141b <Q_GainForAttenuation+0x30b>
xorps  %xmm0,%xmm0
movss  %xmm0,-0x10(%rbp)
movss  -0x10(%rbp),%xmm0
mulss  -0x14(%rbp),%xmm0
cvtss2sd %xmm0,%xmm0
movq   %xmm0,%rax
movabs $0x8000000000000000,%rcx
xor    %rcx,%rax
movq   %rax,%xmm0
movsd  0xbc0(%rip),%xmm1
mulsd  %xmm1,%xmm0
movsd  0xbbc(%rip),%xmm1
addsd  %xmm1,%xmm0
cvtsd2ss %xmm0,%xmm0
movss  %xmm0,-0x18(%rbp)
movss  -0x18(%rbp),%xmm0
add    $0x40,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<Q_GainForAttenuation>:
cmp    $0x6,%edi
ja     1143 <Q_GainForAttenuation+0x33>
mov    %edi,%eax
lea    0xf0a(%rip),%rcx
movslq (%rcx,%rax,4),%rax
add    %rcx,%rax
jmp    *%rax
maxss  %xmm1,%xmm2
minss  %xmm0,%xmm2
subss  %xmm1,%xmm2
mulss  %xmm2,%xmm3
addss  %xmm1,%xmm3
divss  %xmm3,%xmm1
movaps %xmm1,%xmm0
ret
maxss  %xmm1,%xmm2
minss  %xmm0,%xmm2
subss  %xmm1,%xmm2
mulss  %xmm3,%xmm2
subss  %xmm1,%xmm0
divss  %xmm0,%xmm2
movss  0xeb1(%rip),%xmm1
subss  %xmm2,%xmm1
movaps %xmm1,%xmm0
ret
maxss  %xmm1,%xmm2
minss  %xmm0,%xmm2
divss  %xmm1,%xmm2
xorps  0xe82(%rip),%xmm3
movaps %xmm2,%xmm0
movaps %xmm3,%xmm1
jmp    1030 <pow@plt>
addss  0xe7f(%rip),%xmm2
xorps  %xmm0,%xmm0
maxss  %xmm2,%xmm0
mulss  %xmm3,%xmm0
cvtss2sd %xmm0,%xmm0
mulsd  0xe70(%rip),%xmm0
addsd  0xe70(%rip),%xmm0
cvtsd2ss %xmm0,%xmm0
ret

LLVM IR (-O0):
define float @Q_GainForAttenuation(i32 %0, float %1, float %2, float %3, float %4) {
%6 = alloca i32
%7 = alloca float
%8 = alloca float
%9 = alloca float
%10 = alloca float
%11 = alloca float
store i32 %0, i32* %6
store float %1, float* %7
store float %2, float* %8
store float %3, float* %9
store float %4, float* %10
store float 0.000000e+00, float* %11
%12 = load i32, i32* %6
switch i32 %12, label %34 [
i32 0, label %13
i32 1, label %33
i32 2, label %63
i32 3, label %72
i32 4, label %99
i32 5, label %106
i32 6, label %131
]
13: ; preds = %5
%14 = load float, float* %9
%15 = load float, float* %7
%16 = fcmp olt float %14, %15
br i1 %16, label %17, label %19
17: ; preds = %13
%18 = load float, float* %9
br label %21
19: ; preds = %13
%20 = load float, float* %7
br label %21
21: ; preds = %19, %17
%22 = phi float [ %18, %17 ], [ %20, %19 ]
store float %22, float* %9
%23 = load float, float* %10
%24 = load float, float* %9
%25 = load float, float* %8
%26 = fsub float %24, %25
%27 = fmul float %23, %26
%28 = load float, float* %7
%29 = load float, float* %8
%30 = fsub float %28, %29
%31 = fdiv float %27, %30
%32 = fsub float 1.000000e+00, %31
store float %32, float* %11
br label %145
33: ; preds = %5
br label %34
34: ; preds = %5, %33
%35 = load float, float* %9
%36 = load float, float* %8
%37 = fcmp ogt float %35, %36
br i1 %37, label %38, label %40
38: ; preds = %34
%39 = load float, float* %9
br label %42
40: ; preds = %34
%41 = load float, float* %8
br label %42
42: ; preds = %40, %38
%43 = phi float [ %39, %38 ], [ %41, %40 ]
store float %43, float* %9
%44 = load float, float* %9
%45 = load float, float* %7
%46 = fcmp olt float %44, %45
br i1 %46, label %47, label %49
47: ; preds = %42
%48 = load float, float* %9
br label %51
49: ; preds = %42
%50 = load float, float* %7
br label %51
51: ; preds = %49, %47
%52 = phi float [ %48, %47 ], [ %50, %49 ]
store float %52, float* %9
%53 = load float, float* %10
%54 = load float, float* %9
%55 = load float, float* %8
%56 = fsub float %54, %55
%57 = fmul float %53, %56
%58 = load float, float* %7
%59 = load float, float* %8
%60 = fsub float %58, %59
%61 = fdiv float %57, %60
%62 = fsub float 1.000000e+00, %61
store float %62, float* %11
br label %145
63: ; preds = %5
%64 = load float, float* %8
%65 = load float, float* %8
%66 = load float, float* %10
%67 = load float, float* %9
%68 = load float, float* %8
%69 = fsub float %67, %68
%70 = call float @llvm.fmuladd.f32(float %66, float %69, float %65)
%71 = fdiv float %64, %70
store float %71, float* %11
br label %145
72: ; preds = %5
%73 = load float, float* %9
%74 = load float, float* %8
%75 = fcmp ogt float %73, %74
br i1 %75, label %76, label %78
76: ; preds = %72
%77 = load float, float* %9
br label %80
78: ; preds = %72
%79 = load float, float* %8
br label %80
80: ; preds = %78, %76
%81 = phi float [ %77, %76 ], [ %79, %78 ]
store float %81, float* %9
%82 = load float, float* %9
%83 = load float, float* %7
%84 = fcmp olt float %82, %83
br i1 %84, label %85, label %87
85: ; preds = %80
%86 = load float, float* %9
br label %89
87: ; preds = %80
%88 = load float, float* %7
br label %89
89: ; preds = %87, %85
%90 = phi float [ %86, %85 ], [ %88, %87 ]
store float %90, float* %9
%91 = load float, float* %8
%92 = load float, float* %8
%93 = load float, float* %10
%94 = load float, float* %9
%95 = load float, float* %8
%96 = fsub float %94, %95
%97 = call float @llvm.fmuladd.f32(float %93, float %96, float %92)
%98 = fdiv float %91, %97
store float %98, float* %11
br label %145
99: ; preds = %5
%100 = load float, float* %9
%101 = load float, float* %8
%102 = fdiv float %100, %101
%103 = load float, float* %10
%104 = fneg float %103
%105 = call float @pow(float %102, float %104)
store float %105, float* %11
br label %145
106: ; preds = %5
%107 = load float, float* %9
%108 = load float, float* %8
%109 = fcmp ogt float %107, %108
br i1 %109, label %110, label %112
110: ; preds = %106
%111 = load float, float* %9
br label %114
112: ; preds = %106
%113 = load float, float* %8
br label %114
114: ; preds = %112, %110
%115 = phi float [ %111, %110 ], [ %113, %112 ]
store float %115, float* %9
%116 = load float, float* %9
%117 = load float, float* %7
%118 = fcmp olt float %116, %117
br i1 %118, label %119, label %121
119: ; preds = %114
%120 = load float, float* %9
br label %123
121: ; preds = %114
%122 = load float, float* %7
br label %123
123: ; preds = %121, %119
%124 = phi float [ %120, %119 ], [ %122, %121 ]
store float %124, float* %9
%125 = load float, float* %9
%126 = load float, float* %8
%127 = fdiv float %125, %126
%128 = load float, float* %10
%129 = fneg float %128
%130 = call float @pow(float %127, float %129)
store float %130, float* %11
br label %145
131: ; preds = %5
%132 = load float, float* %9
%133 = fsub float %132, 8.000000e+01
store float %133, float* %9
%134 = load float, float* %9
%135 = fcmp olt float %134, 0.000000e+00
br i1 %135, label %136, label %137
136: ; preds = %131
store float 0.000000e+00, float* %9
br label %137
137: ; preds = %136, %131
%138 = load float, float* %9
%139 = load float, float* %10
%140 = fmul float %138, %139
%141 = fpext float %140 to double
%142 = fneg double %141
%143 = call double @llvm.fmuladd.f64(double %142, double 1.000000e-04, double 1.000000e+00)
%144 = fptrunc double %143 to float
store float %144, float* %11
br label %145
145: ; preds = %137, %123, %99, %89, %63, %51, %21
%146 = load float, float* %11
ret float %146
}

LLVM IR (-O2):
define float @Q_GainForAttenuation(i32 %0, float %1, float %2, float %3, float %4) {
switch i32 %0, label %14 [
i32 0, label %6
i32 6, label %48
i32 2, label %24
i32 3, label %28
i32 4, label %36
i32 5, label %40
]
6: ; preds = %5
%7 = fcmp olt float %3, %1
%8 = select i1 %7, float %3, float %1
%9 = fsub float %8, %2
%10 = fmul float %9, %4
%11 = fsub float %1, %2
%12 = fdiv float %10, %11
%13 = fsub float 1.000000e+00, %12
br label %57
14: ; preds = %5
%15 = fcmp ogt float %3, %2
%16 = select i1 %15, float %3, float %2
%17 = fcmp olt float %16, %1
%18 = select i1 %17, float %16, float %1
%19 = fsub float %18, %2
%20 = fmul float %19, %4
%21 = fsub float %1, %2
%22 = fdiv float %20, %21
%23 = fsub float 1.000000e+00, %22
br label %57
24: ; preds = %5
%25 = fsub float %3, %2
%26 = tail call float @llvm.fmuladd.f32(float %4, float %25, float %2)
%27 = fdiv float %2, %26
br label %57
28: ; preds = %5
%29 = fcmp ogt float %3, %2
%30 = select i1 %29, float %3, float %2
%31 = fcmp olt float %30, %1
%32 = select i1 %31, float %30, float %1
%33 = fsub float %32, %2
%34 = tail call float @llvm.fmuladd.f32(float %4, float %33, float %2)
%35 = fdiv float %2, %34
br label %57
36: ; preds = %5
%37 = fdiv float %3, %2
%38 = fneg float %4
%39 = tail call float @pow(float %37, float %38)
br label %57
40: ; preds = %5
%41 = fcmp ogt float %3, %2
%42 = select i1 %41, float %3, float %2
%43 = fcmp olt float %42, %1
%44 = select i1 %43, float %42, float %1
%45 = fdiv float %44, %2
%46 = fneg float %4
%47 = tail call float @pow(float %45, float %46)
br label %57
48: ; preds = %5
%49 = fadd float %3, -8.000000e+01
%50 = fcmp olt float %49, 0.000000e+00
%51 = select i1 %50, float 0.000000e+00, float %49
%52 = fmul float %51, %4
%53 = fpext float %52 to double
%54 = fneg double %53
%55 = tail call double @llvm.fmuladd.f64(double %54, double 1.000000e-04, double 1.000000e+00)
%56 = fptrunc double %55 to float
br label %57
57: ; preds = %48, %40, %36, %28, %24, %14, %6
%58 = phi float [ %23, %14 ], [ %47, %40 ], [ %39, %36 ], [ %35, %28 ], [ %27, %24 ], [ %56, %48 ], [ %13, %6 ]
ret float %58
}