// File: /workspace/github_c_makefile_star2_O1/ugobas[P]tnm/nma.c
// Function: Bivariate_fit
int Bivariate_fit(int n, float *z, float *x, float *y, int *w,
		  float *a, float *b, float *c, float *r, float *chi)
{
  // fit: z_i = a*x_i + b*y_i + c
  // Returns a, b, c, correlation coefficient and normalized sum of residuals

  int i, norm=0;
  float xy_ave=0, xz_ave=0, yz_ave=0;
  float x2_ave=0, y2_ave=0, z2_ave=0;
  float x_ave=0, y_ave=0, z_ave=0, chi1;

  if(n<3){
    printf("Too few points (%d), the fit can not be performed!\n\n", n);
    return(0);
  }

  for(i=0; i<n; i++){
    if(w[i]){
      x_ave+=x[i]; y_ave+=y[i]; z_ave+=z[i]; norm++;
      x2_ave+=x[i]*x[i]; y2_ave+=y[i]*y[i]; z2_ave+=z[i]*z[i];
      xy_ave+=x[i]*y[i]; xz_ave+=x[i]*z[i]; yz_ave+=y[i]*z[i];
    }
  }

  xy_ave=(float)norm*xy_ave-(x_ave*y_ave);
  xz_ave=(float)norm*xz_ave-(x_ave*z_ave);
  yz_ave=(float)norm*yz_ave-(y_ave*z_ave);
  x2_ave=(float)norm*x2_ave-(x_ave*x_ave);
  y2_ave=(float)norm*y2_ave-(y_ave*y_ave);
  z2_ave=(float)norm*z2_ave-(z_ave*z_ave);

  *a=(y2_ave*xz_ave-xy_ave*yz_ave)/(x2_ave*y2_ave-xy_ave*xy_ave);
  *b=(x2_ave*yz_ave-xy_ave*xz_ave)/(x2_ave*y2_ave-xy_ave*xy_ave);
  *c=z_ave-(*a)*x_ave-(*b)*y_ave; *c/=(float)norm;
  *r=((*a)*xz_ave+(*b)*yz_ave)/
    sqrt(z2_ave*((*a)*(*a)*x2_ave+(*b)*(*b)*y2_ave+ 2*(*a)*(*b)*xy_ave));
  (*chi)=0;
  for(i=0; i<n; i++){
    chi1= z[i]-(*a)*x[i]-(*b)*y[i]-(*c);
    (*chi) += chi1*chi1;
  }
  (*chi)/=z2_ave;
  return(norm);
}

// Assembly:
pushq %rbp
pushq %r15
pushq %r14
pushq %r13
pushq %r12
pushq %rbx
subq $0x18, %rsp
movq %rsi, %r12
movl %edi, %esi
cmpl $0x3, %edi
jge 0x27608
leaq 0x318a3(%rip), %rdi     # 0x58e9d
xorl %ebp, %ebp
xorl %eax, %eax
callq 0x20f0
jmp 0x2789d
movq %r9, %rbx
movq %rcx, %r14
movq %rdx, %r15
movq 0x68(%rsp), %rcx
movq 0x60(%rsp), %r9
movq 0x58(%rsp), %rdx
movq 0x50(%rsp), %rdi
movl %esi, %r13d
xorl %eax, %eax
xorps %xmm3, %xmm3
xorps %xmm6, %xmm6
xorps %xmm7, %xmm7
xorps %xmm12, %xmm12
xorps %xmm0, %xmm0
xorps %xmm1, %xmm1
xorps %xmm4, %xmm4
xorps %xmm5, %xmm5
xorps %xmm2, %xmm2
xorl %ebp, %ebp
cmpl $0x0, (%r8,%rax,4)
je 0x276ba
movss (%r15,%rax,4), %xmm8
addss %xmm8, %xmm7
movss (%r14,%rax,4), %xmm9
addss %xmm9, %xmm6
movss (%r12,%rax,4), %xmm10
addss %xmm10, %xmm3
incl %ebp
movaps %xmm8, %xmm11
mulss %xmm8, %xmm11
addss %xmm11, %xmm1
movaps %xmm9, %xmm11
mulss %xmm9, %xmm11
addss %xmm11, %xmm0
movaps %xmm8, %xmm11
mulss %xmm9, %xmm11
mulss %xmm10, %xmm8
mulss %xmm10, %xmm9
mulss %xmm10, %xmm10
addss %xmm10, %xmm12
addss %xmm11, %xmm2
addss %xmm8, %xmm5
addss %xmm9, %xmm4
incq %rax
cmpq %rax, %r13
jne 0x27648
xorps %xmm8, %xmm8
cvtsi2ss %ebp, %xmm8
movaps %xmm6, %xmm9
mulss %xmm7, %xmm9
mulss %xmm8, %xmm2
subss %xmm9, %xmm2
movaps %xmm3, %xmm9
mulss %xmm7, %xmm9
mulss %xmm8, %xmm5
subss %xmm9, %xmm5
movaps %xmm3, %xmm9
mulss %xmm6, %xmm9
mulss %xmm8, %xmm4
subss %xmm9, %xmm4
movaps %xmm7, %xmm9
mulss %xmm7, %xmm9
mulss %xmm8, %xmm1
subss %xmm9, %xmm1
movaps %xmm6, %xmm9
mulss %xmm6, %xmm9
mulss %xmm8, %xmm0
subss %xmm9, %xmm0
movaps %xmm4, %xmm9
mulss %xmm2, %xmm9
movaps %xmm0, %xmm10
mulss %xmm5, %xmm10
subss %xmm9, %xmm10
movaps %xmm2, %xmm9
mulss %xmm2, %xmm9
movaps %xmm1, %xmm11
mulss %xmm0, %xmm11
subss %xmm9, %xmm11
divss %xmm11, %xmm10
movss %xmm10, (%rbx)
movaps %xmm5, %xmm9
mulss %xmm2, %xmm9
movaps %xmm1, %xmm10
mulss %xmm4, %xmm10
subss %xmm9, %xmm10
movaps %xmm3, %xmm9
mulss %xmm3, %xmm9
mulss %xmm8, %xmm12
divss %xmm11, %xmm10
movss %xmm10, (%rdi)
mulss (%rbx), %xmm7
subss %xmm9, %xmm12
subss %xmm7, %xmm3
mulss %xmm6, %xmm10
subss %xmm10, %xmm3
divss %xmm8, %xmm3
movss %xmm3, (%rdx)
movss (%rbx), %xmm3
movss (%rdi), %xmm6
mulss %xmm6, %xmm4
mulss %xmm3, %xmm5
addss %xmm4, %xmm5
cvtss2sd %xmm5, %xmm5
movaps %xmm3, %xmm4
mulss %xmm3, %xmm4
addss %xmm3, %xmm3
mulss %xmm6, %xmm3
mulss %xmm6, %xmm6
mulss %xmm0, %xmm6
mulss %xmm1, %xmm4
addss %xmm6, %xmm4
mulss %xmm2, %xmm3
addss %xmm4, %xmm3
mulss %xmm12, %xmm3
xorps %xmm0, %xmm0
cvtss2sd %xmm3, %xmm0
xorps %xmm1, %xmm1
ucomisd %xmm1, %xmm0
jb 0x2780b
sqrtsd %xmm0, %xmm0
jmp 0x2783e
movss %xmm12, 0xc(%rsp)
movsd %xmm5, 0x10(%rsp)
callq 0x2290
movsd 0x10(%rsp), %xmm5
movq 0x60(%rsp), %r9
movss 0xc(%rsp), %xmm12
movq 0x50(%rsp), %rdi
movq 0x58(%rsp), %rdx
movq 0x68(%rsp), %rcx
divsd %xmm0, %xmm5
xorps %xmm0, %xmm0
cvtsd2ss %xmm5, %xmm0
movss %xmm0, (%r9)
movl $0x0, (%rcx)
xorl %eax, %eax
movss (%rbx), %xmm0
mulss (%r15,%rax,4), %xmm0
movss (%r12,%rax,4), %xmm1
movss (%rdi), %xmm2
mulss (%r14,%rax,4), %xmm2
subss %xmm0, %xmm1
subss %xmm2, %xmm1
subss (%rdx), %xmm1
mulss %xmm1, %xmm1
addss (%rcx), %xmm1
movss %xmm1, (%rcx)
incq %rax
cmpq %rax, %r13
jne 0x27856
movss (%rcx), %xmm0
divss %xmm12, %xmm0
movss %xmm0, (%rcx)
movl %ebp, %eax
addq $0x18, %rsp
popq %rbx
popq %r12
popq %r13
popq %r14
popq %r15
popq %rbp
retq