double cent_change(const int channel, double *centroid_image_x,
                   double *centroid_image_y, const long new_x, const long new_y,
                   const long old_x, const long old_y,
                   const unsigned short axis_len, const double fov,
                   const double cent_mult) {
  double old_sumsqr, new_sumsqr;
  old_sumsqr = (centroid_image_x[channel] * centroid_image_x[channel] +
                centroid_image_y[channel] * centroid_image_y[channel]);
  centroid_image_x[channel] += (double)(new_x - old_x);
  centroid_image_y[channel] += (double)(new_y - old_y);
  const double centpos = 0.5 * ((double)axis_len);
  new_sumsqr = centroid_image_x[channel] * centroid_image_x[channel] +
               centroid_image_y[channel] * centroid_image_y[channel];
  return ((new_sumsqr - old_sumsqr) * cent_mult +
          (((double)new_x - centpos) * ((double)new_x - centpos) -
           ((double)old_x - centpos) * ((double)old_x - centpos) +
           ((double)new_y - centpos) * ((double)new_y - centpos) -
           ((double)old_y - centpos) * ((double)old_y - centpos)) *
              fov * fov) *
         4.0 / (double)(axis_len * axis_len);
}


x86 assembly (clang, -O0):
<cent_change>:
push   %rbp
mov    %rsp,%rbp
mov    0x18(%rbp),%ax
mov    0x10(%rbp),%rax
mov    %edi,-0x4(%rbp)
mov    %rsi,-0x10(%rbp)
mov    %rdx,-0x18(%rbp)
mov    %rcx,-0x20(%rbp)
mov    %r8,-0x28(%rbp)
mov    %r9,-0x30(%rbp)
movsd  %xmm0,-0x38(%rbp)
movsd  %xmm1,-0x40(%rbp)
mov    -0x10(%rbp),%rax
movslq -0x4(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm0
mov    -0x18(%rbp),%rax
movsd  (%rax,%rcx,8),%xmm1
mulsd  %xmm1,%xmm1
mulsd  %xmm0,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x48(%rbp)
mov    -0x20(%rbp),%rax
mov    -0x30(%rbp),%rcx
sub    %rcx,%rax
cvtsi2sd %rax,%xmm1
mov    -0x10(%rbp),%rax
movslq -0x4(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,(%rax,%rcx,8)
mov    -0x28(%rbp),%rax
mov    0x10(%rbp),%rcx
sub    %rcx,%rax
cvtsi2sd %rax,%xmm1
mov    -0x18(%rbp),%rax
movslq -0x4(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,(%rax,%rcx,8)
movzwl 0x18(%rbp),%eax
cvtsi2sd %eax,%xmm1
movsd  0xe58(%rip),%xmm0
mulsd  %xmm1,%xmm0
movsd  %xmm0,-0x58(%rbp)
mov    -0x10(%rbp),%rax
movslq -0x4(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm0
mov    -0x10(%rbp),%rax
movslq -0x4(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm2
mov    -0x18(%rbp),%rax
movslq -0x4(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm1
mov    -0x18(%rbp),%rax
movslq -0x4(%rbp),%rcx
mulsd  (%rax,%rcx,8),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x50(%rbp)
movsd  -0x50(%rbp),%xmm0
subsd  -0x48(%rbp),%xmm0
movsd  -0x40(%rbp),%xmm2
cvtsi2sdq -0x20(%rbp),%xmm1
subsd  -0x58(%rbp),%xmm1
cvtsi2sdq -0x20(%rbp),%xmm4
subsd  -0x58(%rbp),%xmm4
cvtsi2sdq -0x30(%rbp),%xmm3
subsd  -0x58(%rbp),%xmm3
cvtsi2sdq -0x30(%rbp),%xmm5
subsd  -0x58(%rbp),%xmm5
mulsd  %xmm5,%xmm3
movq   %xmm3,%rax
movabs $0x8000000000000000,%rcx
xor    %rcx,%rax
movq   %rax,%xmm3
mulsd  %xmm4,%xmm1
addsd  %xmm3,%xmm1
cvtsi2sdq -0x28(%rbp),%xmm3
subsd  -0x58(%rbp),%xmm3
cvtsi2sdq -0x28(%rbp),%xmm4
subsd  -0x58(%rbp),%xmm4
mulsd  %xmm4,%xmm3
addsd  %xmm1,%xmm3
cvtsi2sdq 0x10(%rbp),%xmm1
subsd  -0x58(%rbp),%xmm1
cvtsi2sdq 0x10(%rbp),%xmm4
subsd  -0x58(%rbp),%xmm4
movq   %xmm1,%rax
movabs $0x8000000000000000,%rcx
xor    %rcx,%rax
movq   %rax,%xmm1
mulsd  %xmm4,%xmm1
addsd  %xmm3,%xmm1
mulsd  -0x38(%rbp),%xmm1
mulsd  -0x38(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  0xd3b(%rip),%xmm1
mulsd  %xmm1,%xmm0
movzwl 0x18(%rbp),%eax
movzwl 0x18(%rbp),%ecx
imul   %ecx,%eax
cvtsi2sd %eax,%xmm1
divsd  %xmm1,%xmm0
pop    %rbp
ret

x86 assembly (clang, -O2):
<cent_change>:
movzwl 0x10(%rsp),%eax
mov    0x8(%rsp),%r10
movslq %edi,%rdi
cvtsi2sd %rcx,%xmm2
movsd  (%rsi,%rdi,8),%xmm3
sub    %r9,%rcx
cvtsi2sd %rcx,%xmm4
addsd  %xmm3,%xmm4
movsd  (%rdx,%rdi,8),%xmm5
cvtsi2sd %r8,%xmm6
movsd  %xmm4,(%rsi,%rdi,8)
sub    %r10,%r8
xorps  %xmm4,%xmm4
cvtsi2sd %r8,%xmm4
addsd  (%rdx,%rdi,8),%xmm4
movsd  %xmm4,(%rdx,%rdi,8)
unpcklpd %xmm5,%xmm4
movsd  (%rsi,%rdi,8),%xmm5
unpcklpd %xmm3,%xmm5
xorps  %xmm3,%xmm3
cvtsi2sd %eax,%xmm3
mulsd  0xe9d(%rip),%xmm3
mulpd  %xmm4,%xmm4
mulpd  %xmm5,%xmm5
addpd  %xmm4,%xmm5
movapd %xmm5,%xmm4
unpckhpd %xmm5,%xmm4
subsd  %xmm4,%xmm5
subsd  %xmm3,%xmm2
xorps  %xmm4,%xmm4
cvtsi2sd %r9,%xmm4
subsd  %xmm3,%xmm4
mulsd  %xmm4,%xmm4
mulsd  %xmm2,%xmm2
subsd  %xmm4,%xmm2
subsd  %xmm3,%xmm6
mulsd  %xmm6,%xmm6
addsd  %xmm2,%xmm6
xorps  %xmm2,%xmm2
cvtsi2sd %r10,%xmm2
subsd  %xmm3,%xmm2
mulsd  %xmm2,%xmm2
subsd  %xmm2,%xmm6
mulsd  %xmm0,%xmm6
mulsd  %xmm6,%xmm0
mulsd  %xmm1,%xmm5
addsd  %xmm5,%xmm0
mulsd  0xe39(%rip),%xmm0
imul   %eax,%eax
xorps  %xmm1,%xmm1
cvtsi2sd %eax,%xmm1
divsd  %xmm1,%xmm0
ret

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

LLVM IR (-O2):
define double @cent_change(i32 %0, double* nocapture %1, double* nocapture %2, i64 %3, i64 %4, i64 %5, i64 %6, i16 zeroext %7, double %8, double %9) {
%11 = sext i32 %0 to i64
%12 = getelementptr inbounds double, double* %1, i64 %11
%13 = load double, double* %12
%14 = getelementptr inbounds double, double* %2, i64 %11
%15 = load double, double* %14
%16 = sub nsw i64 %3, %5
%17 = sitofp i64 %16 to double
%18 = fadd double %13, %17
store double %18, double* %12
%19 = sub nsw i64 %4, %6
%20 = sitofp i64 %19 to double
%21 = load double, double* %14
%22 = fadd double %21, %20
store double %22, double* %14
%23 = uitofp i16 %7 to double
%24 = fmul double %23, 5.000000e-01
%25 = load double, double* %12
%26 = insertelement <2 x double> poison, double %22, i64 0
%27 = insertelement <2 x double> %26, double %15, i64 1
%28 = fmul <2 x double> %27, %27
%29 = insertelement <2 x double> poison, double %25, i64 0
%30 = insertelement <2 x double> %29, double %13, i64 1
%31 = call <2 x double> @llvm.fmuladd.v2f64(<2 x double> %30, <2 x double> %30, <2 x double> %28)
%32 = shufflevector <2 x double> %31, <2 x double> poison, <2 x i32> <i32 1, i32 undef>
%33 = fsub <2 x double> %31, %32
%34 = extractelement <2 x double> %33, i64 0
%35 = sitofp i64 %3 to double
%36 = fsub double %35, %24
%37 = sitofp i64 %5 to double
%38 = fsub double %37, %24
%39 = fneg double %38
%40 = fmul double %38, %39
%41 = tail call double @llvm.fmuladd.f64(double %36, double %36, double %40)
%42 = sitofp i64 %4 to double
%43 = fsub double %42, %24
%44 = tail call double @llvm.fmuladd.f64(double %43, double %43, double %41)
%45 = sitofp i64 %6 to double
%46 = fsub double %45, %24
%47 = fneg double %46
%48 = tail call double @llvm.fmuladd.f64(double %47, double %46, double %44)
%49 = fmul double %48, %8
%50 = fmul double %49, %8
%51 = tail call double @llvm.fmuladd.f64(double %34, double %9, double %50)
%52 = fmul double %51, 4.000000e+00
%53 = zext i16 %7 to i32
%54 = mul nuw nsw i32 %53, %53
%55 = sitofp i32 %54 to double
%56 = fdiv double %52, %55
ret double %56
}