// File: /workspace/github_c_makefile_star2_O2/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, %eax
notl %eax
addl %eax, %esi
js 0x22509
leal 0x1(%rdi), %ecx
movapd %xmm0, %xmm2
mulsd %xmm1, %xmm2
cmpl $0x3, %esi
ja 0x225c1
movl %esi, %esi
leaq 0xc63c1(%rip), %r8      # 0xe88b0
movslq (%r8,%rsi,4), %rsi
addq %r8, %rsi
jmpq *%rsi
xorpd %xmm6, %xmm6
movsd 0xc2d5c(%rip), %xmm3    # 0xe5260
jmp 0x2272b
pushq $0x1
popq %rax
retq
cvtsi2sd %eax, %xmm4
leal 0x2(%rdi), %eax
cvtsi2sd %ecx, %xmm5
imull %eax, %ecx
addl %ecx, %ecx
cvtsi2sd %ecx, %xmm3
mulsd %xmm2, %xmm3
mulsd %xmm2, %xmm3
addsd %xmm4, %xmm3
mulsd 0xc5ec3(%rip), %xmm2    # 0xe83f8
mulsd %xmm5, %xmm2
cvtsi2sd %eax, %xmm6
mulsd %xmm2, %xmm6
jmp 0x2272b
leal 0x2(%rdi), %eax
cvtsi2sd %ecx, %xmm4
imull %eax, %ecx
addl %ecx, %ecx
movl %ecx, %esi
negl %esi
cvtsi2sd %esi, %xmm3
mulsd 0xc5f1e(%rip), %xmm4    # 0xe8480
cvtsi2sd %eax, %xmm5
mulsd %xmm4, %xmm5
leal 0x3(%rdi), %eax
cvtsi2sd %eax, %xmm4
mulsd %xmm5, %xmm4
mulsd %xmm2, %xmm4
mulsd %xmm2, %xmm4
mulsd %xmm2, %xmm4
mulsd %xmm2, %xmm3
addsd %xmm4, %xmm3
cvtsi2sd %ecx, %xmm4
leal 0x6(%rdi,%rdi), %eax
cvtsi2sd %eax, %xmm6
mulsd %xmm2, %xmm6
mulsd %xmm2, %xmm6
addsd 0xc3243(%rip), %xmm6    # 0xe57e8
mulsd %xmm4, %xmm6
jmp 0x2272b
addl %ecx, %ecx
cvtsi2sd %ecx, %xmm6
mulsd %xmm6, %xmm2
movapd %xmm2, %xmm3
jmp 0x2272b
cvtsi2sd %eax, %xmm3
leal (%rcx,%rcx), %eax
leal 0x2(%rdi), %r8d
movl %eax, %r9d
imull %r8d, %r9d
cvtsi2sd %r9d, %xmm4
cvtsi2sd %ecx, %xmm5
imull %r8d, %ecx
addl %ecx, %ecx
negl %ecx
cvtsi2sd %ecx, %xmm6
mulsd %xmm2, %xmm4
unpcklpd %xmm6, %xmm4            # xmm4 = xmm4[0],xmm6[0]
mulsd 0xc5e88(%rip), %xmm5    # 0xe8480
cvtsi2sd %r8d, %xmm6
mulsd %xmm5, %xmm6
leal 0x3(%rdi), %ecx
cvtsi2sd %ecx, %xmm5
mulsd %xmm6, %xmm5
mulsd %xmm2, %xmm5
mulsd %xmm2, %xmm5
mulsd %xmm2, %xmm5
unpcklpd %xmm5, %xmm3            # xmm3 = xmm3[0],xmm5[0]
movapd %xmm2, %xmm5
unpcklpd %xmm2, %xmm5            # xmm5 = xmm5[0],xmm2[0]
mulpd %xmm4, %xmm5
addpd %xmm3, %xmm5
leal 0x4(%rdi,%rdi), %ecx
leal 0x8(%rdi,%rdi), %r8d
xorpd %xmm3, %xmm3
pushq $0x4
popq %r9
movsd 0xc5db3(%rip), %xmm6    # 0xe83f8
movapd 0xc2bf3(%rip), %xmm7    # 0xe5240
movsd 0xc5e02(%rip), %xmm8    # 0xe8458
movapd 0xc61a1(%rip), %xmm9    # 0xe8800
movsd 0xc2bf9(%rip), %xmm4    # 0xe5260
cmpl %esi, %r9d
jg 0x226ff
cvtsi2sd %r8d, %xmm3
mulsd %xmm2, %xmm3
cvtsi2sd %ecx, %xmm10
mulsd %xmm5, %xmm10
movapd %xmm5, %xmm11
unpckhpd %xmm5, %xmm11           # xmm11 = xmm11[1],xmm5[1]
mulsd %xmm3, %xmm11
subsd %xmm10, %xmm11
divsd %xmm6, %xmm11
shufpd $0x1, %xmm11, %xmm5     # xmm5 = xmm5[1],xmm11[0]
andpd %xmm7, %xmm11
xorl %r10d, %r10d
ucomisd %xmm8, %xmm11
seta %r10b
movapd %xmm5, %xmm3
divpd %xmm9, %xmm3
movd %r10d, %xmm10
pshufd $0x0, %xmm10, %xmm10    # xmm10 = xmm10[0,0,0,0]
pslld $0x1f, %xmm10
psrad $0x1f, %xmm10
andpd %xmm10, %xmm3
andnpd %xmm5, %xmm10
orpd %xmm3, %xmm10
addsd %xmm4, %xmm6
incl %r9d
pshufd $0xee, %xmm10, %xmm3    # xmm3 = xmm10[2,3,2,3]
incl %ecx
addl $0x2, %r8d
movapd %xmm10, %xmm5
jmp 0x22667
movl %esi, %ecx
negl %ecx
cvtsi2sd %ecx, %xmm6
mulsd %xmm2, %xmm6
addl %esi, %eax
decl %eax
cvtsi2sd %eax, %xmm7
mulsd %xmm7, %xmm5
mulsd %xmm3, %xmm6
addsd %xmm5, %xmm6
mulsd %xmm2, %xmm2
subsd %xmm2, %xmm4
divsd %xmm4, %xmm6
cvtsi2sd %edi, %xmm2
mulsd %xmm0, %xmm6
divsd %xmm3, %xmm6
mulsd %xmm1, %xmm2
subsd %xmm6, %xmm2
movsd %xmm2, (%rdx)
xorl %eax, %eax
retq