#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 alphaB_PPB(double);
double exp(double);
double pow(int, double);
double sqrt(double);
double rec_HPeebles_dxedlna(double xe, double nH, double H, double TM,
                            double TR, double energy_rate) {
  double RLya, alphaB, four_betaB, C;
  double chi_ion_H;
  RLya = 4.662899067555897e15 * H / nH / (1. - xe);
  alphaB = alphaB_PPB(TM);
  four_betaB = 3.016103031869581e21 * TR * sqrt(TR) *
               exp(-0.25 * 13.598286071938324 / TR) * alphaB;
  C = (3. * RLya + 8.2206) / (3. * RLya + 8.2206 + four_betaB);
  if (xe < 1.)
    chi_ion_H = 0.369202 * pow(1. - pow(xe, 0.463929), 1.70237);
  else
    chi_ion_H = 0.;
  return (-nH * xe * xe * alphaB +
          four_betaB * (1. - xe) * exp(-10.198714553953742 / TR)) *
             C / H +
         chi_ion_H / nH * energy_rate *
             (1. / 13.598286071938324 + (1. - C) / 10.198714553953742) / H;
}


x86 assembly (clang, -O0):
<rec_HPeebles_dxedlna>:
push   %rbp
mov    %rsp,%rbp
sub    $0x80,%rsp
movsd  %xmm0,-0x8(%rbp)
movsd  %xmm1,-0x10(%rbp)
movsd  %xmm2,-0x18(%rbp)
movsd  %xmm3,-0x20(%rbp)
movsd  %xmm4,-0x28(%rbp)
movsd  %xmm5,-0x30(%rbp)
movsd  0xeb7(%rip),%xmm0
mulsd  -0x18(%rbp),%xmm0
divsd  -0x10(%rbp),%xmm0
movsd  0xe7d(%rip),%xmm1
subsd  -0x8(%rbp),%xmm1
divsd  %xmm1,%xmm0
movsd  %xmm0,-0x38(%rbp)
movsd  -0x20(%rbp),%xmm0
call   1060 <alphaB_PPB@plt>
movsd  %xmm0,-0x40(%rbp)
movsd  0xe78(%rip),%xmm0
mulsd  -0x28(%rbp),%xmm0
movsd  %xmm0,-0x68(%rbp)
movsd  -0x28(%rbp),%xmm0
call   1050 <sqrt@plt>
movaps %xmm0,%xmm1
movsd  -0x68(%rbp),%xmm0
mulsd  %xmm1,%xmm0
movsd  %xmm0,-0x60(%rbp)
movsd  0xe43(%rip),%xmm0
divsd  -0x28(%rbp),%xmm0
call   1030 <exp@plt>
movaps %xmm0,%xmm1
movsd  -0x60(%rbp),%xmm0
mulsd  %xmm1,%xmm0
mulsd  -0x40(%rbp),%xmm0
movsd  %xmm0,-0x48(%rbp)
movsd  -0x38(%rbp),%xmm0
movsd  0xe06(%rip),%xmm1
mulsd  %xmm1,%xmm0
movsd  0xe02(%rip),%xmm1
addsd  %xmm1,%xmm0
movsd  -0x38(%rbp),%xmm1
movsd  0xde9(%rip),%xmm2
mulsd  %xmm2,%xmm1
movsd  0xde5(%rip),%xmm2
addsd  %xmm2,%xmm1
addsd  -0x48(%rbp),%xmm1
divsd  %xmm1,%xmm0
movsd  %xmm0,-0x50(%rbp)
movsd  0xdbb(%rip),%xmm0
ucomisd -0x8(%rbp),%xmm0
jbe    129b <rec_HPeebles_dxedlna+0x15b>
cvttsd2si -0x8(%rbp),%edi
movsd  0xde3(%rip),%xmm0
call   1040 <pow@plt>
movaps %xmm0,%xmm1
movsd  0xd93(%rip),%xmm0
subsd  %xmm1,%xmm0
cvttsd2si %xmm0,%edi
movsd  0xdbb(%rip),%xmm0
call   1040 <pow@plt>
movaps %xmm0,%xmm1
movsd  0xda3(%rip),%xmm0
mulsd  %xmm1,%xmm0
movsd  %xmm0,-0x58(%rbp)
jmp    12a3 <rec_HPeebles_dxedlna+0x163>
xorps  %xmm0,%xmm0
movsd  %xmm0,-0x58(%rbp)
movsd  -0x10(%rbp),%xmm0
movq   %xmm0,%rax
movabs $0x8000000000000000,%rcx
xor    %rcx,%rax
movq   %rax,%xmm0
mulsd  -0x8(%rbp),%xmm0
mulsd  -0x8(%rbp),%xmm0
movsd  %xmm0,-0x70(%rbp)
movsd  -0x40(%rbp),%xmm0
movsd  %xmm0,-0x78(%rbp)
movsd  -0x48(%rbp),%xmm0
movsd  0xd1b(%rip),%xmm1
subsd  -0x8(%rbp),%xmm1
mulsd  %xmm1,%xmm0
movsd  %xmm0,-0x80(%rbp)
movsd  0xd5d(%rip),%xmm0
divsd  -0x28(%rbp),%xmm0
call   1030 <exp@plt>
movsd  -0x80(%rbp),%xmm1
movsd  -0x78(%rbp),%xmm2
movaps %xmm0,%xmm3
movsd  -0x70(%rbp),%xmm0
mulsd  %xmm3,%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
mulsd  -0x50(%rbp),%xmm0
divsd  -0x18(%rbp),%xmm0
movsd  -0x58(%rbp),%xmm1
divsd  -0x10(%rbp),%xmm1
mulsd  -0x30(%rbp),%xmm1
movsd  0xcbc(%rip),%xmm3
subsd  -0x50(%rbp),%xmm3
movsd  0xcff(%rip),%xmm2
divsd  %xmm2,%xmm3
movsd  0xceb(%rip),%xmm2
addsd  %xmm3,%xmm2
mulsd  %xmm2,%xmm1
divsd  -0x18(%rbp),%xmm1
addsd  %xmm1,%xmm0
add    $0x80,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<rec_HPeebles_dxedlna>:
sub    $0x78,%rsp
movsd  %xmm5,0x48(%rsp)
movsd  %xmm4,0x8(%rsp)
movapd %xmm0,%xmm5
movsd  0xea4(%rip),%xmm4
movapd %xmm2,0x60(%rsp)
mulsd  %xmm2,%xmm4
movsd  %xmm1,0x28(%rsp)
divsd  %xmm1,%xmm4
movsd  0xe90(%rip),%xmm0
movsd  %xmm5,0x18(%rsp)
subsd  %xmm5,%xmm0
movsd  %xmm0,0x10(%rsp)
divsd  %xmm0,%xmm4
movapd %xmm4,0x30(%rsp)
movaps %xmm3,%xmm0
call   1060 <alphaB_PPB@plt>
movsd  0x8(%rsp),%xmm1
movsd  %xmm0,0x20(%rsp)
movsd  0xe62(%rip),%xmm0
mulsd  %xmm1,%xmm0
movsd  %xmm0,(%rsp)
xorpd  %xmm2,%xmm2
xorpd  %xmm0,%xmm0
movapd %xmm0,0x50(%rsp)
ucomisd %xmm2,%xmm1
jb     11d4 <rec_HPeebles_dxedlna+0x94>
xorps  %xmm0,%xmm0
sqrtsd %xmm1,%xmm0
jmp    11e3 <rec_HPeebles_dxedlna+0xa3>
movapd %xmm1,%xmm0
call   1050 <sqrt@plt>
movsd  0x8(%rsp),%xmm1
movsd  (%rsp),%xmm2
mulsd  %xmm0,%xmm2
movsd  %xmm2,(%rsp)
movsd  0xe1f(%rip),%xmm0
divsd  %xmm1,%xmm0
call   1030 <exp@plt>
movapd %xmm0,%xmm2
mulsd  (%rsp),%xmm2
mulsd  0x20(%rsp),%xmm2
movapd 0x30(%rsp),%xmm1
mulsd  0xe01(%rip),%xmm1
addsd  0xe01(%rip),%xmm1
movapd %xmm1,%xmm0
addsd  %xmm2,%xmm0
divsd  %xmm0,%xmm1
movapd %xmm1,0x30(%rsp)
movsd  0xdc7(%rip),%xmm0
movsd  0x18(%rsp),%xmm1
ucomisd %xmm1,%xmm0
jbe    1299 <rec_HPeebles_dxedlna+0x159>
cvttsd2si %xmm1,%edi
movsd  0xdd7(%rip),%xmm0
movsd  %xmm2,(%rsp)
call   1040 <pow@plt>
movsd  0xd9d(%rip),%xmm1
subsd  %xmm0,%xmm1
cvttsd2si %xmm1,%edi
movsd  0xdbd(%rip),%xmm0
call   1040 <pow@plt>
movsd  (%rsp),%xmm2
movsd  0x18(%rsp),%xmm1
mulsd  0xdad(%rip),%xmm0
movapd %xmm0,0x50(%rsp)
movsd  0x28(%rsp),%xmm0
mulsd  %xmm1,%xmm0
mulsd  %xmm1,%xmm0
movsd  %xmm0,(%rsp)
movsd  0x10(%rsp),%xmm0
mulsd  %xmm2,%xmm0
movsd  %xmm0,0x10(%rsp)
movsd  0xd84(%rip),%xmm0
divsd  0x8(%rsp),%xmm0
call   1030 <exp@plt>
mulsd  0x10(%rsp),%xmm0
movsd  (%rsp),%xmm1
mulsd  0x20(%rsp),%xmm1
subsd  %xmm1,%xmm0
movapd 0x50(%rsp),%xmm1
divsd  0x28(%rsp),%xmm1
mulsd  0x48(%rsp),%xmm1
unpcklpd %xmm0,%xmm1
movapd 0x30(%rsp),%xmm0
movsd  0xd00(%rip),%xmm2
subsd  %xmm0,%xmm2
divsd  0xd3c(%rip),%xmm2
addsd  0xd3c(%rip),%xmm2
unpcklpd %xmm0,%xmm2
mulpd  %xmm1,%xmm2
movapd 0x60(%rsp),%xmm0
unpcklpd %xmm0,%xmm0
divpd  %xmm0,%xmm2
movapd %xmm2,%xmm0
unpckhpd %xmm2,%xmm0
addsd  %xmm2,%xmm0
add    $0x78,%rsp
ret

LLVM IR (-O0):
define double @rec_HPeebles_dxedlna(double %0, double %1, double %2, double %3, double %4, double %5) {
%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
store double %0, double* %7
store double %1, double* %8
store double %2, double* %9
store double %3, double* %10
store double %4, double* %11
store double %5, double* %12
%18 = load double, double* %9
%19 = fmul double 0x433090E1CA8B9039, %18
%20 = load double, double* %8
%21 = fdiv double %19, %20
%22 = load double, double* %7
%23 = fsub double 1.000000e+00, %22
%24 = fdiv double %21, %23
store double %24, double* %13
%25 = load double, double* %10
%26 = call double @alphaB_PPB(double %25)
store double %26, double* %14
%27 = load double, double* %11
%28 = fmul double 0x4464701ACFEF92A1, %27
%29 = load double, double* %11
%30 = call double @sqrt(double %29)
%31 = fmul double %28, %30
%32 = load double, double* %11
%33 = fdiv double 0xC00B32528D51413B, %32
%34 = call double @exp(double %33)
%35 = fmul double %31, %34
%36 = load double, double* %14
%37 = fmul double %35, %36
store double %37, double* %15
%38 = load double, double* %13
%39 = call double @llvm.fmuladd.f64(double 3.000000e+00, double %38, double 8.220600e+00)
%40 = load double, double* %13
%41 = call double @llvm.fmuladd.f64(double 3.000000e+00, double %40, double 8.220600e+00)
%42 = load double, double* %15
%43 = fadd double %41, %42
%44 = fdiv double %39, %43
store double %44, double* %16
%45 = load double, double* %7
%46 = fcmp olt double %45, 1.000000e+00
br i1 %46, label %47, label %55
47: ; preds = %6
%48 = load double, double* %7
%49 = fptosi double %48 to i32
%50 = call double @pow(i32 %49, double 4.639290e-01)
%51 = fsub double 1.000000e+00, %50
%52 = fptosi double %51 to i32
%53 = call double @pow(i32 %52, double 1.702370e+00)
%54 = fmul double 3.692020e-01, %53
store double %54, double* %17
br label %56
55: ; preds = %6
store double 0.000000e+00, double* %17
br label %56
56: ; preds = %55, %47
%57 = load double, double* %8
%58 = fneg double %57
%59 = load double, double* %7
%60 = fmul double %58, %59
%61 = load double, double* %7
%62 = fmul double %60, %61
%63 = load double, double* %14
%64 = load double, double* %15
%65 = load double, double* %7
%66 = fsub double 1.000000e+00, %65
%67 = fmul double %64, %66
%68 = load double, double* %11
%69 = fdiv double 0xC02465BDE9FCF0EC, %68
%70 = call double @exp(double %69)
%71 = fmul double %67, %70
%72 = call double @llvm.fmuladd.f64(double %62, double %63, double %71)
%73 = load double, double* %16
%74 = fmul double %72, %73
%75 = load double, double* %9
%76 = fdiv double %74, %75
%77 = load double, double* %17
%78 = load double, double* %8
%79 = fdiv double %77, %78
%80 = load double, double* %12
%81 = fmul double %79, %80
%82 = load double, double* %16
%83 = fsub double 1.000000e+00, %82
%84 = fdiv double %83, 0x402465BDE9FCF0EC
%85 = fadd double 0x3FB2D36E4F11087F, %84
%86 = fmul double %81, %85
%87 = load double, double* %9
%88 = fdiv double %86, %87
%89 = fadd double %76, %88
ret double %89
}

LLVM IR (-O2):
define double @rec_HPeebles_dxedlna(double %0, double %1, double %2, double %3, double %4, double %5) {
%7 = fmul double %2, 0x433090E1CA8B9039
%8 = fdiv double %7, %1
%9 = fsub double 1.000000e+00, %0
%10 = fdiv double %8, %9
%11 = tail call double @alphaB_PPB(double %3)
%12 = fmul double %4, 0x4464701ACFEF92A1
%13 = tail call double @sqrt(double %4)
%14 = fmul double %12, %13
%15 = fdiv double 0xC00B32528D51413B, %4
%16 = tail call double @exp(double %15)
%17 = fmul double %14, %16
%18 = fmul double %11, %17
%19 = tail call double @llvm.fmuladd.f64(double %10, double 3.000000e+00, double 8.220600e+00)
%20 = fadd double %19, %18
%21 = fdiv double %19, %20
%22 = fcmp olt double %0, 1.000000e+00
br i1 %22, label %23, label %30
23: ; preds = %6
%24 = fptosi double %0 to i32
%25 = tail call double @pow(i32 %24, double 4.639290e-01)
%26 = fsub double 1.000000e+00, %25
%27 = fptosi double %26 to i32
%28 = tail call double @pow(i32 %27, double 1.702370e+00)
%29 = fmul double %28, 3.692020e-01
br label %30
30: ; preds = %6, %23
%31 = phi double [ %29, %23 ], [ 0.000000e+00, %6 ]
%32 = fneg double %1
%33 = fmul double %32, %0
%34 = fmul double %33, %0
%35 = fmul double %9, %18
%36 = fdiv double 0xC02465BDE9FCF0EC, %4
%37 = tail call double @exp(double %36)
%38 = fmul double %35, %37
%39 = tail call double @llvm.fmuladd.f64(double %34, double %11, double %38)
%40 = fdiv double %31, %1
%41 = fmul double %40, %5
%42 = fsub double 1.000000e+00, %21
%43 = fdiv double %42, 0x402465BDE9FCF0EC
%44 = fadd double %43, 0x3FB2D36E4F11087F
%45 = insertelement <2 x double> poison, double %21, i64 1
%46 = insertelement <2 x double> %45, double %44, i64 0
%47 = insertelement <2 x double> poison, double %41, i64 0
%48 = insertelement <2 x double> %47, double %39, i64 1
%49 = fmul <2 x double> %46, %48
%50 = insertelement <2 x double> poison, double %2, i64 0
%51 = shufflevector <2 x double> %50, <2 x double> poison, <2 x i32> zeroinitializer
%52 = fdiv <2 x double> %49, %51
%53 = shufflevector <2 x double> %52, <2 x double> poison, <2 x i32> <i32 1, i32 undef>
%54 = fadd <2 x double> %52, %53
%55 = extractelement <2 x double> %54, i64 0
ret double %55
}