#define NULL ((void *)0)
typedef unsigned long size_t; // Customize by platform.
typedef long intptr_t;
typedef unsigned long uintptr_t;
typedef long scalar_t__; // Either arithmetic or pointer type.
/* By default, we understand bool (as a convenience). */
typedef int bool;
#define false 0
#define true 1

/* Forward declarations */

/* Type definitions */

/* Variables and functions */
double exp(double);
double fabs(double);
double pow(double, double);
int /*<<< orphan*/ printf(char *, ...);
double th_Hyper1F1GG(double a, double b, double x, double eps) {
  double sum, ratio, aks, bks, kfact, tk, xpow, eps10, term, fk, bMaPkM1,
      OneMaPkM1, termold, termnew, aPkM1, aMbPk, Mx, th_Gamma(double x);
  int k;
  if (a == b)
    return exp(x);
  if (b <= 0.0) {
    printf("\n\n!!In th_Hyper1F1GG  b<=0; 0 returned");
    return 0.0;
  }
  eps10 = 0.1 * eps;
  if (fabs(x) <= 50.0) {
    sum = 1.0;
    ratio = 10.0;
    aks = a;
    bks = b;
    kfact = 1.0;
    tk = 1.0;
    xpow = 1.0;
    while (ratio > eps10) {
      tk *= aks / (bks * kfact);
      xpow *= x;
      term = tk * xpow;
      sum += term;
      aks += 1.0;
      bks += 1.0;
      kfact += 1.0;
      ratio = fabs(term / sum);
    }
    return sum;
  }
  if (x > 50.0) {
    if (a <= 0.0) {
      printf("\n\n!!In th_Hyper1F1GG asymptotic a<=0; 0 returned");
      return 0.0;
    }
    k = 0;
    fk = 1.0;
    bMaPkM1 = b - a;
    OneMaPkM1 = 1.0 - a;
    term = 1.0;
    termold = 100.0;
    sum = 1.0;
    ratio = 10.0;
    while (ratio > eps10) {
      k++;
      term *= bMaPkM1 * OneMaPkM1 / (fk * x);
      sum += term;
      bMaPkM1 += 1.0;
      OneMaPkM1 += 1.0;
      fk += 1.0;
      ratio = fabs(term / sum);
      termnew = fabs(term);
      if (termnew > termold) {
        printf("\n\n!!In th_Hyper1F1GG diverging after %i terms", k);
        ratio = 0.0;
      } else {
        termold = termnew;
      }
    }
    return (th_Gamma(b) * exp(x) / th_Gamma(a)) * pow(x, a - b) * sum;
  }
  if (b <= a) {
    printf("\n\n!!In asymptotic th_Hyper1F1GG  b<=a; 0 returned");
    return 0.0;
  }
  Mx = -x;
  k = 0;
  fk = 1.0;
  aMbPk = a - b + 1.0;
  aPkM1 = a;
  term = 1.0;
  termold = 100.0;
  sum = 1.0;
  ratio = 10.0;
  while (ratio > eps10) {
    k++;
    term *= aPkM1 * aMbPk / (fk * Mx);
    sum += term;
    aPkM1 += 1.0;
    aMbPk += 1.0;
    fk += 1.0;
    ratio = fabs(term / sum);
    termnew = fabs(term);
    if (termnew > termold) {
      printf("\n\n!!In th_Hyper1F1GG diverging after %i terms", k);
      ratio = 0.0;
    } else {
      termold = termnew;
    }
  }
  return th_Gamma(b) * sum / (th_Gamma(b - a) * pow(Mx, a));
}


x86 assembly (clang, -O0):
<th_Hyper1F1GG>:
push   %rbp
mov    %rsp,%rbp
sub    $0xe0,%rsp
movsd  %xmm0,-0x10(%rbp)
movsd  %xmm1,-0x18(%rbp)
movsd  %xmm2,-0x20(%rbp)
movsd  %xmm3,-0x28(%rbp)
movsd  -0x10(%rbp),%xmm0
ucomisd -0x18(%rbp),%xmm0
jne    1189 <th_Hyper1F1GG+0x49>
jp     1189 <th_Hyper1F1GG+0x49>
movsd  -0x20(%rbp),%xmm0
call   1050 <exp@plt>
movsd  %xmm0,-0x8(%rbp)
jmp    1783 <th_Hyper1F1GG+0x643>
xorps  %xmm0,%xmm0
ucomisd -0x18(%rbp),%xmm0
jb     11b2 <th_Hyper1F1GG+0x72>
lea    0xea2(%rip),%rdi
mov    $0x0,%al
call   1030 <printf@plt>
xorps  %xmm0,%xmm0
movsd  %xmm0,-0x8(%rbp)
jmp    1783 <th_Hyper1F1GG+0x643>
movsd  0xe4e(%rip),%xmm0
mulsd  -0x28(%rbp),%xmm0
movsd  %xmm0,-0x68(%rbp)
movsd  -0x20(%rbp),%xmm1
movaps 0xe60(%rip),%xmm0
pand   %xmm0,%xmm1
movsd  0xe24(%rip),%xmm0
ucomisd %xmm1,%xmm0
jb     12f9 <th_Hyper1F1GG+0x1b9>
movsd  0xe2a(%rip),%xmm0
movsd  %xmm0,-0x30(%rbp)
movsd  0xe15(%rip),%xmm0
movsd  %xmm0,-0x38(%rbp)
movsd  -0x10(%rbp),%xmm0
movsd  %xmm0,-0x40(%rbp)
movsd  -0x18(%rbp),%xmm0
movsd  %xmm0,-0x48(%rbp)
movsd  0xdfc(%rip),%xmm0
movsd  %xmm0,-0x50(%rbp)
movsd  0xdef(%rip),%xmm0
movsd  %xmm0,-0x58(%rbp)
movsd  0xde2(%rip),%xmm0
movsd  %xmm0,-0x60(%rbp)
movsd  -0x38(%rbp),%xmm0
ucomisd -0x68(%rbp),%xmm0
jbe    12ea <th_Hyper1F1GG+0x1aa>
movsd  -0x40(%rbp),%xmm0
movsd  -0x48(%rbp),%xmm1
mulsd  -0x50(%rbp),%xmm1
divsd  %xmm1,%xmm0
mulsd  -0x58(%rbp),%xmm0
movsd  %xmm0,-0x58(%rbp)
movsd  -0x20(%rbp),%xmm0
mulsd  -0x60(%rbp),%xmm0
movsd  %xmm0,-0x60(%rbp)
movsd  -0x58(%rbp),%xmm0
mulsd  -0x60(%rbp),%xmm0
movsd  %xmm0,-0x70(%rbp)
movsd  -0x70(%rbp),%xmm0
addsd  -0x30(%rbp),%xmm0
movsd  %xmm0,-0x30(%rbp)
movsd  0xd7b(%rip),%xmm0
addsd  -0x40(%rbp),%xmm0
movsd  %xmm0,-0x40(%rbp)
movsd  0xd69(%rip),%xmm0
addsd  -0x48(%rbp),%xmm0
movsd  %xmm0,-0x48(%rbp)
movsd  0xd57(%rip),%xmm0
addsd  -0x50(%rbp),%xmm0
movsd  %xmm0,-0x50(%rbp)
movsd  -0x70(%rbp),%xmm0
divsd  -0x30(%rbp),%xmm0
movaps 0xd54(%rip),%xmm1
pand   %xmm1,%xmm0
movsd  %xmm0,-0x38(%rbp)
jmp    123b <th_Hyper1F1GG+0xfb>
movsd  -0x30(%rbp),%xmm0
movsd  %xmm0,-0x8(%rbp)
jmp    1783 <th_Hyper1F1GG+0x643>
movsd  -0x20(%rbp),%xmm0
movsd  0xcfa(%rip),%xmm1
ucomisd %xmm1,%xmm0
jbe    153e <th_Hyper1F1GG+0x3fe>
xorps  %xmm0,%xmm0
ucomisd -0x10(%rbp),%xmm0
jb     1339 <th_Hyper1F1GG+0x1f9>
lea    0xd42(%rip),%rdi
mov    $0x0,%al
call   1030 <printf@plt>
xorps  %xmm0,%xmm0
movsd  %xmm0,-0x8(%rbp)
jmp    1783 <th_Hyper1F1GG+0x643>
movl   $0x0,-0xb4(%rbp)
movsd  0xccd(%rip),%xmm0
movsd  %xmm0,-0x78(%rbp)
movsd  -0x18(%rbp),%xmm0
subsd  -0x10(%rbp),%xmm0
movsd  %xmm0,-0x80(%rbp)
movsd  0xcb1(%rip),%xmm0
subsd  -0x10(%rbp),%xmm0
movsd  %xmm0,-0x88(%rbp)
ff
movsd  0xc9c(%rip),%xmm0
movsd  %xmm0,-0x70(%rbp)
movsd  0xc97(%rip),%xmm0
movsd  %xmm0,-0x90(%rbp)
ff
movsd  0xc7f(%rip),%xmm0
movsd  %xmm0,-0x30(%rbp)
movsd  0xc6a(%rip),%xmm0
movsd  %xmm0,-0x38(%rbp)
movsd  -0x38(%rbp),%xmm0
ucomisd -0x68(%rbp),%xmm0
jbe    14b8 <th_Hyper1F1GG+0x378>
mov    -0xb4(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0xb4(%rbp)
movsd  -0x80(%rbp),%xmm0
mulsd  -0x88(%rbp),%xmm0
ff
movsd  -0x78(%rbp),%xmm1
mulsd  -0x20(%rbp),%xmm1
divsd  %xmm1,%xmm0
mulsd  -0x70(%rbp),%xmm0
movsd  %xmm0,-0x70(%rbp)
movsd  -0x70(%rbp),%xmm0
addsd  -0x30(%rbp),%xmm0
movsd  %xmm0,-0x30(%rbp)
movsd  0xc12(%rip),%xmm0
addsd  -0x80(%rbp),%xmm0
movsd  %xmm0,-0x80(%rbp)
movsd  0xc00(%rip),%xmm0
addsd  -0x88(%rbp),%xmm0
ff
movsd  %xmm0,-0x88(%rbp)
ff
movsd  0xbe8(%rip),%xmm0
addsd  -0x78(%rbp),%xmm0
movsd  %xmm0,-0x78(%rbp)
movsd  -0x70(%rbp),%xmm0
divsd  -0x30(%rbp),%xmm0
movaps 0xbe5(%rip),%xmm1
pand   %xmm1,%xmm0
movsd  %xmm0,-0x38(%rbp)
movsd  -0x70(%rbp),%xmm0
movaps 0xbd0(%rip),%xmm1
pand   %xmm1,%xmm0
movsd  %xmm0,-0x98(%rbp)
ff
movsd  -0x98(%rbp),%xmm0
ff
ucomisd -0x90(%rbp),%xmm0
ff
jbe    14a3 <th_Hyper1F1GG+0x363>
mov    -0xb4(%rbp),%esi
lea    0xc09(%rip),%rdi
mov    $0x0,%al
call   1030 <printf@plt>
xorps  %xmm0,%xmm0
movsd  %xmm0,-0x38(%rbp)
jmp    14b3 <th_Hyper1F1GG+0x373>
movsd  -0x98(%rbp),%xmm0
ff
movsd  %xmm0,-0x90(%rbp)
ff
jmp    13ab <th_Hyper1F1GG+0x26b>
movsd  -0x18(%rbp),%xmm0
call   1040 <th_Gamma@plt>
movsd  %xmm0,-0xd0(%rbp)
ff
movsd  -0x20(%rbp),%xmm0
call   1050 <exp@plt>
movaps %xmm0,%xmm1
movsd  -0xd0(%rbp),%xmm0
ff
mulsd  %xmm1,%xmm0
movsd  %xmm0,-0xc8(%rbp)
ff
movsd  -0x10(%rbp),%xmm0
call   1040 <th_Gamma@plt>
movaps %xmm0,%xmm1
movsd  -0xc8(%rbp),%xmm0
ff
divsd  %xmm1,%xmm0
movsd  %xmm0,-0xc0(%rbp)
ff
movsd  -0x20(%rbp),%xmm0
movsd  -0x10(%rbp),%xmm1
subsd  -0x18(%rbp),%xmm1
call   1060 <pow@plt>
movaps %xmm0,%xmm1
movsd  -0xc0(%rbp),%xmm0
ff
mulsd  %xmm1,%xmm0
mulsd  -0x30(%rbp),%xmm0
movsd  %xmm0,-0x8(%rbp)
jmp    1783 <th_Hyper1F1GG+0x643>
movsd  -0x18(%rbp),%xmm1
movsd  -0x10(%rbp),%xmm0
ucomisd %xmm1,%xmm0
jb     156d <th_Hyper1F1GG+0x42d>
lea    0xb6d(%rip),%rdi
mov    $0x0,%al
call   1030 <printf@plt>
xorps  %xmm0,%xmm0
movsd  %xmm0,-0x8(%rbp)
jmp    1783 <th_Hyper1F1GG+0x643>
movsd  -0x20(%rbp),%xmm0
movq   %xmm0,%rax
movabs $0x8000000000000000,%rcx
xor    %rcx,%rax
movq   %rax,%xmm0
movsd  %xmm0,-0xb0(%rbp)
ff
movl   $0x0,-0xb4(%rbp)
movsd  0xa75(%rip),%xmm0
movsd  %xmm0,-0x78(%rbp)
movsd  -0x10(%rbp),%xmm0
subsd  -0x18(%rbp),%xmm0
movsd  0xa5e(%rip),%xmm1
addsd  %xmm1,%xmm0
movsd  %xmm0,-0xa8(%rbp)
ff
movsd  -0x10(%rbp),%xmm0
movsd  %xmm0,-0xa0(%rbp)
ff
movsd  0xa3d(%rip),%xmm0
movsd  %xmm0,-0x70(%rbp)
movsd  0xa38(%rip),%xmm0
movsd  %xmm0,-0x90(%rbp)
ff
movsd  0xa20(%rip),%xmm0
movsd  %xmm0,-0x30(%rbp)
movsd  0xa0b(%rip),%xmm0
movsd  %xmm0,-0x38(%rbp)
movsd  -0x38(%rbp),%xmm0
ucomisd -0x68(%rbp),%xmm0
jbe    1723 <th_Hyper1F1GG+0x5e3>
mov    -0xb4(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0xb4(%rbp)
movsd  -0xa0(%rbp),%xmm0
ff
mulsd  -0xa8(%rbp),%xmm0
ff
movsd  -0x78(%rbp),%xmm1
mulsd  -0xb0(%rbp),%xmm1
ff
divsd  %xmm1,%xmm0
mulsd  -0x70(%rbp),%xmm0
movsd  %xmm0,-0x70(%rbp)
movsd  -0x70(%rbp),%xmm0
addsd  -0x30(%rbp),%xmm0
movsd  %xmm0,-0x30(%rbp)
movsd  0x9ad(%rip),%xmm0
addsd  -0xa0(%rbp),%xmm0
ff
movsd  %xmm0,-0xa0(%rbp)
ff
movsd  0x995(%rip),%xmm0
addsd  -0xa8(%rbp),%xmm0
ff
movsd  %xmm0,-0xa8(%rbp)
ff
movsd  0x97d(%rip),%xmm0
addsd  -0x78(%rbp),%xmm0
movsd  %xmm0,-0x78(%rbp)
movsd  -0x70(%rbp),%xmm0
divsd  -0x30(%rbp),%xmm0
movaps 0x97a(%rip),%xmm1
pand   %xmm1,%xmm0
movsd  %xmm0,-0x38(%rbp)
movsd  -0x70(%rbp),%xmm0
movaps 0x965(%rip),%xmm1
pand   %xmm1,%xmm0
movsd  %xmm0,-0x98(%rbp)
ff
movsd  -0x98(%rbp),%xmm0
ff
ucomisd -0x90(%rbp),%xmm0
ff
jbe    170e <th_Hyper1F1GG+0x5ce>
mov    -0xb4(%rbp),%esi
lea    0x99e(%rip),%rdi
mov    $0x0,%al
call   1030 <printf@plt>
xorps  %xmm0,%xmm0
movsd  %xmm0,-0x38(%rbp)
jmp    171e <th_Hyper1F1GG+0x5de>
movsd  -0x98(%rbp),%xmm0
ff
movsd  %xmm0,-0x90(%rbp)
ff
jmp    160a <th_Hyper1F1GG+0x4ca>
movsd  -0x18(%rbp),%xmm0
call   1040 <th_Gamma@plt>
mulsd  -0x30(%rbp),%xmm0
movsd  %xmm0,-0xd8(%rbp)
ff
movsd  -0x18(%rbp),%xmm0
subsd  -0x10(%rbp),%xmm0
call   1040 <th_Gamma@plt>
movsd  %xmm0,-0xe0(%rbp)
ff
movsd  -0xb0(%rbp),%xmm0
ff
movsd  -0x10(%rbp),%xmm1
call   1060 <pow@plt>
movsd  -0xe0(%rbp),%xmm1
ff
movaps %xmm0,%xmm2
movsd  -0xd8(%rbp),%xmm0
ff
mulsd  %xmm2,%xmm1
divsd  %xmm1,%xmm0
movsd  %xmm0,-0x8(%rbp)
movsd  -0x8(%rbp),%xmm0
add    $0xe0,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<th_Hyper1F1GG>:
ucomisd %xmm1,%xmm0
jne    1150 <th_Hyper1F1GG+0x10>
jp     1150 <th_Hyper1F1GG+0x10>
movaps %xmm2,%xmm0
jmp    1050 <exp@plt>
push   %r14
push   %rbx
sub    $0x98,%rsp
movapd %xmm0,%xmm8
xorpd  %xmm0,%xmm0
ucomisd %xmm1,%xmm0
jae    1236 <th_Hyper1F1GG+0xf6>
mulsd  0xe8b(%rip),%xmm3
movapd 0xeb3(%rip),%xmm0
andpd  %xmm2,%xmm0
movsd  0xe7f(%rip),%xmm4
ucomisd %xmm0,%xmm4
jae    133a <th_Hyper1F1GG+0x1fa>
ucomisd 0xe6d(%rip),%xmm2
movapd %xmm8,0x40(%rsp)
movapd %xmm1,0x20(%rsp)
movsd  %xmm3,0x8(%rsp)
jbe    13ca <th_Hyper1F1GG+0x28a>
xorpd  %xmm0,%xmm0
ucomisd %xmm8,%xmm0
jae    154a <th_Hyper1F1GG+0x40a>
movsd  0xe4d(%rip),%xmm0
ucomisd %xmm3,%xmm0
movapd %xmm2,0x30(%rsp)
jbe    1562 <th_Hyper1F1GG+0x422>
movapd 0xe8d(%rip),%xmm6
unpcklpd %xmm1,%xmm6
movapd %xmm8,%xmm0
unpcklpd %xmm8,%xmm0
subpd  %xmm0,%xmm6
movsd  0xe12(%rip),%xmm11
movsd  0xe19(%rip),%xmm12
mov    $0x1,%ebx
movapd 0xe4b(%rip),%xmm9
movapd 0xe12(%rip),%xmm10
lea    0xeb3(%rip),%r14
movapd %xmm11,%xmm5
movapd %xmm11,%xmm0
movapd %xmm11,%xmm13
jmp    1279 <th_Hyper1F1GG+0x139>
lea    0xe43(%rip),%rdi
xor    %eax,%eax
call   1030 <printf@plt>
xorpd  %xmm11,%xmm11
movapd %xmm11,%xmm0
add    $0x98,%rsp
pop    %rbx
pop    %r14
ret
movapd %xmm0,%xmm7
divsd  %xmm13,%xmm7
andpd  %xmm10,%xmm7
movapd %xmm4,%xmm12
add    $0x1,%ebx
ucomisd %xmm3,%xmm7
jbe    156b <th_Hyper1F1GG+0x42b>
movapd %xmm0,%xmm7
movapd %xmm6,%xmm0
unpckhpd %xmm6,%xmm0
mulsd  %xmm6,%xmm0
movapd %xmm5,%xmm4
mulsd  %xmm2,%xmm4
divsd  %xmm4,%xmm0
mulsd  %xmm7,%xmm0
addsd  %xmm0,%xmm13
addpd  %xmm9,%xmm6
addsd  %xmm11,%xmm5
movapd %xmm0,%xmm4
andpd  %xmm10,%xmm4
ucomisd %xmm12,%xmm4
jbe    1259 <th_Hyper1F1GG+0x119>
mov    %r14,%rdi
mov    %ebx,%esi
xor    %eax,%eax
movsd  %xmm13,0x10(%rsp)
movapd %xmm6,0x70(%rsp)
movsd  %xmm5,0x60(%rsp)
movsd  %xmm12,0x18(%rsp)
movapd %xmm0,0x50(%rsp)
call   1030 <printf@plt>
movapd 0x50(%rsp),%xmm0
movsd  0x18(%rsp),%xmm12
movsd  0x60(%rsp),%xmm5
movapd 0xd30(%rip),%xmm10
movapd 0xd57(%rip),%xmm9
movsd  0xcfe(%rip),%xmm11
movapd 0x70(%rsp),%xmm6
movsd  0x10(%rsp),%xmm13
movsd  0x8(%rsp),%xmm3
movapd 0x20(%rsp),%xmm1
movapd 0x30(%rsp),%xmm2
xorpd  %xmm7,%xmm7
jmp    126c <th_Hyper1F1GG+0x12c>
movsd  0xcd6(%rip),%xmm0
ucomisd %xmm3,%xmm0
jbe    153c <th_Hyper1F1GG+0x3fc>
movsd  0xcbb(%rip),%xmm10
movapd 0xcd2(%rip),%xmm9
movapd %xmm10,%xmm11
movapd %xmm10,%xmm7
movapd %xmm10,%xmm0
movapd %xmm10,%xmm4
cs nopw 0x0(%rax,%rax,1)
nopl   0x0(%rax)
movapd %xmm1,%xmm5
mulsd  %xmm4,%xmm5
movapd %xmm8,%xmm6
divsd  %xmm5,%xmm6
mulsd  %xmm6,%xmm0
mulsd  %xmm2,%xmm7
movapd %xmm0,%xmm5
mulsd  %xmm7,%xmm5
addsd  %xmm5,%xmm11
addsd  %xmm10,%xmm8
addsd  %xmm10,%xmm1
addsd  %xmm10,%xmm4
divsd  %xmm11,%xmm5
andpd  %xmm9,%xmm5
ucomisd %xmm3,%xmm5
ja     1380 <th_Hyper1F1GG+0x240>
jmp    1249 <th_Hyper1F1GG+0x109>
ucomisd %xmm1,%xmm8
jae    1556 <th_Hyper1F1GG+0x416>
xorpd  0xc63(%rip),%xmm2
movsd  0xc33(%rip),%xmm0
ucomisd %xmm3,%xmm0
movapd %xmm2,0x30(%rsp)
jbe    15e2 <th_Hyper1F1GG+0x4a2>
movapd %xmm8,%xmm5
subsd  %xmm1,%xmm5
movapd 0xc4a(%rip),%xmm6
movsd  %xmm8,%xmm6
unpcklpd %xmm2,%xmm9
movsd  0xbf7(%rip),%xmm14
movsd  0xbfe(%rip),%xmm13
mov    $0x1,%ebx
movapd 0xc30(%rip),%xmm11
movapd 0xbf7(%rip),%xmm12
lea    0xc98(%rip),%r14
movapd %xmm14,%xmm0
movapd %xmm14,%xmm10
movapd %xmm9,0x80(%rsp)
jmp    1476 <th_Hyper1F1GG+0x336>
movapd %xmm0,%xmm7
divsd  %xmm10,%xmm7
andpd  %xmm12,%xmm7
movapd %xmm4,%xmm13
add    $0x1,%ebx
ucomisd %xmm3,%xmm7
jbe    15eb <th_Hyper1F1GG+0x4ab>
movapd %xmm0,%xmm7
addsd  %xmm14,%xmm5
movapd %xmm9,%xmm0
movsd  %xmm5,%xmm0
mulpd  %xmm6,%xmm0
movapd %xmm0,%xmm4
unpckhpd %xmm0,%xmm4
divsd  %xmm4,%xmm0
mulsd  %xmm7,%xmm0
addsd  %xmm0,%xmm10
addpd  %xmm11,%xmm6
movapd %xmm0,%xmm4
andpd  %xmm12,%xmm4
ucomisd %xmm13,%xmm4
jbe    1456 <th_Hyper1F1GG+0x316>
mov    %r14,%rdi
mov    %ebx,%esi
xor    %eax,%eax
movapd %xmm5,0x70(%rsp)
movapd %xmm6,0x60(%rsp)
movsd  %xmm10,0x10(%rsp)
movsd  %xmm13,0x18(%rsp)
movapd %xmm0,0x50(%rsp)
call   1030 <printf@plt>
movapd 0x50(%rsp),%xmm0
movsd  0x18(%rsp),%xmm13
movapd 0xb38(%rip),%xmm12
movapd 0xb5f(%rip),%xmm11
movsd  0x10(%rsp),%xmm10
movsd  0xaff(%rip),%xmm14
movapd 0x80(%rsp),%xmm9
movapd 0x60(%rsp),%xmm6
movapd 0x70(%rsp),%xmm5
movsd  0x8(%rsp),%xmm3
movapd 0x20(%rsp),%xmm1
xorpd  %xmm7,%xmm7
jmp    1469 <th_Hyper1F1GG+0x329>
movsd  0xacb(%rip),%xmm11
jmp    1249 <th_Hyper1F1GG+0x109>
lea    0xb56(%rip),%rdi
jmp    123d <th_Hyper1F1GG+0xfd>
lea    0xba9(%rip),%rdi
jmp    123d <th_Hyper1F1GG+0xfd>
movsd  0xaa5(%rip),%xmm13
movsd  %xmm13,0x10(%rsp)
movapd %xmm1,%xmm0
call   1040 <th_Gamma@plt>
movsd  %xmm0,0x8(%rsp)
movapd 0x30(%rsp),%xmm0
call   1050 <exp@plt>
mulsd  0x8(%rsp),%xmm0
movsd  %xmm0,0x8(%rsp)
movapd 0x40(%rsp),%xmm0
call   1040 <th_Gamma@plt>
movsd  0x8(%rsp),%xmm1
divsd  %xmm0,%xmm1
movsd  %xmm1,0x8(%rsp)
movapd 0x40(%rsp),%xmm1
subsd  0x20(%rsp),%xmm1
movapd 0x30(%rsp),%xmm0
call   1060 <pow@plt>
movapd %xmm0,%xmm11
mulsd  0x8(%rsp),%xmm11
mulsd  0x10(%rsp),%xmm11
jmp    1249 <th_Hyper1F1GG+0x109>
movsd  0xa25(%rip),%xmm10
movsd  %xmm10,0x10(%rsp)
movapd %xmm1,%xmm0
call   1040 <th_Gamma@plt>
mulsd  0x10(%rsp),%xmm0
movsd  %xmm0,0x8(%rsp)
movapd 0x20(%rsp),%xmm0
subsd  0x40(%rsp),%xmm0
call   1040 <th_Gamma@plt>
movsd  %xmm0,0x20(%rsp)
movapd 0x30(%rsp),%xmm0
movapd 0x40(%rsp),%xmm1
call   1060 <pow@plt>
movsd  0x8(%rsp),%xmm11
mulsd  0x20(%rsp),%xmm0
divsd  %xmm0,%xmm11
jmp    1249 <th_Hyper1F1GG+0x109>

LLVM IR (-O0):
@.str = [39 x i8] c"\0A\0A!!In th_Hyper1F1GG b<=0; 0 returned\00"
@.str.1 = [49 x i8] c"\0A\0A!!In th_Hyper1F1GG asymptotic a<=0; 0 returned\00"
@.str.2 = [46 x i8] c"\0A\0A!!In th_Hyper1F1GG diverging after %i terms\00"
@.str.3 = [50 x i8] c"\0A\0A!!In asymptotic th_Hyper1F1GG b<=a; 0 returned\00"
define double @th_Hyper1F1GG(double %0, double %1, double %2, double %3) {
%5 = alloca double
%6 = alloca double
%7 = alloca double
%8 = alloca double
%9 = alloca double
%10 = alloca double
%11 = alloca double
%12 = alloca double
%13 = alloca double
%14 = alloca double
%15 = alloca double
%16 = alloca double
%17 = alloca double
%18 = alloca double
%19 = alloca double
%20 = alloca double
%21 = alloca double
%22 = alloca double
%23 = alloca double
%24 = alloca double
%25 = alloca double
%26 = alloca double
%27 = alloca i32
store double %0, double* %6
store double %1, double* %7
store double %2, double* %8
store double %3, double* %9
%28 = load double, double* %6
%29 = load double, double* %7
%30 = fcmp oeq double %28, %29
br i1 %30, label %31, label %34
31: ; preds = %4
%32 = load double, double* %8
%33 = call double @exp(double %32)
store double %33, double* %5
br label %220
34: ; preds = %4
%35 = load double, double* %7
%36 = fcmp ole double %35, 0.000000e+00
br i1 %36, label %37, label %39
37: ; preds = %34
%38 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([39 x i8], [39 x i8]* @.str, i64 0, i64 0))
store double 0.000000e+00, double* %5
br label %220
39: ; preds = %34
%40 = load double, double* %9
%41 = fmul double 1.000000e-01, %40
store double %41, double* %17
%42 = load double, double* %8
%43 = call double @llvm.fabs.f64(double %42)
%44 = fcmp ole double %43, 5.000000e+01
br i1 %44, label %45, label %81
45: ; preds = %39
store double 1.000000e+00, double* %10
store double 1.000000e+01, double* %11
%46 = load double, double* %6
store double %46, double* %12
%47 = load double, double* %7
store double %47, double* %13
store double 1.000000e+00, double* %14
store double 1.000000e+00, double* %15
store double 1.000000e+00, double* %16
br label %48
48: ; preds = %52, %45
%49 = load double, double* %11
%50 = load double, double* %17
%51 = fcmp ogt double %49, %50
br i1 %51, label %52, label %79
52: ; preds = %48
%53 = load double, double* %12
%54 = load double, double* %13
%55 = load double, double* %14
%56 = fmul double %54, %55
%57 = fdiv double %53, %56
%58 = load double, double* %15
%59 = fmul double %58, %57
store double %59, double* %15
%60 = load double, double* %8
%61 = load double, double* %16
%62 = fmul double %61, %60
store double %62, double* %16
%63 = load double, double* %15
%64 = load double, double* %16
%65 = fmul double %63, %64
store double %65, double* %18
%66 = load double, double* %18
%67 = load double, double* %10
%68 = fadd double %67, %66
store double %68, double* %10
%69 = load double, double* %12
%70 = fadd double %69, 1.000000e+00
store double %70, double* %12
%71 = load double, double* %13
%72 = fadd double %71, 1.000000e+00
store double %72, double* %13
%73 = load double, double* %14
%74 = fadd double %73, 1.000000e+00
store double %74, double* %14
%75 = load double, double* %18
%76 = load double, double* %10
%77 = fdiv double %75, %76
%78 = call double @llvm.fabs.f64(double %77)
store double %78, double* %11
br label %48
79: ; preds = %48
%80 = load double, double* %10
store double %80, double* %5
br label %220
81: ; preds = %39
%82 = load double, double* %8
%83 = fcmp ogt double %82, 5.000000e+01
br i1 %83, label %84, label %152
84: ; preds = %81
%85 = load double, double* %6
%86 = fcmp ole double %85, 0.000000e+00
br i1 %86, label %87, label %89
87: ; preds = %84
%88 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([49 x i8], [49 x i8]* @.str.1, i64 0, i64 0))
store double 0.000000e+00, double* %5
br label %220
89: ; preds = %84
store i32 0, i32* %27
store double 1.000000e+00, double* %19
%90 = load double, double* %7
%91 = load double, double* %6
%92 = fsub double %90, %91
store double %92, double* %20
%93 = load double, double* %6
%94 = fsub double 1.000000e+00, %93
store double %94, double* %21
store double 1.000000e+00, double* %18
store double 1.000000e+02, double* %22
store double 1.000000e+00, double* %10
store double 1.000000e+01, double* %11
br label %95
95: ; preds = %134, %89
%96 = load double, double* %11
%97 = load double, double* %17
%98 = fcmp ogt double %96, %97
br i1 %98, label %99, label %135
99: ; preds = %95
%100 = load i32, i32* %27
%101 = add nsw i32 %100, 1
store i32 %101, i32* %27
%102 = load double, double* %20
%103 = load double, double* %21
%104 = fmul double %102, %103
%105 = load double, double* %19
%106 = load double, double* %8
%107 = fmul double %105, %106
%108 = fdiv double %104, %107
%109 = load double, double* %18
%110 = fmul double %109, %108
store double %110, double* %18
%111 = load double, double* %18
%112 = load double, double* %10
%113 = fadd double %112, %111
store double %113, double* %10
%114 = load double, double* %20
%115 = fadd double %114, 1.000000e+00
store double %115, double* %20
%116 = load double, double* %21
%117 = fadd double %116, 1.000000e+00
store double %117, double* %21
%118 = load double, double* %19
%119 = fadd double %118, 1.000000e+00
store double %119, double* %19
%120 = load double, double* %18
%121 = load double, double* %10
%122 = fdiv double %120, %121
%123 = call double @llvm.fabs.f64(double %122)
store double %123, double* %11
%124 = load double, double* %18
%125 = call double @llvm.fabs.f64(double %124)
store double %125, double* %23
%126 = load double, double* %23
%127 = load double, double* %22
%128 = fcmp ogt double %126, %127
br i1 %128, label %129, label %132
129: ; preds = %99
%130 = load i32, i32* %27
%131 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([46 x i8], [46 x i8]* @.str.2, i64 0, i64 0), i32 %130)
store double 0.000000e+00, double* %11
br label %134
132: ; preds = %99
%133 = load double, double* %23
store double %133, double* %22
br label %134
134: ; preds = %132, %129
br label %95
135: ; preds = %95
%136 = load double, double* %7
%137 = call double @th_Gamma(double %136)
%138 = load double, double* %8
%139 = call double @exp(double %138)
%140 = fmul double %137, %139
%141 = load double, double* %6
%142 = call double @th_Gamma(double %141)
%143 = fdiv double %140, %142
%144 = load double, double* %8
%145 = load double, double* %6
%146 = load double, double* %7
%147 = fsub double %145, %146
%148 = call double @pow(double %144, double %147)
%149 = fmul double %143, %148
%150 = load double, double* %10
%151 = fmul double %149, %150
store double %151, double* %5
br label %220
152: ; preds = %81
%153 = load double, double* %7
%154 = load double, double* %6
%155 = fcmp ole double %153, %154
br i1 %155, label %156, label %158
156: ; preds = %152
%157 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([50 x i8], [50 x i8]* @.str.3, i64 0, i64 0))
store double 0.000000e+00, double* %5
br label %220
158: ; preds = %152
%159 = load double, double* %8
%160 = fneg double %159
store double %160, double* %26
store i32 0, i32* %27
store double 1.000000e+00, double* %19
%161 = load double, double* %6
%162 = load double, double* %7
%163 = fsub double %161, %162
%164 = fadd double %163, 1.000000e+00
store double %164, double* %25
%165 = load double, double* %6
store double %165, double* %24
store double 1.000000e+00, double* %18
store double 1.000000e+02, double* %22
store double 1.000000e+00, double* %10
store double 1.000000e+01, double* %11
br label %166
166: ; preds = %205, %158
%167 = load double, double* %11
%168 = load double, double* %17
%169 = fcmp ogt double %167, %168
br i1 %169, label %170, label %206
170: ; preds = %166
%171 = load i32, i32* %27
%172 = add nsw i32 %171, 1
store i32 %172, i32* %27
%173 = load double, double* %24
%174 = load double, double* %25
%175 = fmul double %173, %174
%176 = load double, double* %19
%177 = load double, double* %26
%178 = fmul double %176, %177
%179 = fdiv double %175, %178
%180 = load double, double* %18
%181 = fmul double %180, %179
store double %181, double* %18
%182 = load double, double* %18
%183 = load double, double* %10
%184 = fadd double %183, %182
store double %184, double* %10
%185 = load double, double* %24
%186 = fadd double %185, 1.000000e+00
store double %186, double* %24
%187 = load double, double* %25
%188 = fadd double %187, 1.000000e+00
store double %188, double* %25
%189 = load double, double* %19
%190 = fadd double %189, 1.000000e+00
store double %190, double* %19
%191 = load double, double* %18
%192 = load double, double* %10
%193 = fdiv double %191, %192
%194 = call double @llvm.fabs.f64(double %193)
store double %194, double* %11
%195 = load double, double* %18
%196 = call double @llvm.fabs.f64(double %195)
store double %196, double* %23
%197 = load double, double* %23
%198 = load double, double* %22
%199 = fcmp ogt double %197, %198
br i1 %199, label %200, label %203
200: ; preds = %170
%201 = load i32, i32* %27
%202 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([46 x i8], [46 x i8]* @.str.2, i64 0, i64 0), i32 %201)
store double 0.000000e+00, double* %11
br label %205
203: ; preds = %170
%204 = load double, double* %23
store double %204, double* %22
br label %205
205: ; preds = %203, %200
br label %166
206: ; preds = %166
%207 = load double, double* %7
%208 = call double @th_Gamma(double %207)
%209 = load double, double* %10
%210 = fmul double %208, %209
%211 = load double, double* %7
%212 = load double, double* %6
%213 = fsub double %211, %212
%214 = call double @th_Gamma(double %213)
%215 = load double, double* %26
%216 = load double, double* %6
%217 = call double @pow(double %215, double %216)
%218 = fmul double %214, %217
%219 = fdiv double %210, %218
store double %219, double* %5
br label %220
220: ; preds = %206, %156, %135, %87, %79, %37, %31
%221 = load double, double* %5
ret double %221
}

LLVM IR (-O2):
@.str = [39 x i8] c"\0A\0A!!In th_Hyper1F1GG b<=0; 0 returned\00"
@.str.1 = [49 x i8] c"\0A\0A!!In th_Hyper1F1GG asymptotic a<=0; 0 returned\00"
@.str.2 = [46 x i8] c"\0A\0A!!In th_Hyper1F1GG diverging after %i terms\00"
@.str.3 = [50 x i8] c"\0A\0A!!In asymptotic th_Hyper1F1GG b<=a; 0 returned\00"
define double @th_Hyper1F1GG(double %0, double %1, double %2, double %3) {
%5 = fcmp oeq double %0, %1
br i1 %5, label %6, label %8
6: ; preds = %4
%7 = tail call double @exp(double %2)
br label %137
8: ; preds = %4
%9 = fcmp ugt double %1, 0.000000e+00
br i1 %9, label %12, label %10
10: ; preds = %8
%11 = tail call i32 (i8*, ...) @printf(i8* dereferenceable(1) getelementptr inbounds ([39 x i8], [39 x i8]* @.str, i64 0, i64 0))
br label %137
12: ; preds = %8
%13 = fmul double %3, 1.000000e-01
%14 = tail call double @llvm.fabs.f64(double %2)
%15 = fcmp ugt double %14, 5.000000e+01
br i1 %15, label %37, label %16
16: ; preds = %12
%17 = fcmp olt double %13, 1.000000e+01
br i1 %17, label %18, label %137
18: ; preds = %16, %18
%19 = phi double [ %30, %18 ], [ 1.000000e+00, %16 ]
%20 = phi double [ %28, %18 ], [ 1.000000e+00, %16 ]
%21 = phi double [ %27, %18 ], [ 1.000000e+00, %16 ]
%22 = phi double [ %33, %18 ], [ 1.000000e+00, %16 ]
%23 = phi double [ %32, %18 ], [ %1, %16 ]
%24 = phi double [ %31, %18 ], [ %0, %16 ]
%25 = fmul double %23, %22
%26 = fdiv double %24, %25
%27 = fmul double %21, %26
%28 = fmul double %20, %2
%29 = fmul double %27, %28
%30 = fadd double %19, %29
%31 = fadd double %24, 1.000000e+00
%32 = fadd double %23, 1.000000e+00
%33 = fadd double %22, 1.000000e+00
%34 = fdiv double %29, %30
%35 = tail call double @llvm.fabs.f64(double %34)
%36 = fcmp ogt double %35, %13
br i1 %36, label %18, label %137
37: ; preds = %12
%38 = fcmp ogt double %2, 5.000000e+01
br i1 %38, label %39, label %89
39: ; preds = %37
%40 = fcmp ugt double %0, 0.000000e+00
br i1 %40, label %43, label %41
41: ; preds = %39
%42 = tail call i32 (i8*, ...) @printf(i8* dereferenceable(1) getelementptr inbounds ([49 x i8], [49 x i8]* @.str.1, i64 0, i64 0))
br label %137
43: ; preds = %39
%44 = fcmp olt double %13, 1.000000e+01
br i1 %44, label %45, label %78
45: ; preds = %43
%46 = insertelement <2 x double> <double 1.000000e+00, double poison>, double %1, i64 1
%47 = insertelement <2 x double> poison, double %0, i64 0
%48 = shufflevector <2 x double> %47, <2 x double> poison, <2 x i32> zeroinitializer
%49 = fsub <2 x double> %46, %48
br label %50
50: ; preds = %45, %74
%51 = phi i32 [ %57, %74 ], [ 0, %45 ]
%52 = phi double [ %76, %74 ], [ 1.000000e+02, %45 ]
%53 = phi double [ %66, %74 ], [ 1.000000e+00, %45 ]
%54 = phi double [ %63, %74 ], [ 1.000000e+00, %45 ]
%55 = phi double [ %64, %74 ], [ 1.000000e+00, %45 ]
%56 = phi <2 x double> [ %65, %74 ], [ %49, %45 ]
%57 = add nuw nsw i32 %51, 1
%58 = shufflevector <2 x double> %56, <2 x double> poison, <2 x i32> <i32 1, i32 undef>
%59 = fmul <2 x double> %58, %56
%60 = extractelement <2 x double> %59, i64 0
%61 = fmul double %53, %2
%62 = fdiv double %60, %61
%63 = fmul double %54, %62
%64 = fadd double %55, %63
%65 = fadd <2 x double> %56, <double 1.000000e+00, double 1.000000e+00>
%66 = fadd double %53, 1.000000e+00
%67 = tail call double @llvm.fabs.f64(double %63)
%68 = fcmp ogt double %67, %52
br i1 %68, label %69, label %71
69: ; preds = %50
%70 = tail call i32 (i8*, ...) @printf(i8* dereferenceable(1) getelementptr inbounds ([46 x i8], [46 x i8]* @.str.2, i64 0, i64 0), i32 %57)
br label %74
71: ; preds = %50
%72 = fdiv double %63, %64
%73 = tail call double @llvm.fabs.f64(double %72)
br label %74
74: ; preds = %71, %69
%75 = phi double [ 0.000000e+00, %69 ], [ %73, %71 ]
%76 = phi double [ %52, %69 ], [ %67, %71 ]
%77 = fcmp ogt double %75, %13
br i1 %77, label %50, label %78
78: ; preds = %74, %43
%79 = phi double [ 1.000000e+00, %43 ], [ %64, %74 ]
%80 = tail call double @th_Gamma(double %1)
%81 = tail call double @exp(double %2)
%82 = fmul double %80, %81
%83 = tail call double @th_Gamma(double %0)
%84 = fdiv double %82, %83
%85 = fsub double %0, %1
%86 = tail call double @pow(double %2, double %85)
%87 = fmul double %84, %86
%88 = fmul double %79, %87
br label %137
89: ; preds = %37
%90 = fcmp ugt double %1, %0
br i1 %90, label %93, label %91
91: ; preds = %89
%92 = tail call i32 (i8*, ...) @printf(i8* dereferenceable(1) getelementptr inbounds ([50 x i8], [50 x i8]* @.str.3, i64 0, i64 0))
br label %137
93: ; preds = %89
%94 = fneg double %2
%95 = fcmp olt double %13, 1.000000e+01
br i1 %95, label %96, label %128
96: ; preds = %93
%97 = fsub double %0, %1
%98 = insertelement <2 x double> <double poison, double 1.000000e+00>, double %0, i64 0
%99 = insertelement <2 x double> poison, double %94, i64 1
br label %100
100: ; preds = %96, %124
%101 = phi double [ %107, %124 ], [ %97, %96 ]
%102 = phi i32 [ %108, %124 ], [ 0, %96 ]
%103 = phi double [ %126, %124 ], [ 1.000000e+02, %96 ]
%104 = phi double [ %114, %124 ], [ 1.000000e+00, %96 ]
%105 = phi double [ %115, %124 ], [ 1.000000e+00, %96 ]
%106 = phi <2 x double> [ %116, %124 ], [ %98, %96 ]
%107 = fadd double %101, 1.000000e+00
%108 = add nuw nsw i32 %102, 1
%109 = insertelement <2 x double> %99, double %107, i64 0
%110 = fmul <2 x double> %106, %109
%111 = extractelement <2 x double> %110, i64 0
%112 = extractelement <2 x double> %110, i64 1
%113 = fdiv double %111, %112
%114 = fmul double %104, %113
%115 = fadd double %105, %114
%116 = fadd <2 x double> %106, <double 1.000000e+00, double 1.000000e+00>
%117 = tail call double @llvm.fabs.f64(double %114)
%118 = fcmp ogt double %117, %103
br i1 %118, label %119, label %121
119: ; preds = %100
%120 = tail call i32 (i8*, ...) @printf(i8* dereferenceable(1) getelementptr inbounds ([46 x i8], [46 x i8]* @.str.2, i64 0, i64 0), i32 %108)
br label %124
121: ; preds = %100
%122 = fdiv double %114, %115
%123 = tail call double @llvm.fabs.f64(double %122)
br label %124
124: ; preds = %121, %119
%125 = phi double [ 0.000000e+00, %119 ], [ %123, %121 ]
%126 = phi double [ %103, %119 ], [ %117, %121 ]
%127 = fcmp ogt double %125, %13
br i1 %127, label %100, label %128
128: ; preds = %124, %93
%129 = phi double [ 1.000000e+00, %93 ], [ %115, %124 ]
%130 = tail call double @th_Gamma(double %1)
%131 = fmul double %129, %130
%132 = fsub double %1, %0
%133 = tail call double @th_Gamma(double %132)
%134 = tail call double @pow(double %94, double %0)
%135 = fmul double %133, %134
%136 = fdiv double %131, %135
br label %137
137: ; preds = %18, %16, %128, %91, %78, %41, %10, %6
%138 = phi double [ %7, %6 ], [ 0.000000e+00, %10 ], [ 0.000000e+00, %41 ], [ %88, %78 ], [ 0.000000e+00, %91 ], [ %136, %128 ], [ 1.000000e+00, %16 ], [ %30, %18 ]
ret double %138
}