double ezd_scale_value(int i, int t, void *pData, double oSrc, double rSrc,
                       double oDst, double rDst) {
  switch (t) {
  case (0x0200 | 0x0100 | sizeof(char)):
    return oDst + ((double)(((char *)pData)[i]) - oSrc) * rDst / rSrc;
    ;
  case (0x0200 | sizeof(char)):
    return oDst + ((double)(((unsigned char *)pData)[i]) - oSrc) * rDst / rSrc;
    ;
  case (0x0100 | sizeof(short)):
    return oDst + ((double)(((short *)pData)[i]) - oSrc) * rDst / rSrc;
    ;
  case (sizeof(unsigned short)):
    return oDst + ((double)(((unsigned short *)pData)[i]) - oSrc) * rDst / rSrc;
    ;
  case (0x0100 | sizeof(int)):
    return oDst + ((double)(((int *)pData)[i]) - oSrc) * rDst / rSrc;
    ;
  case (sizeof(unsigned int)):
    return oDst + ((double)(((unsigned int *)pData)[i]) - oSrc) * rDst / rSrc;
    ;
  case (0x0100 | sizeof(long long)):
    return oDst + ((double)(((long long *)pData)[i]) - oSrc) * rDst / rSrc;
    ;
  case (sizeof(unsigned long long)):
    return oDst +
           ((double)(((unsigned long long *)pData)[i]) - oSrc) * rDst / rSrc;
    ;
  case (0x0400 | sizeof(float)):
    return oDst + ((double)(((float *)pData)[i]) - oSrc) * rDst / rSrc;
    ;
  case (0x0400 | sizeof(double)):
    return oDst + ((double)(((double *)pData)[i]) - oSrc) * rDst / rSrc;
    ;
  default:
    break;
  }
  return 0;
}


x86 assembly (clang, -O0):
<ezd_scale_value>:
push   %rbp
mov    %rsp,%rbp
mov    %edi,-0xc(%rbp)
mov    %esi,-0x10(%rbp)
mov    %rdx,-0x18(%rbp)
movsd  %xmm0,-0x20(%rbp)
movsd  %xmm1,-0x28(%rbp)
movsd  %xmm2,-0x30(%rbp)
movsd  %xmm3,-0x38(%rbp)
mov    -0x10(%rbp),%eax
mov    %eax,-0x3c(%rbp)
sub    $0x2,%eax
je     1273 <ezd_scale_value+0x173>
jmp    1136 <ezd_scale_value+0x36>
mov    -0x3c(%rbp),%eax
sub    $0x4,%eax
je     12d4 <ezd_scale_value+0x1d4>
jmp    1147 <ezd_scale_value+0x47>
mov    -0x3c(%rbp),%eax
sub    $0x8,%eax
je     1336 <ezd_scale_value+0x236>
jmp    1158 <ezd_scale_value+0x58>
mov    -0x3c(%rbp),%eax
sub    $0x102,%eax
je     1241 <ezd_scale_value+0x141>
jmp    116b <ezd_scale_value+0x6b>
mov    -0x3c(%rbp),%eax
sub    $0x104,%eax
je     12a5 <ezd_scale_value+0x1a5>
jmp    117e <ezd_scale_value+0x7e>
mov    -0x3c(%rbp),%eax
sub    $0x108,%eax
je     1306 <ezd_scale_value+0x206>
jmp    1191 <ezd_scale_value+0x91>
mov    -0x3c(%rbp),%eax
sub    $0x201,%eax
je     120f <ezd_scale_value+0x10f>
jmp    11a4 <ezd_scale_value+0xa4>
mov    -0x3c(%rbp),%eax
sub    $0x301,%eax
je     11dd <ezd_scale_value+0xdd>
jmp    11b7 <ezd_scale_value+0xb7>
mov    -0x3c(%rbp),%eax
sub    $0x404,%eax
je     1387 <ezd_scale_value+0x287>
jmp    11ca <ezd_scale_value+0xca>
mov    -0x3c(%rbp),%eax
sub    $0x408,%eax
je     13ba <ezd_scale_value+0x2ba>
jmp    13e9 <ezd_scale_value+0x2e9>
movsd  -0x30(%rbp),%xmm0
mov    -0x18(%rbp),%rax
movslq -0xc(%rbp),%rcx
movsbl (%rax,%rcx,1),%eax
cvtsi2sd %eax,%xmm1
subsd  -0x20(%rbp),%xmm1
mulsd  -0x38(%rbp),%xmm1
divsd  -0x28(%rbp),%xmm1
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x8(%rbp)
jmp    13f6 <ezd_scale_value+0x2f6>
movsd  -0x30(%rbp),%xmm0
mov    -0x18(%rbp),%rax
movslq -0xc(%rbp),%rcx
movzbl (%rax,%rcx,1),%eax
cvtsi2sd %eax,%xmm1
subsd  -0x20(%rbp),%xmm1
mulsd  -0x38(%rbp),%xmm1
divsd  -0x28(%rbp),%xmm1
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x8(%rbp)
jmp    13f6 <ezd_scale_value+0x2f6>
movsd  -0x30(%rbp),%xmm0
mov    -0x18(%rbp),%rax
movslq -0xc(%rbp),%rcx
movswl (%rax,%rcx,2),%eax
cvtsi2sd %eax,%xmm1
subsd  -0x20(%rbp),%xmm1
mulsd  -0x38(%rbp),%xmm1
divsd  -0x28(%rbp),%xmm1
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x8(%rbp)
jmp    13f6 <ezd_scale_value+0x2f6>
movsd  -0x30(%rbp),%xmm0
mov    -0x18(%rbp),%rax
movslq -0xc(%rbp),%rcx
movzwl (%rax,%rcx,2),%eax
cvtsi2sd %eax,%xmm1
subsd  -0x20(%rbp),%xmm1
mulsd  -0x38(%rbp),%xmm1
divsd  -0x28(%rbp),%xmm1
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x8(%rbp)
jmp    13f6 <ezd_scale_value+0x2f6>
movsd  -0x30(%rbp),%xmm0
mov    -0x18(%rbp),%rax
movslq -0xc(%rbp),%rcx
cvtsi2sdl (%rax,%rcx,4),%xmm1
subsd  -0x20(%rbp),%xmm1
mulsd  -0x38(%rbp),%xmm1
divsd  -0x28(%rbp),%xmm1
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x8(%rbp)
jmp    13f6 <ezd_scale_value+0x2f6>
movsd  -0x30(%rbp),%xmm0
mov    -0x18(%rbp),%rax
movslq -0xc(%rbp),%rcx
mov    (%rax,%rcx,4),%eax
cvtsi2sd %rax,%xmm1
subsd  -0x20(%rbp),%xmm1
mulsd  -0x38(%rbp),%xmm1
divsd  -0x28(%rbp),%xmm1
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x8(%rbp)
jmp    13f6 <ezd_scale_value+0x2f6>
movsd  -0x30(%rbp),%xmm0
mov    -0x18(%rbp),%rax
movslq -0xc(%rbp),%rcx
cvtsi2sdq (%rax,%rcx,8),%xmm1
subsd  -0x20(%rbp),%xmm1
mulsd  -0x38(%rbp),%xmm1
divsd  -0x28(%rbp),%xmm1
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x8(%rbp)
jmp    13f6 <ezd_scale_value+0x2f6>
movsd  -0x30(%rbp),%xmm0
mov    -0x18(%rbp),%rax
movslq -0xc(%rbp),%rcx
movq   (%rax,%rcx,8),%xmm1
movaps 0xcb1(%rip),%xmm2
punpckldq %xmm2,%xmm1
movapd 0xcb5(%rip),%xmm2
subpd  %xmm2,%xmm1
movaps %xmm1,%xmm2
unpckhpd %xmm1,%xmm1
addsd  %xmm2,%xmm1
subsd  -0x20(%rbp),%xmm1
mulsd  -0x38(%rbp),%xmm1
divsd  -0x28(%rbp),%xmm1
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x8(%rbp)
jmp    13f6 <ezd_scale_value+0x2f6>
movsd  -0x30(%rbp),%xmm0
mov    -0x18(%rbp),%rax
movslq -0xc(%rbp),%rcx
movss  (%rax,%rcx,4),%xmm1
cvtss2sd %xmm1,%xmm1
subsd  -0x20(%rbp),%xmm1
mulsd  -0x38(%rbp),%xmm1
divsd  -0x28(%rbp),%xmm1
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x8(%rbp)
jmp    13f6 <ezd_scale_value+0x2f6>
movsd  -0x30(%rbp),%xmm0
mov    -0x18(%rbp),%rax
movslq -0xc(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm1
subsd  -0x20(%rbp),%xmm1
mulsd  -0x38(%rbp),%xmm1
divsd  -0x28(%rbp),%xmm1
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x8(%rbp)
jmp    13f6 <ezd_scale_value+0x2f6>
jmp    13ee <ezd_scale_value+0x2ee>
xorps  %xmm0,%xmm0
movsd  %xmm0,-0x8(%rbp)
movsd  -0x8(%rbp),%xmm0
pop    %rbp
ret

x86 assembly (clang, -O2):
<ezd_scale_value>:
movapd %xmm0,%xmm4
xorpd  %xmm0,%xmm0
cmp    $0x107,%esi
jg     1146 <ezd_scale_value+0x46>
cmp    $0x7,%esi
jle    1185 <ezd_scale_value+0x85>
cmp    $0x8,%esi
je     11ce <ezd_scale_value+0xce>
cmp    $0x102,%esi
je     11f3 <ezd_scale_value+0xf3>
cmp    $0x104,%esi
jne    1247 <ezd_scale_value+0x147>
movslq %edi,%rax
xorps  %xmm0,%xmm0
cvtsi2sdl (%rdx,%rax,4),%xmm0
jmp    1237 <ezd_scale_value+0x137>
cmp    $0x300,%esi
jle    11aa <ezd_scale_value+0xaa>
cmp    $0x408,%esi
je     1203 <ezd_scale_value+0x103>
cmp    $0x404,%esi
je     120d <ezd_scale_value+0x10d>
cmp    $0x301,%esi
jne    1247 <ezd_scale_value+0x147>
movslq %edi,%rax
movsbl (%rdx,%rax,1),%eax
xorps  %xmm0,%xmm0
cvtsi2sd %eax,%xmm0
jmp    1237 <ezd_scale_value+0x137>
cmp    $0x2,%esi
je     121b <ezd_scale_value+0x11b>
cmp    $0x4,%esi
jne    1247 <ezd_scale_value+0x147>
movslq %edi,%rax
mov    (%rdx,%rax,4),%eax
xorps  %xmm0,%xmm0
cvtsi2sd %rax,%xmm0
jmp    1237 <ezd_scale_value+0x137>
cmp    $0x108,%esi
je     122b <ezd_scale_value+0x12b>
cmp    $0x201,%esi
jne    1247 <ezd_scale_value+0x147>
movslq %edi,%rax
movzbl (%rdx,%rax,1),%eax
xorps  %xmm0,%xmm0
cvtsi2sd %eax,%xmm0
jmp    1237 <ezd_scale_value+0x137>
movslq %edi,%rax
movsd  (%rdx,%rax,8),%xmm5
unpcklps 0xe23(%rip),%xmm5
subpd  0xe2b(%rip),%xmm5
movapd %xmm5,%xmm0
unpckhpd %xmm5,%xmm0
addsd  %xmm5,%xmm0
jmp    1237 <ezd_scale_value+0x137>
movslq %edi,%rax
movswl (%rdx,%rax,2),%eax
xorps  %xmm0,%xmm0
cvtsi2sd %eax,%xmm0
jmp    1237 <ezd_scale_value+0x137>
movslq %edi,%rax
movsd  (%rdx,%rax,8),%xmm0
jmp    1237 <ezd_scale_value+0x137>
movslq %edi,%rax
movss  (%rdx,%rax,4),%xmm0
cvtss2sd %xmm0,%xmm0
jmp    1237 <ezd_scale_value+0x137>
movslq %edi,%rax
movzwl (%rdx,%rax,2),%eax
xorps  %xmm0,%xmm0
cvtsi2sd %eax,%xmm0
jmp    1237 <ezd_scale_value+0x137>
movslq %edi,%rax
xorps  %xmm0,%xmm0
cvtsi2sdq (%rdx,%rax,8),%xmm0
subsd  %xmm4,%xmm0
mulsd  %xmm3,%xmm0
divsd  %xmm1,%xmm0
addsd  %xmm2,%xmm0
ret

LLVM IR (-O0):
define double @ezd_scale_value(i32 %0, i32 %1, i8* %2, double %3, double %4, double %5, double %6) {
%8 = alloca double
%9 = alloca i32
%10 = alloca i32
%11 = alloca i8*
%12 = alloca double
%13 = alloca double
%14 = alloca double
%15 = alloca double
store i32 %0, i32* %9
store i32 %1, i32* %10
store i8* %2, i8** %11
store double %3, double* %12
store double %4, double* %13
store double %5, double* %14
store double %6, double* %15
%16 = load i32, i32* %10
switch i32 %16, label %174 [
i32 769, label %17
i32 513, label %32
i32 258, label %47
i32 2, label %63
i32 260, label %79
i32 4, label %95
i32 264, label %111
i32 8, label %127
i32 1028, label %143
i32 1032, label %159
]
17: ; preds = %7
%18 = load double, double* %14
%19 = load i8*, i8** %11
%20 = load i32, i32* %9
%21 = sext i32 %20 to i64
%22 = getelementptr inbounds i8, i8* %19, i64 %21
%23 = load i8, i8* %22
%24 = sitofp i8 %23 to double
%25 = load double, double* %12
%26 = fsub double %24, %25
%27 = load double, double* %15
%28 = fmul double %26, %27
%29 = load double, double* %13
%30 = fdiv double %28, %29
%31 = fadd double %18, %30
store double %31, double* %8
br label %176
32: ; preds = %7
%33 = load double, double* %14
%34 = load i8*, i8** %11
%35 = load i32, i32* %9
%36 = sext i32 %35 to i64
%37 = getelementptr inbounds i8, i8* %34, i64 %36
%38 = load i8, i8* %37
%39 = uitofp i8 %38 to double
%40 = load double, double* %12
%41 = fsub double %39, %40
%42 = load double, double* %15
%43 = fmul double %41, %42
%44 = load double, double* %13
%45 = fdiv double %43, %44
%46 = fadd double %33, %45
store double %46, double* %8
br label %176
47: ; preds = %7
%48 = load double, double* %14
%49 = load i8*, i8** %11
%50 = bitcast i8* %49 to i16*
%51 = load i32, i32* %9
%52 = sext i32 %51 to i64
%53 = getelementptr inbounds i16, i16* %50, i64 %52
%54 = load i16, i16* %53
%55 = sitofp i16 %54 to double
%56 = load double, double* %12
%57 = fsub double %55, %56
%58 = load double, double* %15
%59 = fmul double %57, %58
%60 = load double, double* %13
%61 = fdiv double %59, %60
%62 = fadd double %48, %61
store double %62, double* %8
br label %176
63: ; preds = %7
%64 = load double, double* %14
%65 = load i8*, i8** %11
%66 = bitcast i8* %65 to i16*
%67 = load i32, i32* %9
%68 = sext i32 %67 to i64
%69 = getelementptr inbounds i16, i16* %66, i64 %68
%70 = load i16, i16* %69
%71 = uitofp i16 %70 to double
%72 = load double, double* %12
%73 = fsub double %71, %72
%74 = load double, double* %15
%75 = fmul double %73, %74
%76 = load double, double* %13
%77 = fdiv double %75, %76
%78 = fadd double %64, %77
store double %78, double* %8
br label %176
79: ; preds = %7
%80 = load double, double* %14
%81 = load i8*, i8** %11
%82 = bitcast i8* %81 to i32*
%83 = load i32, i32* %9
%84 = sext i32 %83 to i64
%85 = getelementptr inbounds i32, i32* %82, i64 %84
%86 = load i32, i32* %85
%87 = sitofp i32 %86 to double
%88 = load double, double* %12
%89 = fsub double %87, %88
%90 = load double, double* %15
%91 = fmul double %89, %90
%92 = load double, double* %13
%93 = fdiv double %91, %92
%94 = fadd double %80, %93
store double %94, double* %8
br label %176
95: ; preds = %7
%96 = load double, double* %14
%97 = load i8*, i8** %11
%98 = bitcast i8* %97 to i32*
%99 = load i32, i32* %9
%100 = sext i32 %99 to i64
%101 = getelementptr inbounds i32, i32* %98, i64 %100
%102 = load i32, i32* %101
%103 = uitofp i32 %102 to double
%104 = load double, double* %12
%105 = fsub double %103, %104
%106 = load double, double* %15
%107 = fmul double %105, %106
%108 = load double, double* %13
%109 = fdiv double %107, %108
%110 = fadd double %96, %109
store double %110, double* %8
br label %176
111: ; preds = %7
%112 = load double, double* %14
%113 = load i8*, i8** %11
%114 = bitcast i8* %113 to i64*
%115 = load i32, i32* %9
%116 = sext i32 %115 to i64
%117 = getelementptr inbounds i64, i64* %114, i64 %116
%118 = load i64, i64* %117
%119 = sitofp i64 %118 to double
%120 = load double, double* %12
%121 = fsub double %119, %120
%122 = load double, double* %15
%123 = fmul double %121, %122
%124 = load double, double* %13
%125 = fdiv double %123, %124
%126 = fadd double %112, %125
store double %126, double* %8
br label %176
127: ; preds = %7
%128 = load double, double* %14
%129 = load i8*, i8** %11
%130 = bitcast i8* %129 to i64*
%131 = load i32, i32* %9
%132 = sext i32 %131 to i64
%133 = getelementptr inbounds i64, i64* %130, i64 %132
%134 = load i64, i64* %133
%135 = uitofp i64 %134 to double
%136 = load double, double* %12
%137 = fsub double %135, %136
%138 = load double, double* %15
%139 = fmul double %137, %138
%140 = load double, double* %13
%141 = fdiv double %139, %140
%142 = fadd double %128, %141
store double %142, double* %8
br label %176
143: ; preds = %7
%144 = load double, double* %14
%145 = load i8*, i8** %11
%146 = bitcast i8* %145 to float*
%147 = load i32, i32* %9
%148 = sext i32 %147 to i64
%149 = getelementptr inbounds float, float* %146, i64 %148
%150 = load float, float* %149
%151 = fpext float %150 to double
%152 = load double, double* %12
%153 = fsub double %151, %152
%154 = load double, double* %15
%155 = fmul double %153, %154
%156 = load double, double* %13
%157 = fdiv double %155, %156
%158 = fadd double %144, %157
store double %158, double* %8
br label %176
159: ; preds = %7
%160 = load double, double* %14
%161 = load i8*, i8** %11
%162 = bitcast i8* %161 to double*
%163 = load i32, i32* %9
%164 = sext i32 %163 to i64
%165 = getelementptr inbounds double, double* %162, i64 %164
%166 = load double, double* %165
%167 = load double, double* %12
%168 = fsub double %166, %167
%169 = load double, double* %15
%170 = fmul double %168, %169
%171 = load double, double* %13
%172 = fdiv double %170, %171
%173 = fadd double %160, %172
store double %173, double* %8
br label %176
174: ; preds = %7
br label %175
175: ; preds = %174
store double 0.000000e+00, double* %8
br label %176
176: ; preds = %175, %159, %143, %127, %111, %95, %79, %63, %47, %32, %17
%177 = load double, double* %8
ret double %177
}

LLVM IR (-O2):
define double @ezd_scale_value(i32 %0, i32 %1, i8* nocapture %2, double %3, double %4, double %5, double %6) {
switch i32 %1, label %105 [
i32 769, label %8
i32 513, label %17
i32 258, label %26
i32 2, label %36
i32 260, label %46
i32 4, label %56
i32 264, label %66
i32 8, label %76
i32 1028, label %86
i32 1032, label %96
]
8: ; preds = %7
%9 = sext i32 %0 to i64
%10 = getelementptr inbounds i8, i8* %2, i64 %9
%11 = load i8, i8* %10
%12 = sitofp i8 %11 to double
%13 = fsub double %12, %3
%14 = fmul double %13, %6
%15 = fdiv double %14, %4
%16 = fadd double %15, %5
br label %105
17: ; preds = %7
%18 = sext i32 %0 to i64
%19 = getelementptr inbounds i8, i8* %2, i64 %18
%20 = load i8, i8* %19
%21 = uitofp i8 %20 to double
%22 = fsub double %21, %3
%23 = fmul double %22, %6
%24 = fdiv double %23, %4
%25 = fadd double %24, %5
br label %105
26: ; preds = %7
%27 = bitcast i8* %2 to i16*
%28 = sext i32 %0 to i64
%29 = getelementptr inbounds i16, i16* %27, i64 %28
%30 = load i16, i16* %29
%31 = sitofp i16 %30 to double
%32 = fsub double %31, %3
%33 = fmul double %32, %6
%34 = fdiv double %33, %4
%35 = fadd double %34, %5
br label %105
36: ; preds = %7
%37 = bitcast i8* %2 to i16*
%38 = sext i32 %0 to i64
%39 = getelementptr inbounds i16, i16* %37, i64 %38
%40 = load i16, i16* %39
%41 = uitofp i16 %40 to double
%42 = fsub double %41, %3
%43 = fmul double %42, %6
%44 = fdiv double %43, %4
%45 = fadd double %44, %5
br label %105
46: ; preds = %7
%47 = bitcast i8* %2 to i32*
%48 = sext i32 %0 to i64
%49 = getelementptr inbounds i32, i32* %47, i64 %48
%50 = load i32, i32* %49
%51 = sitofp i32 %50 to double
%52 = fsub double %51, %3
%53 = fmul double %52, %6
%54 = fdiv double %53, %4
%55 = fadd double %54, %5
br label %105
56: ; preds = %7
%57 = bitcast i8* %2 to i32*
%58 = sext i32 %0 to i64
%59 = getelementptr inbounds i32, i32* %57, i64 %58
%60 = load i32, i32* %59
%61 = uitofp i32 %60 to double
%62 = fsub double %61, %3
%63 = fmul double %62, %6
%64 = fdiv double %63, %4
%65 = fadd double %64, %5
br label %105
66: ; preds = %7
%67 = bitcast i8* %2 to i64*
%68 = sext i32 %0 to i64
%69 = getelementptr inbounds i64, i64* %67, i64 %68
%70 = load i64, i64* %69
%71 = sitofp i64 %70 to double
%72 = fsub double %71, %3
%73 = fmul double %72, %6
%74 = fdiv double %73, %4
%75 = fadd double %74, %5
br label %105
76: ; preds = %7
%77 = bitcast i8* %2 to i64*
%78 = sext i32 %0 to i64
%79 = getelementptr inbounds i64, i64* %77, i64 %78
%80 = load i64, i64* %79
%81 = uitofp i64 %80 to double
%82 = fsub double %81, %3
%83 = fmul double %82, %6
%84 = fdiv double %83, %4
%85 = fadd double %84, %5
br label %105
86: ; preds = %7
%87 = bitcast i8* %2 to float*
%88 = sext i32 %0 to i64
%89 = getelementptr inbounds float, float* %87, i64 %88
%90 = load float, float* %89
%91 = fpext float %90 to double
%92 = fsub double %91, %3
%93 = fmul double %92, %6
%94 = fdiv double %93, %4
%95 = fadd double %94, %5
br label %105
96: ; preds = %7
%97 = bitcast i8* %2 to double*
%98 = sext i32 %0 to i64
%99 = getelementptr inbounds double, double* %97, i64 %98
%100 = load double, double* %99
%101 = fsub double %100, %3
%102 = fmul double %101, %6
%103 = fdiv double %102, %4
%104 = fadd double %103, %5
br label %105
105: ; preds = %7, %96, %86, %76, %66, %56, %46, %36, %26, %17, %8
%106 = phi double [ %104, %96 ], [ %95, %86 ], [ %85, %76 ], [ %75, %66 ], [ %65, %56 ], [ %55, %46 ], [ %45, %36 ], [ %35, %26 ], [ %25, %17 ], [ %16, %8 ], [ 0.000000e+00, %7 ]
ret double %106
}