// File: /workspace/github_c_makefile_star2_O3/ugobas[P]tnm/anharmonic_tnm.c
// Function: Interpolation
void Interpolation(struct interaction *Int,
		   struct interaction *Int2,
		   float r1, float r2)
{
  // Interpolate between r1 and r2 so that V=0 at r2,
  // V+=V-, V1+=V1-, V2+=V2- at r1
  float Dr=r1-r2, Dr2=Dr*Dr, Dr3=Dr2*Dr;
  float V0, V1, V2;  // Constraints at r1
  struct interaction *I1, *I2;
  if(Int2){
    if(Int2->r0<Int->r0){I1=Int2; I2=Int;}
    else{I1=Int; I2=Int2;}
  }else{
    I1=Int; I2=NULL;
  }
  V0=Compute_V(I1, r1);
  V1=Compute_V1(I1, r1);
  V2=Compute_V2(I1, r1, 1);
  V1*=Dr; V2*=Dr2;

  if(Int2==NULL){
    // Interpolate the final part
    Int->r3=r1;
    Int->b3=(10*V0-4*V1+0.5*V2)/Dr3;
    Int->b4=(-15*V0+7*V1-V2)/(Dr3*Dr);
    Int->b5=(6*V0-3*V1+0.5*V2)/(Dr3*Dr2);
  }else{ // Interpolate the median part
    Int->r1=r1; Int->r2=r2;
    if(Int2->E_min<Int->E_min)
      Int->E_min=Int2->E_min;
    // Constraints at r2
    float V0_2=Compute_V(I2, r2);
    float V1_2=Compute_V1(I2, r2);
    float V2_2=Compute_V2(I2, r2, 1);
    Int->a0=V0_2;
    Int->a1=V1_2;
    Int->a2=V2_2*0.5;
    V1_2*=Dr; V2_2*=Dr2; 
    V0-=(V0_2+V1_2+0.5*V2_2);
    V1-=(V1_2+V2_2);
    V2-=V2_2;
    Int->a3=(10*V0-4*V1+0.5*V2)/Dr3;
    Int->a4=(-15*V0+7*V1-V2)/(Dr3*Dr);
    Int->a5=(6*V0-3*V1+0.5*V2)/(Dr3*Dr2);

    if(Int2->r0<Int->r0){
      // The KB potential has minimum before the SB potential
      double A0=Int->A0, A1=Int->A1, A2=Int->A2, A4=Int->A4;
      Int->A0=Int2->A0; Int->A1=Int2->A1;
      Int->A2=Int2->A2; Int->A4=Int2->A4;
      Int->B0=A0; Int->B1=A1;
      Int->B2=A2; Int->B4=A4;
    }else{
      Int->B0=Int2->A0; Int->B1=Int2->A1;
      Int->B2=Int2->A2; Int->B4=Int2->A4;
    }
  }
}

// Assembly:
pushq %r15
pushq %r14
pushq %r12
pushq %rbx
subq $0x48, %rsp
movq %rsi, %r14
movq %rdi, %rbx
movaps %xmm0, %xmm2
movss %xmm1, 0x4(%rsp)
subss %xmm1, %xmm2
movaps %xmm2, %xmm1
mulss %xmm2, %xmm1
testq %rsi, %rsi
je 0x1e466
movsd 0x20(%rbx), %xmm3
ucomisd 0x20(%r14), %xmm3
movq %r14, %r15
cmovaq %rbx, %r15
movq %rbx, %r12
cmovaq %r14, %r12
jmp 0x1e46c
xorl %r15d, %r15d
movq %rbx, %r12
movaps %xmm2, %xmm3
mulss %xmm1, %xmm3
movss %xmm3, 0x10(%rsp)
movq %r12, %rdi
movss %xmm1, 0x18(%rsp)
movss %xmm2, 0x14(%rsp)
movss %xmm0, 0x20(%rsp)
callq 0x1c59a
movss %xmm0, 0xc(%rsp)
movq %r12, %rdi
movss 0x20(%rsp), %xmm0
callq 0x1ce7c
movss %xmm0, 0x8(%rsp)
movq %r12, %rdi
movss 0x20(%rsp), %xmm0
movl $0x1, %esi
callq 0x1d161
movss 0x14(%rsp), %xmm8
movss 0x8(%rsp), %xmm4
movss 0x18(%rsp), %xmm3
mulss %xmm8, %xmm4
mulss %xmm3, %xmm0
testq %r14, %r14
je 0x1e6e3
movss %xmm0, 0x1c(%rsp)
movss %xmm4, 0x8(%rsp)
movss 0x20(%rsp), %xmm0
movss %xmm0, 0x10(%rbx)
movss 0x4(%rsp), %xmm0
movss %xmm0, 0x14(%rbx)
movsd 0xb8(%r14), %xmm0
movsd 0xb8(%rbx), %xmm1
ucomisd %xmm0, %xmm1
jbe 0x1e526
movsd %xmm0, 0xb8(%rbx)
movq %r15, %rdi
movss 0x4(%rsp), %xmm0
callq 0x1c59a
movaps %xmm0, 0x20(%rsp)
movq %r15, %rdi
movss 0x4(%rsp), %xmm0
callq 0x1ce7c
movaps %xmm0, 0x30(%rsp)
movq %r15, %rdi
movss 0x4(%rsp), %xmm0
movl $0x1, %esi
callq 0x1d161
movaps 0x20(%rsp), %xmm3
movaps %xmm3, %xmm1
movaps 0x30(%rsp), %xmm4
unpcklps %xmm4, %xmm1            # xmm1 = xmm1[0],xmm4[0],xmm1[1],xmm4[1]
cvtps2pd %xmm1, %xmm1
movups %xmm1, 0x70(%rbx)
xorps %xmm1, %xmm1
cvtss2sd %xmm0, %xmm1
movsd 0x32beb(%rip), %xmm2    # 0x51170
mulsd %xmm2, %xmm1
movsd %xmm1, 0x80(%rbx)
movss 0x14(%rsp), %xmm6
movaps %xmm4, %xmm1
mulss %xmm6, %xmm1
movss 0x18(%rsp), %xmm4
mulss %xmm4, %xmm0
addss %xmm1, %xmm3
movaps %xmm1, %xmm5
xorps %xmm1, %xmm1
cvtss2sd %xmm3, %xmm1
xorps %xmm3, %xmm3
cvtss2sd %xmm0, %xmm3
mulsd %xmm2, %xmm3
addsd %xmm1, %xmm3
xorps %xmm1, %xmm1
cvtss2sd 0xc(%rsp), %xmm1
subsd %xmm3, %xmm1
cvtsd2ss %xmm1, %xmm1
addss %xmm0, %xmm5
movss 0x8(%rsp), %xmm7
subss %xmm5, %xmm7
movss 0x1c(%rsp), %xmm8
subss %xmm0, %xmm8
movss 0x38cbc(%rip), %xmm0    # 0x572b4
mulss %xmm7, %xmm0
movss 0x38cb4(%rip), %xmm3    # 0x572b8
mulss %xmm1, %xmm3
addss %xmm0, %xmm3
cvtss2sd %xmm3, %xmm3
xorps %xmm0, %xmm0
cvtss2sd %xmm8, %xmm0
mulsd %xmm2, %xmm0
addsd %xmm0, %xmm3
movss 0x10(%rsp), %xmm5
xorps %xmm2, %xmm2
cvtss2sd %xmm5, %xmm2
divsd %xmm2, %xmm3
movsd %xmm3, 0x88(%rbx)
movss 0x38c7b(%rip), %xmm2    # 0x572bc
mulss %xmm7, %xmm2
movss 0x38c73(%rip), %xmm3    # 0x572c0
mulss %xmm1, %xmm3
addss %xmm2, %xmm3
subss %xmm8, %xmm3
mulss %xmm5, %xmm6
divss %xmm6, %xmm3
xorps %xmm2, %xmm2
cvtss2sd %xmm3, %xmm2
mulss 0x38c53(%rip), %xmm7    # 0x572c4
mulss 0x38c4f(%rip), %xmm1    # 0x572c8
movsd %xmm2, 0x90(%rbx)
addss %xmm7, %xmm1
cvtss2sd %xmm1, %xmm1
addsd %xmm0, %xmm1
mulss %xmm5, %xmm4
xorps %xmm0, %xmm0
cvtss2sd %xmm4, %xmm0
divsd %xmm0, %xmm1
movsd %xmm1, 0x98(%rbx)
movsd 0x20(%rbx), %xmm0
ucomisd 0x20(%r14), %xmm0
jbe 0x1e7ab
movsd 0x40(%rbx), %xmm0
movsd 0x48(%rbx), %xmm1
movups 0x30(%r14), %xmm2
movups 0x30(%rbx), %xmm3
movups %xmm2, 0x30(%rbx)
movups 0x40(%r14), %xmm2
movups %xmm2, 0x40(%rbx)
movups %xmm3, 0x50(%rbx)
movsd %xmm0, 0x60(%rbx)
jmp 0x1e7c5
movss 0x20(%rsp), %xmm1
movss %xmm1, 0x18(%rbx)
movss 0x38bbe(%rip), %xmm2    # 0x572b4
mulss %xmm4, %xmm2
movss 0x38bb6(%rip), %xmm1    # 0x572b8
movss 0xc(%rsp), %xmm7
mulss %xmm7, %xmm1
addss %xmm2, %xmm1
cvtss2sd %xmm1, %xmm1
cvtss2sd %xmm0, %xmm5
mulsd 0x32a50(%rip), %xmm5    # 0x51170
addsd %xmm5, %xmm1
movss 0x10(%rsp), %xmm6
xorps %xmm2, %xmm2
cvtss2sd %xmm6, %xmm2
divsd %xmm2, %xmm1
movsd %xmm1, 0xa0(%rbx)
movss 0x38b77(%rip), %xmm1    # 0x572bc
mulss %xmm4, %xmm1
movss 0x38b6f(%rip), %xmm2    # 0x572c0
mulss %xmm7, %xmm2
addss %xmm1, %xmm2
subss %xmm0, %xmm2
mulss %xmm6, %xmm8
divss %xmm8, %xmm2
xorps %xmm1, %xmm1
cvtss2sd %xmm2, %xmm1
mulss 0x38b4e(%rip), %xmm4    # 0x572c4
mulss 0x38b4a(%rip), %xmm7    # 0x572c8
movsd %xmm1, 0xa8(%rbx)
addss %xmm4, %xmm7
xorps %xmm1, %xmm1
cvtss2sd %xmm7, %xmm1
addsd %xmm5, %xmm1
mulss %xmm6, %xmm3
xorps %xmm0, %xmm0
cvtss2sd %xmm3, %xmm0
divsd %xmm0, %xmm1
movl $0xb0, %eax
jmp 0x1e7ca
movups 0x30(%r14), %xmm0
movups %xmm0, 0x50(%rbx)
movsd 0x40(%r14), %xmm0
movsd %xmm0, 0x60(%rbx)
movsd 0x48(%r14), %xmm1
movl $0x68, %eax
movsd %xmm1, (%rbx,%rax)
addq $0x48, %rsp
popq %rbx
popq %r12
popq %r14
popq %r15
retq