#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 const log(int);
double transverse_transport_electronic(double ZoA, double I, double aS,
                                       double mass, double kinetic, double nu) {
  const double momentum2 = kinetic * (kinetic + 2. * mass);
  const double E = kinetic + mass;
  const double Wr =
      2. * 0.510998910E-03 * momentum2 /
      (mass * mass + 0.510998910E-03 * (0.510998910E-03 + 2. * E));
  const double Wmax = (nu > Wr) ? Wr : nu;
  const double beta2 = momentum2 / (E * E);
  const double J = log(aS * Wmax / I) - beta2 * Wmax / Wr +
                   0.25 * Wmax * Wmax / (E * E) + 1 / aS;
  const double gamma = E / mass;
  const double lQ = log(1. + 2. * Wr / 0.510998910E-03);
  const double Delta = 7.2973525693E-03 / (2 * 3.14159265358979323846) *
                       (log(2. * gamma) - lQ / 3.) * lQ * lQ;
  return 2 * 3.14159265358979323846 * 2.817940285E-15 * 2.817940285E-15 *
         0.510998910E-03 * 0.510998910E-03 * 6.02214076E+23 * ZoA /
         (beta2 * 1E-03 * momentum2) * (J + Delta);
}


x86 assembly (clang, -O0):
<transverse_transport_electronic>:
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  -0x28(%rbp),%xmm0
movsd  -0x28(%rbp),%xmm2
movsd  -0x20(%rbp),%xmm1
addsd  %xmm1,%xmm1
addsd  %xmm2,%xmm1
mulsd  %xmm1,%xmm0
movsd  %xmm0,-0x38(%rbp)
movsd  -0x28(%rbp),%xmm0
addsd  -0x20(%rbp),%xmm0
movsd  %xmm0,-0x40(%rbp)
movsd  0xe98(%rip),%xmm0
mulsd  -0x38(%rbp),%xmm0
movsd  -0x20(%rbp),%xmm1
movsd  -0x20(%rbp),%xmm3
movsd  -0x40(%rbp),%xmm4
addsd  %xmm4,%xmm4
movsd  0xe70(%rip),%xmm2
addsd  %xmm2,%xmm4
movsd  0xe64(%rip),%xmm2
mulsd  %xmm4,%xmm2
mulsd  %xmm3,%xmm1
addsd  %xmm2,%xmm1
divsd  %xmm1,%xmm0
movsd  %xmm0,-0x48(%rbp)
movsd  -0x30(%rbp),%xmm0
ucomisd -0x48(%rbp),%xmm0
jbe    11d0 <transverse_transport_electronic+0xc0>
movsd  -0x48(%rbp),%xmm0
movsd  %xmm0,-0x80(%rbp)
jmp    11da <transverse_transport_electronic+0xca>
movsd  -0x30(%rbp),%xmm0
movsd  %xmm0,-0x80(%rbp)
movsd  -0x80(%rbp),%xmm0
movsd  %xmm0,-0x50(%rbp)
movsd  -0x38(%rbp),%xmm0
movsd  -0x40(%rbp),%xmm1
mulsd  -0x40(%rbp),%xmm1
divsd  %xmm1,%xmm0
movsd  %xmm0,-0x58(%rbp)
movsd  -0x18(%rbp),%xmm0
mulsd  -0x50(%rbp),%xmm0
divsd  -0x10(%rbp),%xmm0
cvttsd2si %xmm0,%edi
call   1030 <log@plt>
movsd  -0x58(%rbp),%xmm1
mulsd  -0x50(%rbp),%xmm1
divsd  -0x48(%rbp),%xmm1
subsd  %xmm1,%xmm0
movsd  0xe11(%rip),%xmm1
mulsd  -0x50(%rbp),%xmm1
mulsd  -0x50(%rbp),%xmm1
movsd  -0x40(%rbp),%xmm2
mulsd  -0x40(%rbp),%xmm2
divsd  %xmm2,%xmm1
addsd  %xmm1,%xmm0
movsd  0xde5(%rip),%xmm1
divsd  -0x18(%rbp),%xmm1
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x60(%rbp)
movsd  -0x40(%rbp),%xmm0
divsd  -0x20(%rbp),%xmm0
movsd  %xmm0,-0x68(%rbp)
movsd  0xdb8(%rip),%xmm1
mulsd  -0x48(%rbp),%xmm1
movsd  0xd7b(%rip),%xmm0
divsd  %xmm0,%xmm1
movsd  0xda7(%rip),%xmm0
addsd  %xmm1,%xmm0
cvttsd2si %xmm0,%edi
call   1030 <log@plt>
movsd  %xmm0,-0x70(%rbp)
movsd  0xd85(%rip),%xmm0
mulsd  -0x68(%rbp),%xmm0
cvttsd2si %xmm0,%edi
call   1030 <log@plt>
movaps %xmm0,%xmm1
movsd  -0x70(%rbp),%xmm0
movsd  0xd5f(%rip),%xmm2
divsd  %xmm2,%xmm0
subsd  %xmm0,%xmm1
movsd  0xd47(%rip),%xmm0
mulsd  %xmm1,%xmm0
mulsd  -0x70(%rbp),%xmm0
mulsd  -0x70(%rbp),%xmm0
movsd  %xmm0,-0x78(%rbp)
movsd  0xd24(%rip),%xmm0
mulsd  -0x8(%rbp),%xmm0
movsd  0xd0f(%rip),%xmm1
mulsd  -0x58(%rbp),%xmm1
mulsd  -0x38(%rbp),%xmm1
divsd  %xmm1,%xmm0
movsd  -0x60(%rbp),%xmm1
addsd  -0x78(%rbp),%xmm1
mulsd  %xmm1,%xmm0
add    $0x80,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<transverse_transport_electronic>:
sub    $0x88,%rsp
movapd %xmm2,0x60(%rsp)
movsd  %xmm0,0x28(%rsp)
movapd %xmm3,%xmm0
movapd %xmm3,%xmm6
addsd  %xmm3,%xmm6
movapd %xmm4,%xmm3
addsd  %xmm4,%xmm6
mulsd  %xmm4,%xmm6
addsd  %xmm0,%xmm3
movapd %xmm0,%xmm7
movsd  %xmm0,(%rsp)
movsd  0xeb0(%rip),%xmm0
mulsd  %xmm6,%xmm0
movapd %xmm6,%xmm8
movapd %xmm6,0x70(%rsp)
movapd %xmm3,%xmm4
movapd %xmm3,%xmm6
movsd  %xmm3,0x8(%rsp)
addsd  %xmm3,%xmm4
movsd  0xe8f(%rip),%xmm3
addsd  %xmm3,%xmm4
mulsd  %xmm3,%xmm4
movapd %xmm7,%xmm3
mulsd  %xmm7,%xmm3
addsd  %xmm4,%xmm3
mulsd  %xmm6,%xmm6
movapd %xmm6,0x10(%rsp)
movapd %xmm8,%xmm4
unpcklpd %xmm0,%xmm4
movapd %xmm6,%xmm0
unpcklpd %xmm3,%xmm0
divpd  %xmm0,%xmm4
movapd %xmm4,0x30(%rsp)
unpckhpd %xmm4,%xmm4
movapd %xmm4,0x50(%rsp)
movapd %xmm4,%xmm0
minsd  %xmm5,%xmm0
movapd %xmm0,0x40(%rsp)
mulsd  %xmm2,%xmm0
divsd  %xmm1,%xmm0
cvttsd2si %xmm0,%edi
call   1030 <log@plt>
movapd 0x30(%rsp),%xmm1
movapd 0x40(%rsp),%xmm4
mulsd  %xmm4,%xmm1
movapd 0x50(%rsp),%xmm3
divsd  %xmm3,%xmm1
subsd  %xmm1,%xmm0
movsd  0xe0f(%rip),%xmm2
mulsd  %xmm4,%xmm2
mulsd  %xmm4,%xmm2
movapd 0xe2f(%rip),%xmm1
unpcklpd %xmm2,%xmm1
movapd 0x60(%rsp),%xmm2
unpcklpd 0x10(%rsp),%xmm2
divpd  %xmm2,%xmm1
movapd %xmm1,%xmm2
unpckhpd %xmm1,%xmm2
addsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,0x10(%rsp)
movsd  0x8(%rsp),%xmm0
divsd  (%rsp),%xmm0
movsd  %xmm0,0x8(%rsp)
movapd %xmm3,%xmm0
addsd  %xmm3,%xmm0
divsd  0xdac(%rip),%xmm0
addsd  0xdb4(%rip),%xmm0
cvttsd2si %xmm0,%edi
call   1030 <log@plt>
movsd  %xmm0,(%rsp)
movsd  0x8(%rsp),%xmm0
addsd  %xmm0,%xmm0
cvttsd2si %xmm0,%edi
call   1030 <log@plt>
movsd  (%rsp),%xmm2
movapd %xmm2,%xmm1
divsd  0xd8a(%rip),%xmm1
addsd  %xmm1,%xmm0
mulsd  0xd86(%rip),%xmm0
mulsd  %xmm2,%xmm0
mulsd  %xmm2,%xmm0
movsd  0x28(%rsp),%xmm1
mulsd  0xd78(%rip),%xmm1
movapd 0x30(%rsp),%xmm2
mulsd  0xd72(%rip),%xmm2
addsd  0x10(%rsp),%xmm0
mulsd  0x70(%rsp),%xmm2
divsd  %xmm2,%xmm1
mulsd  %xmm1,%xmm0
add    $0x88,%rsp
ret

LLVM IR (-O0):
define double @transverse_transport_electronic(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
%18 = alloca double
%19 = alloca double
%20 = alloca double
%21 = 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
%22 = load double, double* %11
%23 = load double, double* %11
%24 = load double, double* %10
%25 = call double @llvm.fmuladd.f64(double 2.000000e+00, double %24, double %23)
%26 = fmul double %22, %25
store double %26, double* %13
%27 = load double, double* %11
%28 = load double, double* %10
%29 = fadd double %27, %28
store double %29, double* %14
%30 = load double, double* %13
%31 = fmul double 0x3F50BE91CDA9B5D6, %30
%32 = load double, double* %10
%33 = load double, double* %10
%34 = load double, double* %14
%35 = call double @llvm.fmuladd.f64(double 2.000000e+00, double %34, double 0x3F40BE91CDA9B5D6)
%36 = fmul double 0x3F40BE91CDA9B5D6, %35
%37 = call double @llvm.fmuladd.f64(double %32, double %33, double %36)
%38 = fdiv double %31, %37
store double %38, double* %15
%39 = load double, double* %12
%40 = load double, double* %15
%41 = fcmp ogt double %39, %40
br i1 %41, label %42, label %44
42: ; preds = %6
%43 = load double, double* %15
br label %46
44: ; preds = %6
%45 = load double, double* %12
br label %46
46: ; preds = %44, %42
%47 = phi double [ %43, %42 ], [ %45, %44 ]
store double %47, double* %16
%48 = load double, double* %13
%49 = load double, double* %14
%50 = load double, double* %14
%51 = fmul double %49, %50
%52 = fdiv double %48, %51
store double %52, double* %17
%53 = load double, double* %9
%54 = load double, double* %16
%55 = fmul double %53, %54
%56 = load double, double* %8
%57 = fdiv double %55, %56
%58 = fptosi double %57 to i32
%59 = call double @log(i32 %58)
%60 = load double, double* %17
%61 = load double, double* %16
%62 = fmul double %60, %61
%63 = load double, double* %15
%64 = fdiv double %62, %63
%65 = fsub double %59, %64
%66 = load double, double* %16
%67 = fmul double 2.500000e-01, %66
%68 = load double, double* %16
%69 = fmul double %67, %68
%70 = load double, double* %14
%71 = load double, double* %14
%72 = fmul double %70, %71
%73 = fdiv double %69, %72
%74 = fadd double %65, %73
%75 = load double, double* %9
%76 = fdiv double 1.000000e+00, %75
%77 = fadd double %74, %76
store double %77, double* %18
%78 = load double, double* %14
%79 = load double, double* %10
%80 = fdiv double %78, %79
store double %80, double* %19
%81 = load double, double* %15
%82 = fmul double 2.000000e+00, %81
%83 = fdiv double %82, 0x3F40BE91CDA9B5D6
%84 = fadd double 1.000000e+00, %83
%85 = fptosi double %84 to i32
%86 = call double @log(i32 %85)
store double %86, double* %20
%87 = load double, double* %19
%88 = fmul double 2.000000e+00, %87
%89 = fptosi double %88 to i32
%90 = call double @log(i32 %89)
%91 = load double, double* %20
%92 = fdiv double %91, 3.000000e+00
%93 = fsub double %90, %92
%94 = fmul double 0x3F53074E347B1358, %93
%95 = load double, double* %20
%96 = fmul double %94, %95
%97 = load double, double* %20
%98 = fmul double %96, %97
store double %98, double* %21
%99 = load double, double* %7
%100 = fmul double 0x3DA140C3477A7D6F, %99
%101 = load double, double* %17
%102 = fmul double %101, 1.000000e-03
%103 = load double, double* %13
%104 = fmul double %102, %103
%105 = fdiv double %100, %104
%106 = load double, double* %18
%107 = load double, double* %21
%108 = fadd double %106, %107
%109 = fmul double %105, %108
ret double %109
}

LLVM IR (-O2):
define double @transverse_transport_electronic(double %0, double %1, double %2, double %3, double %4, double %5) {
%7 = tail call double @llvm.fmuladd.f64(double %3, double 2.000000e+00, double %4)
%8 = fmul double %7, %4
%9 = fadd double %3, %4
%10 = fmul double %8, 0x3F50BE91CDA9B5D6
%11 = tail call double @llvm.fmuladd.f64(double %9, double 2.000000e+00, double 0x3F40BE91CDA9B5D6)
%12 = fmul double %11, 0x3F40BE91CDA9B5D6
%13 = tail call double @llvm.fmuladd.f64(double %3, double %3, double %12)
%14 = fmul double %9, %9
%15 = insertelement <2 x double> poison, double %8, i64 0
%16 = insertelement <2 x double> %15, double %10, i64 1
%17 = insertelement <2 x double> poison, double %14, i64 0
%18 = insertelement <2 x double> %17, double %13, i64 1
%19 = fdiv <2 x double> %16, %18
%20 = extractelement <2 x double> %19, i64 1
%21 = fcmp olt double %20, %5
%22 = select i1 %21, double %20, double %5
%23 = fmul double %22, %2
%24 = fdiv double %23, %1
%25 = fptosi double %24 to i32
%26 = tail call double @log(i32 %25)
%27 = extractelement <2 x double> %19, i64 0
%28 = fmul double %27, %22
%29 = fdiv double %28, %20
%30 = fsub double %26, %29
%31 = fmul double %22, 2.500000e-01
%32 = fmul double %22, %31
%33 = insertelement <2 x double> <double 1.000000e+00, double poison>, double %32, i64 1
%34 = insertelement <2 x double> poison, double %2, i64 0
%35 = insertelement <2 x double> %34, double %14, i64 1
%36 = fdiv <2 x double> %33, %35
%37 = extractelement <2 x double> %36, i64 1
%38 = fadd double %37, %30
%39 = extractelement <2 x double> %36, i64 0
%40 = fadd double %39, %38
%41 = fdiv double %9, %3
%42 = fmul double %20, 2.000000e+00
%43 = fdiv double %42, 0x3F40BE91CDA9B5D6
%44 = fadd double %43, 1.000000e+00
%45 = fptosi double %44 to i32
%46 = tail call double @log(i32 %45)
%47 = fmul double %41, 2.000000e+00
%48 = fptosi double %47 to i32
%49 = tail call double @log(i32 %48)
%50 = fdiv double %46, 3.000000e+00
%51 = fsub double %49, %50
%52 = fmul double %51, 0x3F53074E347B1358
%53 = fmul double %46, %52
%54 = fmul double %46, %53
%55 = fmul double %0, 0x3DA140C3477A7D6F
%56 = fmul double %27, 1.000000e-03
%57 = fmul double %8, %56
%58 = fdiv double %55, %57
%59 = fadd double %40, %54
%60 = fmul double %58, %59
ret double %60
}