// File: /workspace/github_c_makefile_star2_O1/PoulinV[P]AxiCLASS/build/../tools/hyperspherical.c
// Function: CF1_from_Gegenbauer
int CF1_from_Gegenbauer(int l,
                        int beta,
                        double sinK,
                        double cotK,
                        double *CF){
  int n, alpha, k;
  double x, G, dG, Gkm1, Gkm2;
  n = beta-l-1;
  if (n<0)
    return _FAILURE_;
  alpha = l+1;
  x = sinK*cotK; //cos(x)
  switch (n){
  case 0:
    G = 1;
    dG = 0;
    break;
  case 1:
    G = 2*alpha*x;
    dG = 2*alpha;
    break;
  case 2:
    G = -alpha + 2*alpha*(1+alpha)*x*x;
    dG = 4*x*alpha*(1+alpha);
    break;
  case 3:
    G = -2*alpha*(1+alpha)*x+4.0/3.0*alpha*(1+alpha)*(2+alpha)*x*x*x;
    dG = 2*alpha*(1+alpha)*(2*(2+alpha)*x*x-1);
    break;
  default:
    G = 0.0;
    Gkm2 = -alpha + 2*alpha*(1+alpha)*x*x;
    Gkm1 = -2*alpha*(1+alpha)*x+4.0/3.0*alpha*(1+alpha)*(2+alpha)*x*x*x;
    for (k=4; k<=n; k++){
      G = (2*(k+alpha-1)*x*Gkm1 - (k+2*alpha-2)*Gkm2) / k;
      if (fabs(G)>_HYPER_OVERFLOW_){
                Gkm2 = Gkm1/_HYPER_OVERFLOW_;
                G = G/_HYPER_OVERFLOW_;
                Gkm1 = G;
      }
      else{
        Gkm2 = Gkm1;
        Gkm1 = G;
      }
    }
    //Derivative. Gkm2 is in fact Gkm1..
    dG = (-n*x*G+(n+2*alpha-1)*Gkm2)/(1.0-x*x);
  }
  //%Phi = G;
  //%dPhi = l*coty.*G-siny.*dG;
  *CF = l*cotK-sinK*dG/G;
  return _SUCCESS_;
}

// Assembly:
movl %edi, %ecx
notl %ecx
movl %ecx, %eax
addl %esi, %eax
js 0x24aec
leal 0x1(%rdi), %r8d
movapd %xmm0, %xmm2
mulsd %xmm1, %xmm2
cmpl $0x3, %eax
ja 0x24bbd
movl %eax, %eax
leaq 0xcfeae(%rip), %rsi     # 0xf4980
movslq (%rsi,%rax,4), %rax
addq %rsi, %rax
jmpq *%rax
xorpd %xmm4, %xmm4
movsd 0xcc779(%rip), %xmm3    # 0xf1260
jmp 0x24d3f
movl $0x1, %eax
retq
cvtsi2sd %ecx, %xmm4
leal 0x2(%rdi), %eax
cvtsi2sd %r8d, %xmm5
imull %eax, %r8d
addl %r8d, %r8d
cvtsi2sd %r8d, %xmm3
mulsd %xmm2, %xmm3
mulsd %xmm2, %xmm3
addsd %xmm4, %xmm3
mulsd 0xcf90a(%rip), %xmm2    # 0xf4428
mulsd %xmm5, %xmm2
xorps %xmm4, %xmm4
cvtsi2sd %eax, %xmm4
mulsd %xmm2, %xmm4
jmp 0x24d3f
leal 0x2(%rdi), %eax
cvtsi2sd %r8d, %xmm4
imull %eax, %r8d
addl %r8d, %r8d
movl %r8d, %ecx
negl %ecx
cvtsi2sd %ecx, %xmm3
mulsd 0xcf95e(%rip), %xmm4    # 0xf44b0
cvtsi2sd %eax, %xmm5
mulsd %xmm4, %xmm5
leal 0x3(%rdi), %eax
xorps %xmm4, %xmm4
cvtsi2sd %eax, %xmm4
mulsd %xmm5, %xmm4
mulsd %xmm2, %xmm4
mulsd %xmm2, %xmm4
mulsd %xmm2, %xmm4
mulsd %xmm2, %xmm3
addsd %xmm4, %xmm3
xorps %xmm5, %xmm5
cvtsi2sd %r8d, %xmm5
leal 0x6(%rdi,%rdi), %eax
xorps %xmm4, %xmm4
cvtsi2sd %eax, %xmm4
mulsd %xmm2, %xmm4
mulsd %xmm2, %xmm4
addsd 0xccc49(%rip), %xmm4    # 0xf17e8
mulsd %xmm5, %xmm4
jmp 0x24d3f
addl %r8d, %r8d
cvtsi2sd %r8d, %xmm4
mulsd %xmm4, %xmm2
movapd %xmm2, %xmm3
jmp 0x24d3f
cvtsi2sd %ecx, %xmm4
leal (%r8,%r8), %ecx
leal 0x2(%rdi), %r9d
movl %ecx, %r10d
imull %r9d, %r10d
cvtsi2sd %r10d, %xmm3
mulsd %xmm2, %xmm3
mulsd %xmm2, %xmm3
addsd %xmm4, %xmm3
cmpl $0x4, %eax
jge 0x24bef
movq %xmm3, %xmm3            # xmm3 = xmm3[0],zero
jmp 0x24cfd
cvtsi2sd %r8d, %xmm5
imull %r9d, %r8d
addl %r8d, %r8d
negl %r8d
xorps %xmm4, %xmm4
cvtsi2sd %r8d, %xmm4
mulsd 0xcf8a2(%rip), %xmm5    # 0xf44b0
cvtsi2sd %r9d, %xmm6
leal 0x3(%rdi), %r8d
cvtsi2sd %r8d, %xmm7
mulsd %xmm5, %xmm6
mulsd %xmm6, %xmm7
mulsd %xmm2, %xmm7
mulsd %xmm2, %xmm7
mulsd %xmm2, %xmm7
mulsd %xmm2, %xmm4
addsd %xmm7, %xmm4
subl %edi, %esi
addl $-0x4, %esi
leal 0x8(,%rdi,2), %r8d
leal 0x4(,%rdi,2), %r9d
movsd 0xcf7d3(%rip), %xmm5    # 0xf4428
movapd 0xcc5e3(%rip), %xmm6    # 0xf1240
movsd 0xcf823(%rip), %xmm7    # 0xf4488
movapd 0xcfc02(%rip), %xmm8    # 0xf4870
movsd 0xcc5e9(%rip), %xmm9    # 0xf1260
xorps %xmm10, %xmm10
cvtsi2sd %r8d, %xmm10
mulsd %xmm2, %xmm10
xorps %xmm11, %xmm11
cvtsi2sd %r9d, %xmm11
mulsd %xmm3, %xmm11
mulsd %xmm4, %xmm10
subsd %xmm11, %xmm10
divsd %xmm5, %xmm10
unpcklpd %xmm10, %xmm4           # xmm4 = xmm4[0],xmm10[0]
andpd %xmm6, %xmm10
xorl %r10d, %r10d
ucomisd %xmm7, %xmm10
seta %r10b
movapd %xmm4, %xmm10
divpd %xmm8, %xmm10
movd %r10d, %xmm3
pshufd $0x0, %xmm3, %xmm3      # xmm3 = xmm3[0,0,0,0]
pslld $0x1f, %xmm3
psrad $0x1f, %xmm3
andpd %xmm3, %xmm10
andnpd %xmm4, %xmm3
orpd %xmm10, %xmm3
addsd %xmm9, %xmm5
pshufd $0xee, %xmm3, %xmm4     # xmm4 = xmm3[2,3,2,3]
addl $0x2, %r8d
incl %r9d
decl %esi
jne 0x24c77
movl %eax, %esi
negl %esi
xorps %xmm5, %xmm5
cvtsi2sd %esi, %xmm5
mulsd %xmm2, %xmm5
addl %ecx, %eax
decl %eax
xorps %xmm6, %xmm6
cvtsi2sd %eax, %xmm6
mulsd %xmm3, %xmm6
unpckhpd %xmm3, %xmm3            # xmm3 = xmm3[1,1]
movapd %xmm3, %xmm4
mulsd %xmm5, %xmm4
addsd %xmm6, %xmm4
mulsd %xmm2, %xmm2
movsd 0xcc529(%rip), %xmm5    # 0xf1260
subsd %xmm2, %xmm5
divsd %xmm5, %xmm4
xorps %xmm2, %xmm2
cvtsi2sd %edi, %xmm2
mulsd %xmm0, %xmm4
divsd %xmm3, %xmm4
mulsd %xmm1, %xmm2
subsd %xmm4, %xmm2
movsd %xmm2, (%rdx)
xorl %eax, %eax
retq