// File: /workspace/github_c_makefile_star2_O2/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 0x1c9dd
movsd 0x20(%rbx), %xmm3
ucomisd 0x20(%r14), %xmm3
movq %r14, %r15
cmovaq %rbx, %r15
movq %rbx, %r12
cmovaq %r14, %r12
jmp 0x1c9e3
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 0x1ac14
movss %xmm0, 0xc(%rsp)
movq %r12, %rdi
movss 0x20(%rsp), %xmm0
callq 0x1b4a6
movss %xmm0, 0x8(%rsp)
pushq $0x1
popq %rsi
movq %r12, %rdi
movss 0x20(%rsp), %xmm0
callq 0x1b776
movss 0x14(%rsp), %xmm8
movss 0x8(%rsp), %xmm4
movss 0x18(%rsp), %xmm3
mulss %xmm8, %xmm4
mulss %xmm3, %xmm0
testq %r14, %r14
je 0x1cc3e
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 0x1ca9b
movsd %xmm0, 0xb8(%rbx)
movq %r15, %rdi
movss 0x4(%rsp), %xmm0
callq 0x1ac14
movaps %xmm0, 0x20(%rsp)
movq %r15, %rdi
movss 0x4(%rsp), %xmm0
callq 0x1b4a6
movaps %xmm0, 0x30(%rsp)
pushq $0x1
popq %rsi
movq %r15, %rdi
movss 0x4(%rsp), %xmm0
callq 0x1b776
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)
cvtss2sd %xmm0, %xmm1
movsd 0x2e57b(%rip), %xmm2    # 0x4b070
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
cvtss2sd %xmm3, %xmm1
cvtss2sd %xmm0, %xmm3
mulsd %xmm2, %xmm3
addsd %xmm1, %xmm3
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 0x346a5(%rip), %xmm0    # 0x51204
mulss %xmm7, %xmm0
movss 0x3469d(%rip), %xmm3    # 0x51208
mulss %xmm1, %xmm3
addss %xmm0, %xmm3
cvtss2sd %xmm3, %xmm3
cvtss2sd %xmm8, %xmm0
mulsd %xmm2, %xmm0
addsd %xmm0, %xmm3
movss 0x10(%rsp), %xmm5
cvtss2sd %xmm5, %xmm2
divsd %xmm2, %xmm3
movsd %xmm3, 0x88(%rbx)
movss 0x3466a(%rip), %xmm2    # 0x5120c
mulss %xmm7, %xmm2
movss 0x34662(%rip), %xmm3    # 0x51210
mulss %xmm1, %xmm3
addss %xmm2, %xmm3
subss %xmm8, %xmm3
mulss %xmm5, %xmm6
divss %xmm6, %xmm3
cvtss2sd %xmm3, %xmm2
mulss 0x34645(%rip), %xmm7    # 0x51214
mulss 0x34641(%rip), %xmm1    # 0x51218
movsd %xmm2, 0x90(%rbx)
addss %xmm7, %xmm1
cvtss2sd %xmm1, %xmm1
addsd %xmm0, %xmm1
mulss %xmm5, %xmm4
cvtss2sd %xmm4, %xmm0
divsd %xmm0, %xmm1
movsd %xmm1, 0x98(%rbx)
movsd 0x20(%rbx), %xmm0
ucomisd 0x20(%r14), %xmm0
jbe 0x1ccfa
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 0x1cd14
movss 0x20(%rsp), %xmm1
movss %xmm1, 0x18(%rbx)
movss 0x345b3(%rip), %xmm2    # 0x51204
mulss %xmm4, %xmm2
movss 0x345ab(%rip), %xmm1    # 0x51208
movss 0xc(%rsp), %xmm7
mulss %xmm7, %xmm1
addss %xmm2, %xmm1
cvtss2sd %xmm1, %xmm1
cvtss2sd %xmm0, %xmm5
mulsd 0x2e3f5(%rip), %xmm5    # 0x4b070
addsd %xmm5, %xmm1
movss 0x10(%rsp), %xmm6
cvtss2sd %xmm6, %xmm2
divsd %xmm2, %xmm1
movsd %xmm1, 0xa0(%rbx)
movss 0x3456f(%rip), %xmm1    # 0x5120c
mulss %xmm4, %xmm1
movss 0x34567(%rip), %xmm2    # 0x51210
mulss %xmm7, %xmm2
addss %xmm1, %xmm2
subss %xmm0, %xmm2
mulss %xmm6, %xmm8
divss %xmm8, %xmm2
cvtss2sd %xmm2, %xmm1
mulss 0x34549(%rip), %xmm4    # 0x51214
mulss 0x34545(%rip), %xmm7    # 0x51218
movsd %xmm1, 0xa8(%rbx)
addss %xmm4, %xmm7
cvtss2sd %xmm7, %xmm1
addsd %xmm5, %xmm1
mulss %xmm6, %xmm3
cvtss2sd %xmm3, %xmm0
divsd %xmm0, %xmm1
movl $0xb0, %eax
jmp 0x1cd17
movups 0x30(%r14), %xmm0
movups %xmm0, 0x50(%rbx)
movsd 0x40(%r14), %xmm0
movsd %xmm0, 0x60(%rbx)
movsd 0x48(%r14), %xmm1
pushq $0x68
popq %rax
movsd %xmm1, (%rbx,%rax)
addq $0x48, %rsp
popq %rbx
popq %r12
popq %r14
popq %r15
retq