#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 sqrt(double);
double airBesselI1(double x) {
  double b, ax, y;
  ax = ((x) > 0.0f ? (x) : -(x));
  if (ax < 6.449305566387246) {
    y = x / 6.45;
    y *= y;
    b = ax *
        (0.4999999998235554 +
         y * (2.370331499358438 +
              y * (3.3554331305863787 +
                   y * (2.0569974969268707 +
                        (0.6092719473097832 + 0.0792323006694466 * y) * y)))) /
        (1 + y * (-0.4596495788370524 +
                  (0.08677361454866868 - 0.006777712190188699 * y) * y));
  } else {
    y = 6.45 / ax;
    b = (0.398942280267484 +
         y * (-0.669339325353065 +
              y * (0.40311772245257 +
                   y * (-0.0766281832045885 +
                        (0.00248933264397244 + 0.0000703849046144657 * y) *
                            y)))) /
        (1 + y * (-1.61964537617937 +
                  (0.919118239717915 - 0.142824922601647 * y) * y));
    b *= exp(ax) / sqrt(ax);
  }
  return x < 0.0 ? -b : b;
}


x86 assembly (clang, -O0):
<airBesselI1>:
push   %rbp
mov    %rsp,%rbp
sub    $0x40,%rsp
movsd  %xmm0,-0x8(%rbp)
movsd  -0x8(%rbp),%xmm0
xorps  %xmm1,%xmm1
ucomisd %xmm1,%xmm0
jbe    114e <airBesselI1+0x2e>
movsd  -0x8(%rbp),%xmm0
movsd  %xmm0,-0x28(%rbp)
jmp    116f <airBesselI1+0x4f>
movsd  -0x8(%rbp),%xmm0
movq   %xmm0,%rax
movabs $0x8000000000000000,%rcx
xor    %rcx,%rax
movq   %rax,%xmm0
movsd  %xmm0,-0x28(%rbp)
movsd  -0x28(%rbp),%xmm0
movsd  %xmm0,-0x18(%rbp)
movsd  0xe7f(%rip),%xmm0
ucomisd -0x18(%rbp),%xmm0
jbe    1280 <airBesselI1+0x160>
movsd  -0x8(%rbp),%xmm0
movsd  0xebf(%rip),%xmm1
divsd  %xmm1,%xmm0
movsd  %xmm0,-0x20(%rbp)
movsd  -0x20(%rbp),%xmm0
mulsd  -0x20(%rbp),%xmm0
movsd  %xmm0,-0x20(%rbp)
movsd  -0x18(%rbp),%xmm0
movsd  -0x20(%rbp),%xmm1
movsd  -0x20(%rbp),%xmm2
movsd  -0x20(%rbp),%xmm3
movsd  -0x20(%rbp),%xmm4
movsd  0xec6(%rip),%xmm5
mulsd  %xmm5,%xmm4
movsd  0xec2(%rip),%xmm5
addsd  %xmm5,%xmm4
movsd  -0x20(%rbp),%xmm5
mulsd  %xmm5,%xmm4
movsd  0xe9d(%rip),%xmm5
addsd  %xmm5,%xmm4
mulsd  %xmm4,%xmm3
movsd  0xe85(%rip),%xmm4
addsd  %xmm4,%xmm3
mulsd  %xmm3,%xmm2
movsd  0xe6d(%rip),%xmm3
addsd  %xmm3,%xmm2
mulsd  %xmm2,%xmm1
movsd  0xe55(%rip),%xmm2
addsd  %xmm2,%xmm1
mulsd  %xmm1,%xmm0
movsd  -0x20(%rbp),%xmm1
movsd  -0x20(%rbp),%xmm2
movsd  0xe2b(%rip),%xmm3
mulsd  %xmm3,%xmm2
movsd  0xe27(%rip),%xmm3
addsd  %xmm3,%xmm2
movsd  -0x20(%rbp),%xmm3
mulsd  %xmm3,%xmm2
movsd  0xe02(%rip),%xmm3
addsd  %xmm3,%xmm2
mulsd  %xmm2,%xmm1
movsd  0xd9a(%rip),%xmm2
addsd  %xmm2,%xmm1
divsd  %xmm1,%xmm0
movsd  %xmm0,-0x10(%rbp)
jmp    1382 <airBesselI1+0x262>
movsd  0xdd0(%rip),%xmm0
divsd  -0x18(%rbp),%xmm0
movsd  %xmm0,-0x20(%rbp)
movsd  -0x20(%rbp),%xmm0
movsd  -0x20(%rbp),%xmm1
movsd  -0x20(%rbp),%xmm2
movsd  -0x20(%rbp),%xmm3
movsd  0xd9a(%rip),%xmm4
mulsd  %xmm4,%xmm3
movsd  0xd96(%rip),%xmm4
addsd  %xmm4,%xmm3
movsd  -0x20(%rbp),%xmm4
mulsd  %xmm4,%xmm3
movsd  0xd71(%rip),%xmm4
addsd  %xmm4,%xmm3
mulsd  %xmm3,%xmm2
movsd  0xd59(%rip),%xmm3
addsd  %xmm3,%xmm2
mulsd  %xmm2,%xmm1
movsd  0xd41(%rip),%xmm2
addsd  %xmm2,%xmm1
mulsd  %xmm1,%xmm0
movsd  0xd29(%rip),%xmm1
addsd  %xmm1,%xmm0
movsd  -0x20(%rbp),%xmm1
movsd  -0x20(%rbp),%xmm2
movsd  0xd03(%rip),%xmm3
mulsd  %xmm3,%xmm2
movsd  0xcff(%rip),%xmm3
addsd  %xmm3,%xmm2
movsd  -0x20(%rbp),%xmm3
mulsd  %xmm3,%xmm2
movsd  0xcda(%rip),%xmm3
addsd  %xmm3,%xmm2
mulsd  %xmm2,%xmm1
movsd  0xcc2(%rip),%xmm2
addsd  %xmm2,%xmm1
divsd  %xmm1,%xmm0
movsd  %xmm0,-0x10(%rbp)
movsd  -0x18(%rbp),%xmm0
call   1030 <exp@plt>
movsd  %xmm0,-0x30(%rbp)
movsd  -0x18(%rbp),%xmm0
call   1040 <sqrt@plt>
movaps %xmm0,%xmm1
movsd  -0x30(%rbp),%xmm0
divsd  %xmm1,%xmm0
mulsd  -0x10(%rbp),%xmm0
movsd  %xmm0,-0x10(%rbp)
xorps  %xmm0,%xmm0
ucomisd -0x8(%rbp),%xmm0
jbe    13b6 <airBesselI1+0x296>
movsd  -0x10(%rbp),%xmm0
movq   %xmm0,%rax
movabs $0x8000000000000000,%rcx
xor    %rcx,%rax
movq   %rax,%xmm0
movsd  %xmm0,-0x38(%rbp)
jmp    13c0 <airBesselI1+0x2a0>
movsd  -0x10(%rbp),%xmm0
movsd  %xmm0,-0x38(%rbp)
movsd  -0x38(%rbp),%xmm0
add    $0x40,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<airBesselI1>:
sub    $0x48,%rsp
movapd 0xed4(%rip),%xmm2
xorpd  %xmm0,%xmm2
xorpd  %xmm4,%xmm4
cmpltsd %xmm0,%xmm4
movapd %xmm4,%xmm1
andpd  %xmm0,%xmm1
andnpd %xmm2,%xmm4
orpd   %xmm1,%xmm4
movsd  0xebf(%rip),%xmm1
ucomisd %xmm4,%xmm1
jbe    11e8 <airBesselI1+0xc8>
movapd %xmm0,%xmm1
divsd  0xeb1(%rip),%xmm1
mulsd  %xmm1,%xmm1
movsd  0xefd(%rip),%xmm3
mulsd  %xmm1,%xmm3
addsd  0xef9(%rip),%xmm3
mulsd  %xmm1,%xmm3
addsd  0xef5(%rip),%xmm3
mulsd  %xmm1,%xmm3
addsd  0xef1(%rip),%xmm3
mulsd  %xmm1,%xmm3
addsd  0xeed(%rip),%xmm3
mulsd  %xmm1,%xmm3
addsd  0xee9(%rip),%xmm3
movsd  0xee9(%rip),%xmm2
mulsd  %xmm1,%xmm2
addsd  0xee5(%rip),%xmm2
mulsd  %xmm4,%xmm3
mulsd  %xmm1,%xmm2
addsd  0xedd(%rip),%xmm2
mulsd  %xmm1,%xmm2
addsd  0xe89(%rip),%xmm2
divsd  %xmm2,%xmm3
jmp    12dd <airBesselI1+0x1bd>
movapd %xmm0,0x30(%rsp)
movsd  0xe22(%rip),%xmm0
divsd  %xmm4,%xmm0
movsd  0xe1e(%rip),%xmm1
mulsd  %xmm0,%xmm1
addsd  0xe1a(%rip),%xmm1
mulsd  %xmm0,%xmm1
addsd  0xe16(%rip),%xmm1
mulsd  %xmm0,%xmm1
addsd  0xe12(%rip),%xmm1
mulsd  %xmm0,%xmm1
addsd  0xe0e(%rip),%xmm1
mulsd  %xmm0,%xmm1
addsd  0xe0a(%rip),%xmm1
movapd %xmm1,0x20(%rsp)
movsd  0xe04(%rip),%xmm1
mulsd  %xmm0,%xmm1
addsd  0xe00(%rip),%xmm1
mulsd  %xmm0,%xmm1
addsd  0xdfc(%rip),%xmm1
mulsd  %xmm0,%xmm1
addsd  0xdf8(%rip),%xmm1
movapd %xmm1,0x10(%rsp)
movapd %xmm4,%xmm0
movapd %xmm4,(%rsp)
call   1030 <exp@plt>
movapd (%rsp),%xmm1
movapd %xmm0,%xmm2
ucomisd 0xe23(%rip),%xmm1
jb     12a0 <airBesselI1+0x180>
xorps  %xmm0,%xmm0
sqrtsd %xmm1,%xmm0
jmp    12b3 <airBesselI1+0x193>
movapd %xmm1,%xmm0
movapd %xmm2,(%rsp)
call   1040 <sqrt@plt>
movapd (%rsp),%xmm2
movapd 0x10(%rsp),%xmm1
unpcklpd %xmm0,%xmm1
movapd 0x20(%rsp),%xmm0
unpcklpd %xmm2,%xmm0
divpd  %xmm1,%xmm0
movapd %xmm0,%xmm3
unpckhpd %xmm0,%xmm3
mulsd  %xmm0,%xmm3
movapd 0x30(%rsp),%xmm0
movapd 0xd1b(%rip),%xmm1
xorpd  %xmm3,%xmm1
xorpd  %xmm2,%xmm2
cmpltsd %xmm2,%xmm0
andpd  %xmm0,%xmm1
andnpd %xmm3,%xmm0
orpd   %xmm1,%xmm0
add    $0x48,%rsp
ret

LLVM IR (-O0):
define double @airBesselI1(double %0) {
%2 = alloca double
%3 = alloca double
%4 = alloca double
%5 = alloca double
store double %0, double* %2
%6 = load double, double* %2
%7 = fcmp ogt double %6, 0.000000e+00
br i1 %7, label %8, label %10
8: ; preds = %1
%9 = load double, double* %2
br label %13
10: ; preds = %1
%11 = load double, double* %2
%12 = fneg double %11
br label %13
13: ; preds = %10, %8
%14 = phi double [ %9, %8 ], [ %12, %10 ]
store double %14, double* %4
%15 = load double, double* %4
%16 = fcmp olt double %15, 0x4019CC16C2262D09
br i1 %16, label %17, label %42
17: ; preds = %13
%18 = load double, double* %2
%19 = fdiv double %18, 6.450000e+00
store double %19, double* %5
%20 = load double, double* %5
%21 = load double, double* %5
%22 = fmul double %21, %20
store double %22, double* %5
%23 = load double, double* %4
%24 = load double, double* %5
%25 = load double, double* %5
%26 = load double, double* %5
%27 = load double, double* %5
%28 = call double @llvm.fmuladd.f64(double 0x3FB448916C29802D, double %27, double 0x3FE37F27E2021AA8)
%29 = load double, double* %5
%30 = call double @llvm.fmuladd.f64(double %28, double %29, double 0x400074BB1A8A09C5)
%31 = call double @llvm.fmuladd.f64(double %26, double %30, double 0x400AD7ED533E4464)
%32 = call double @llvm.fmuladd.f64(double %25, double %31, double 0x4002F6705C736295)
%33 = call double @llvm.fmuladd.f64(double %24, double %32, double 0x3FDFFFFFFFCF7FD1)
%34 = fmul double %23, %33
%35 = load double, double* %5
%36 = load double, double* %5
%37 = call double @llvm.fmuladd.f64(double 0xBF7BC2F2432D4E4B, double %36, double 0x3FB636CBACA469F5)
%38 = load double, double* %5
%39 = call double @llvm.fmuladd.f64(double %37, double %38, double 0xBFDD6AE6112E6B8A)
%40 = call double @llvm.fmuladd.f64(double %35, double %39, double 1.000000e+00)
%41 = fdiv double %34, %40
store double %41, double* %3
br label %69
42: ; preds = %13
%43 = load double, double* %4
%44 = fdiv double 6.450000e+00, %43
store double %44, double* %5
%45 = load double, double* %5
%46 = load double, double* %5
%47 = load double, double* %5
%48 = load double, double* %5
%49 = call double @llvm.fmuladd.f64(double 0x3F127373742C8DCD, double %48, double 0x3F646482496E66FC)
%50 = load double, double* %5
%51 = call double @llvm.fmuladd.f64(double %49, double %50, double 0xBFB39DE794D0CB6E)
%52 = call double @llvm.fmuladd.f64(double %47, double %51, double 0x3FD9CCAE4697CB75)
%53 = call double @llvm.fmuladd.f64(double %46, double %52, double 0xBFE56B3A4E0A2E05)
%54 = call double @llvm.fmuladd.f64(double %45, double %53, double 0x3FD9884533AF6484)
%55 = load double, double* %5
%56 = load double, double* %5
%57 = call double @llvm.fmuladd.f64(double 0xBFC2481649D05BEB, double %56, double 0x3FED696AA797DB68)
%58 = load double, double* %5
%59 = call double @llvm.fmuladd.f64(double %57, double %58, double 0xBFF9EA11451CED9E)
%60 = call double @llvm.fmuladd.f64(double %55, double %59, double 1.000000e+00)
%61 = fdiv double %54, %60
store double %61, double* %3
%62 = load double, double* %4
%63 = call double @exp(double %62)
%64 = load double, double* %4
%65 = call double @sqrt(double %64)
%66 = fdiv double %63, %65
%67 = load double, double* %3
%68 = fmul double %67, %66
store double %68, double* %3
br label %69
69: ; preds = %42, %17
%70 = load double, double* %2
%71 = fcmp olt double %70, 0.000000e+00
br i1 %71, label %72, label %75
72: ; preds = %69
%73 = load double, double* %3
%74 = fneg double %73
br label %77
75: ; preds = %69
%76 = load double, double* %3
br label %77
77: ; preds = %75, %72
%78 = phi double [ %74, %72 ], [ %76, %75 ]
ret double %78
}

LLVM IR (-O2):
define double @airBesselI1(double %0) {
%2 = fcmp ogt double %0, 0.000000e+00
%3 = fneg double %0
%4 = select i1 %2, double %0, double %3
%5 = fcmp olt double %4, 0x4019CC16C2262D09
br i1 %5, label %6, label %19
6: ; preds = %1
%7 = fdiv double %0, 6.450000e+00
%8 = fmul double %7, %7
%9 = tail call double @llvm.fmuladd.f64(double %8, double 0x3FB448916C29802D, double 0x3FE37F27E2021AA8)
%10 = tail call double @llvm.fmuladd.f64(double %9, double %8, double 0x400074BB1A8A09C5)
%11 = tail call double @llvm.fmuladd.f64(double %8, double %10, double 0x400AD7ED533E4464)
%12 = tail call double @llvm.fmuladd.f64(double %8, double %11, double 0x4002F6705C736295)
%13 = tail call double @llvm.fmuladd.f64(double %8, double %12, double 0x3FDFFFFFFFCF7FD1)
%14 = fmul double %4, %13
%15 = tail call double @llvm.fmuladd.f64(double %8, double 0xBF7BC2F2432D4E4B, double 0x3FB636CBACA469F5)
%16 = tail call double @llvm.fmuladd.f64(double %15, double %8, double 0xBFDD6AE6112E6B8A)
%17 = tail call double @llvm.fmuladd.f64(double %8, double %16, double 1.000000e+00)
%18 = fdiv double %14, %17
br label %39
19: ; preds = %1
%20 = fdiv double 6.450000e+00, %4
%21 = tail call double @llvm.fmuladd.f64(double %20, double 0x3F127373742C8DCD, double 0x3F646482496E66FC)
%22 = tail call double @llvm.fmuladd.f64(double %21, double %20, double 0xBFB39DE794D0CB6E)
%23 = tail call double @llvm.fmuladd.f64(double %20, double %22, double 0x3FD9CCAE4697CB75)
%24 = tail call double @llvm.fmuladd.f64(double %20, double %23, double 0xBFE56B3A4E0A2E05)
%25 = tail call double @llvm.fmuladd.f64(double %20, double %24, double 0x3FD9884533AF6484)
%26 = tail call double @llvm.fmuladd.f64(double %20, double 0xBFC2481649D05BEB, double 0x3FED696AA797DB68)
%27 = tail call double @llvm.fmuladd.f64(double %26, double %20, double 0xBFF9EA11451CED9E)
%28 = tail call double @llvm.fmuladd.f64(double %20, double %27, double 1.000000e+00)
%29 = tail call double @exp(double %4)
%30 = tail call double @sqrt(double %4)
%31 = insertelement <2 x double> poison, double %25, i64 0
%32 = insertelement <2 x double> %31, double %29, i64 1
%33 = insertelement <2 x double> poison, double %28, i64 0
%34 = insertelement <2 x double> %33, double %30, i64 1
%35 = fdiv <2 x double> %32, %34
%36 = shufflevector <2 x double> %35, <2 x double> poison, <2 x i32> <i32 1, i32 undef>
%37 = fmul <2 x double> %35, %36
%38 = extractelement <2 x double> %37, i64 0
br label %39
39: ; preds = %19, %6
%40 = phi double [ %18, %6 ], [ %38, %19 ]
%41 = fcmp olt double %0, 0.000000e+00
%42 = fneg double %40
%43 = select i1 %41, double %42, double %40
ret double %43
}