// File: /workspace/github_c_makefile_star2_O3/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 0x24992
leal 0x1(%rdi), %r8d
movapd %xmm0, %xmm2
mulsd %xmm1, %xmm2
cmpl $0x3, %eax
ja 0x24a60
movl %eax, %eax
leaq 0xcd018(%rip), %rsi     # 0xf1990
movslq (%rsi,%rax,4), %rax
addq %rsi, %rax
jmpq *%rax
xorpd %xmm5, %xmm5
movsd 0xc98d3(%rip), %xmm2    # 0xee260
jmp 0x24be8
movl $0x1, %eax
retq
cvtsi2sd %ecx, %xmm3
leal 0x2(%rdi), %eax
cvtsi2sd %r8d, %xmm4
imull %eax, %r8d
addl %r8d, %r8d
cvtsi2sd %r8d, %xmm6
mulsd %xmm2, %xmm6
mulsd %xmm2, %xmm6
addsd %xmm3, %xmm6
mulsd 0xcca74(%rip), %xmm2    # 0xf1438
mulsd %xmm4, %xmm2
cvtsi2sd %eax, %xmm5
mulsd %xmm2, %xmm5
movapd %xmm6, %xmm2
jmp 0x24be8
leal 0x2(%rdi), %eax
cvtsi2sd %r8d, %xmm4
imull %eax, %r8d
addl %r8d, %r8d
movl %r8d, %ecx
negl %ecx
cvtsi2sd %ecx, %xmm3
mulsd 0xccac7(%rip), %xmm4    # 0xf14c0
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 %xmm4, %xmm4
cvtsi2sd %r8d, %xmm4
leal 0x6(%rdi,%rdi), %eax
xorps %xmm5, %xmm5
cvtsi2sd %eax, %xmm5
mulsd %xmm2, %xmm5
mulsd %xmm2, %xmm5
addsd 0xc9da2(%rip), %xmm5    # 0xee7e8
mulsd %xmm4, %xmm5
jmp 0x24be4
addl %r8d, %r8d
cvtsi2sd %r8d, %xmm5
mulsd %xmm5, %xmm2
jmp 0x24be8
cvtsi2sd %ecx, %xmm4
leal (%r8,%r8), %ecx
leal 0x2(%rdi), %r9d
movl %ecx, %r10d
imull %r9d, %r10d
cvtsi2sd %r10d, %xmm5
cvtsi2sd %r8d, %xmm3
imull %r9d, %r8d
addl %r8d, %r8d
negl %r8d
cvtsi2sd %r8d, %xmm6
mulsd %xmm2, %xmm5
unpcklpd %xmm6, %xmm5            # xmm5 = xmm5[0],xmm6[0]
mulsd 0xcca24(%rip), %xmm3    # 0xf14c0
xorps %xmm6, %xmm6
cvtsi2sd %r9d, %xmm6
mulsd %xmm3, %xmm6
leal 0x3(%rdi), %r8d
xorps %xmm3, %xmm3
cvtsi2sd %r8d, %xmm3
mulsd %xmm6, %xmm3
mulsd %xmm2, %xmm3
mulsd %xmm2, %xmm3
mulsd %xmm2, %xmm3
unpcklpd %xmm3, %xmm4            # xmm4 = xmm4[0],xmm3[0]
movapd %xmm2, %xmm3
unpcklpd %xmm2, %xmm3            # xmm3 = xmm3[0],xmm2[0]
mulpd %xmm5, %xmm3
addpd %xmm4, %xmm3
subl %edi, %esi
addl $-0x4, %esi
leal 0x8(,%rdi,2), %r8d
leal 0x4(,%rdi,2), %r9d
movsd 0xcc943(%rip), %xmm5    # 0xf1438
movapd 0xc9743(%rip), %xmm6    # 0xee240
movsd 0xcc993(%rip), %xmm7    # 0xf1498
movapd 0xccd72(%rip), %xmm8    # 0xf1880
movsd 0xc974a(%rip), %xmm4    # 0xee260
xorps %xmm9, %xmm9
cvtsi2sd %r8d, %xmm9
xorps %xmm10, %xmm10
cvtsi2sd %r9d, %xmm10
mulsd %xmm2, %xmm9
mulsd %xmm3, %xmm10
movapd %xmm3, %xmm11
unpckhpd %xmm3, %xmm11           # xmm11 = xmm11[1],xmm3[1]
mulsd %xmm9, %xmm11
subsd %xmm10, %xmm11
divsd %xmm5, %xmm11
shufpd $0x1, %xmm11, %xmm3     # xmm3 = xmm3[1],xmm11[0]
andpd %xmm6, %xmm11
xorl %r10d, %r10d
ucomisd %xmm7, %xmm11
seta %r10b
movapd %xmm3, %xmm9
divpd %xmm8, %xmm9
movd %r10d, %xmm10
pshufd $0x0, %xmm10, %xmm10    # xmm10 = xmm10[0,0,0,0]
pslld $0x1f, %xmm10
psrad $0x1f, %xmm10
andpd %xmm10, %xmm9
andnpd %xmm3, %xmm10
movapd %xmm10, %xmm3
orpd %xmm9, %xmm3
addsd %xmm4, %xmm5
addl $0x2, %r8d
incl %r9d
decl %esi
jne 0x24b16
movl %eax, %esi
negl %esi
xorps %xmm6, %xmm6
cvtsi2sd %esi, %xmm6
mulsd %xmm2, %xmm6
addl %ecx, %eax
decl %eax
xorps %xmm7, %xmm7
cvtsi2sd %eax, %xmm7
mulsd %xmm3, %xmm7
unpckhpd %xmm3, %xmm3            # xmm3 = xmm3[1,1]
movapd %xmm3, %xmm5
mulsd %xmm6, %xmm5
addsd %xmm7, %xmm5
mulsd %xmm2, %xmm2
subsd %xmm2, %xmm4
divsd %xmm4, %xmm5
movapd %xmm3, %xmm2
xorps %xmm3, %xmm3
cvtsi2sd %edi, %xmm3
mulsd %xmm0, %xmm5
divsd %xmm2, %xmm5
mulsd %xmm1, %xmm3
subsd %xmm5, %xmm3
movsd %xmm3, (%rdx)
xorl %eax, %eax
retq