double airBesselI1By0(double x) {
  double q, ax, y;
  ax = ((x) > 0.0f ? (x) : -(x));
  if (ax < 2.2000207427754046) {
    y = ax / 2.2;
    q = (1.109010375603908e-29 +
         y * (1.0999999994454934 +
              y * (0.05256560007682146 +
                   y * (0.3835178789165919 +
                        (0.011328636410807382 + 0.009066934622942833 * y) *
                            y)))) /
        (1 + y * (0.047786822784523904 +
                  y * (0.9536550439261017 +
                       (0.03918380275938573 + 0.09730715527121027 * y) * y)));
  } else if (ax < 5.888258985638512) {
    y = (ax - 2.2) / 3.68;
    q = (0.7280299135046744 +
         y * (2.5697382341657002 +
              y * (3.69819451510548 +
                   y * (3.131374238190916 +
                        (1.2811958061688737 + 0.003601218043466571 * y) *
                            y)))) /
        (1 + y * (2.8268553393021527 +
                  y * (4.164742157157812 +
                       y * (3.2377768820326756 + 1.3051900460060342 * y))));
  } else {
    y = 5.88 / ax;
    q = (1.000000000646262020372530870790956088593 +
         y * (-2.012513842496824157039372120680781513697 +
              y * (1.511644590219033259220408231325838531123 +
                   (-0.3966391319921114140077576390415605232003 +
                    0.02651815520696779849352690755529178056941 * y) *
                       y))) /
        (1 + y * (-1.927479858946526082413004924812844224781 +
                  y * (1.351359456116228102988125069310621733956 +
                       (-0.288087717540546638165144937495654019162 +
                        0.005906535730887518966127383058238522133819 * y) *
                           y)));
  }
  return x < 0.0 ? -q : q;
}


x86 assembly (clang, -O0):
<airBesselI1By0>:
push   %rbp
mov    %rsp,%rbp
movsd  %xmm0,-0x8(%rbp)
movsd  -0x8(%rbp),%xmm0
xorps  %xmm1,%xmm1
ucomisd %xmm1,%xmm0
jbe    112a <airBesselI1By0+0x2a>
movsd  -0x8(%rbp),%xmm0
movsd  %xmm0,-0x28(%rbp)
jmp    114b <airBesselI1By0+0x4b>
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  0xea3(%rip),%xmm0
ucomisd -0x18(%rbp),%xmm0
jbe    1259 <airBesselI1By0+0x159>
movsd  -0x18(%rbp),%xmm0
movsd  0xf4b(%rip),%xmm1
divsd  %xmm1,%xmm0
movsd  %xmm0,-0x20(%rbp)
movsd  -0x20(%rbp),%xmm0
movsd  -0x20(%rbp),%xmm1
movsd  -0x20(%rbp),%xmm2
movsd  -0x20(%rbp),%xmm3
movsd  0xf6e(%rip),%xmm4
mulsd  %xmm4,%xmm3
movsd  0xf6a(%rip),%xmm4
addsd  %xmm4,%xmm3
movsd  -0x20(%rbp),%xmm4
mulsd  %xmm4,%xmm3
movsd  0xf45(%rip),%xmm4
addsd  %xmm4,%xmm3
mulsd  %xmm3,%xmm2
movsd  0xf2d(%rip),%xmm3
addsd  %xmm3,%xmm2
mulsd  %xmm2,%xmm1
movsd  0xf15(%rip),%xmm2
addsd  %xmm2,%xmm1
mulsd  %xmm1,%xmm0
movsd  0xefd(%rip),%xmm1
addsd  %xmm1,%xmm0
movsd  -0x20(%rbp),%xmm1
movsd  -0x20(%rbp),%xmm2
movsd  -0x20(%rbp),%xmm3
movsd  0xed2(%rip),%xmm4
mulsd  %xmm4,%xmm3
movsd  0xece(%rip),%xmm4
addsd  %xmm4,%xmm3
movsd  -0x20(%rbp),%xmm4
mulsd  %xmm4,%xmm3
movsd  0xea9(%rip),%xmm4
addsd  %xmm4,%xmm3
mulsd  %xmm3,%xmm2
movsd  0xe91(%rip),%xmm3
addsd  %xmm3,%xmm2
mulsd  %xmm2,%xmm1
movsd  0xdc9(%rip),%xmm2
addsd  %xmm2,%xmm1
divsd  %xmm1,%xmm0
movsd  %xmm0,-0x10(%rbp)
jmp    1441 <airBesselI1By0+0x341>
movsd  0xda7(%rip),%xmm0
ucomisd -0x18(%rbp),%xmm0
jbe    1369 <airBesselI1By0+0x269>
movsd  -0x18(%rbp),%xmm0
movsd  0xe47(%rip),%xmm1
subsd  %xmm1,%xmm0
movsd  0xe33(%rip),%xmm1
divsd  %xmm1,%xmm0
movsd  %xmm0,-0x20(%rbp)
movsd  -0x20(%rbp),%xmm0
movsd  -0x20(%rbp),%xmm1
movsd  -0x20(%rbp),%xmm2
movsd  -0x20(%rbp),%xmm3
movsd  0xdfe(%rip),%xmm4
mulsd  %xmm4,%xmm3
movsd  0xdfa(%rip),%xmm4
addsd  %xmm4,%xmm3
movsd  -0x20(%rbp),%xmm4
mulsd  %xmm4,%xmm3
movsd  0xdd5(%rip),%xmm4
addsd  %xmm4,%xmm3
mulsd  %xmm3,%xmm2
movsd  0xdbd(%rip),%xmm3
addsd  %xmm3,%xmm2
mulsd  %xmm2,%xmm1
movsd  0xda5(%rip),%xmm2
addsd  %xmm2,%xmm1
mulsd  %xmm1,%xmm0
movsd  0xd8d(%rip),%xmm1
addsd  %xmm1,%xmm0
movsd  -0x20(%rbp),%xmm1
movsd  -0x20(%rbp),%xmm2
movsd  -0x20(%rbp),%xmm3
movsd  -0x20(%rbp),%xmm4
movsd  0xd5d(%rip),%xmm5
mulsd  %xmm5,%xmm4
movsd  0xd59(%rip),%xmm5
addsd  %xmm5,%xmm4
mulsd  %xmm4,%xmm3
movsd  0xd39(%rip),%xmm4
addsd  %xmm4,%xmm3
mulsd  %xmm3,%xmm2
movsd  0xd21(%rip),%xmm3
addsd  %xmm3,%xmm2
mulsd  %xmm2,%xmm1
movsd  0xcb9(%rip),%xmm2
addsd  %xmm2,%xmm1
divsd  %xmm1,%xmm0
movsd  %xmm0,-0x10(%rbp)
jmp    143c <airBesselI1By0+0x33c>
movsd  0xcef(%rip),%xmm0
divsd  -0x18(%rbp),%xmm0
movsd  %xmm0,-0x20(%rbp)
movsd  -0x20(%rbp),%xmm0
movsd  -0x20(%rbp),%xmm1
movsd  -0x20(%rbp),%xmm2
movsd  0xcbe(%rip),%xmm3
mulsd  %xmm3,%xmm2
movsd  0xcba(%rip),%xmm3
addsd  %xmm3,%xmm2
movsd  -0x20(%rbp),%xmm3
mulsd  %xmm3,%xmm2
movsd  0xc95(%rip),%xmm3
addsd  %xmm3,%xmm2
mulsd  %xmm2,%xmm1
movsd  0xc7d(%rip),%xmm2
addsd  %xmm2,%xmm1
mulsd  %xmm1,%xmm0
movsd  0xc65(%rip),%xmm1
addsd  %xmm1,%xmm0
movsd  -0x20(%rbp),%xmm1
movsd  -0x20(%rbp),%xmm2
movsd  -0x20(%rbp),%xmm3
movsd  0xc3a(%rip),%xmm4
mulsd  %xmm4,%xmm3
movsd  0xc36(%rip),%xmm4
addsd  %xmm4,%xmm3
movsd  -0x20(%rbp),%xmm4
mulsd  %xmm4,%xmm3
movsd  0xc11(%rip),%xmm4
addsd  %xmm4,%xmm3
mulsd  %xmm3,%xmm2
movsd  0xbf9(%rip),%xmm3
addsd  %xmm3,%xmm2
mulsd  %xmm2,%xmm1
movsd  0xbe1(%rip),%xmm2
addsd  %xmm2,%xmm1
divsd  %xmm1,%xmm0
movsd  %xmm0,-0x10(%rbp)
jmp    1441 <airBesselI1By0+0x341>
xorps  %xmm0,%xmm0
ucomisd -0x8(%rbp),%xmm0
jbe    1475 <airBesselI1By0+0x375>
movsd  -0x10(%rbp),%xmm0
movq   %xmm0,%rax
movabs $0x8000000000000000,%rcx
xor    %rcx,%rax
movq   %rax,%xmm0
movsd  %xmm0,-0x30(%rbp)
jmp    147f <airBesselI1By0+0x37f>
movsd  -0x10(%rbp),%xmm0
movsd  %xmm0,-0x30(%rbp)
movsd  -0x30(%rbp),%xmm0
pop    %rbp
ret

x86 assembly (clang, -O2):
<airBesselI1By0>:
movapd 0xef8(%rip),%xmm1
xorpd  %xmm0,%xmm1
xorpd  %xmm2,%xmm2
cmpltsd %xmm0,%xmm2
movapd %xmm2,%xmm3
andpd  %xmm0,%xmm3
andnpd %xmm1,%xmm2
orpd   %xmm3,%xmm2
movsd  0xfb3(%rip),%xmm1
ucomisd %xmm2,%xmm1
jbe    11ac <airBesselI1By0+0xac>
movsd  0xfdd(%rip),%xmm1
divsd  %xmm1,%xmm2
movsd  0xfd9(%rip),%xmm1
mulsd  %xmm2,%xmm1
addsd  0xfd5(%rip),%xmm1
mulsd  %xmm2,%xmm1
addsd  0xfd1(%rip),%xmm1
movsd  0xfd1(%rip),%xmm3
mulsd  %xmm2,%xmm3
addsd  0xfcd(%rip),%xmm3
movapd %xmm2,%xmm4
unpcklpd %xmm3,%xmm4
unpcklpd %xmm2,%xmm1
mulpd  %xmm4,%xmm1
addpd  0xf25(%rip),%xmm1
unpcklpd %xmm2,%xmm2
mulpd  %xmm2,%xmm1
addpd  0xf25(%rip),%xmm1
mulpd  %xmm2,%xmm1
addpd  0xf29(%rip),%xmm1
jmp    1270 <airBesselI1By0+0x170>
movsd  0xf34(%rip),%xmm1
ucomisd %xmm2,%xmm1
jbe    1228 <airBesselI1By0+0x128>
movsd  0xf36(%rip),%xmm3
addsd  %xmm2,%xmm3
divsd  0xf32(%rip),%xmm3
movsd  0xf32(%rip),%xmm2
mulsd  %xmm3,%xmm2
addsd  0xf2e(%rip),%xmm2
unpcklpd %xmm3,%xmm2
movapd 0xe72(%rip),%xmm1
movsd  %xmm3,%xmm1
mulpd  %xmm2,%xmm1
addpd  0xe72(%rip),%xmm1
unpcklpd %xmm3,%xmm3
mulpd  %xmm3,%xmm1
addpd  0xe72(%rip),%xmm1
mulpd  %xmm3,%xmm1
addpd  0xe76(%rip),%xmm1
mulpd  %xmm3,%xmm1
addpd  0xe7a(%rip),%xmm1
jmp    1270 <airBesselI1By0+0x170>
movsd  0xec0(%rip),%xmm3
divsd  %xmm2,%xmm3
unpcklpd %xmm3,%xmm3
movapd 0xdd0(%rip),%xmm1
mulpd  %xmm3,%xmm1
addpd  0xdd4(%rip),%xmm1
mulpd  %xmm3,%xmm1
addpd  0xdd8(%rip),%xmm1
mulpd  %xmm3,%xmm1
addpd  0xddc(%rip),%xmm1
mulpd  %xmm3,%xmm1
addpd  0xde0(%rip),%xmm1
movapd %xmm1,%xmm2
unpckhpd %xmm1,%xmm2
divsd  %xmm2,%xmm1
movapd 0xd7c(%rip),%xmm2
xorpd  %xmm1,%xmm2
xorpd  %xmm3,%xmm3
cmpltsd %xmm3,%xmm0
andpd  %xmm0,%xmm2
andnpd %xmm1,%xmm0
orpd   %xmm2,%xmm0
ret

LLVM IR (-O0):
define double @airBesselI1By0(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, 0x400199A479A5EF99
br i1 %16, label %17, label %39
17: ; preds = %13
%18 = load double, double* %4
%19 = fdiv double %18, 2.200000e+00
store double %19, double* %5
%20 = load double, double* %5
%21 = load double, double* %5
%22 = load double, double* %5
%23 = load double, double* %5
%24 = call double @llvm.fmuladd.f64(double 0x3F8291AF5D71AEFF, double %23, double 0x3F873377D7243BFB)
%25 = load double, double* %5
%26 = call double @llvm.fmuladd.f64(double %24, double %25, double 0x3FD88B8E92D831F9)
%27 = call double @llvm.fmuladd.f64(double %22, double %26, double 0x3FAAE9E0DA72F9F5)
%28 = call double @llvm.fmuladd.f64(double %21, double %27, double 0x3FF1999999737E9E)
%29 = call double @llvm.fmuladd.f64(double %20, double %28, double 0x39EC1DE38C701EDE)
%30 = load double, double* %5
%31 = load double, double* %5
%32 = load double, double* %5
%33 = call double @llvm.fmuladd.f64(double 0x3FB8E91F298E8019, double %32, double 0x3FA40FE63EC4DA13)
%34 = load double, double* %5
%35 = call double @llvm.fmuladd.f64(double %33, double %34, double 0x3FEE8457952A7F63)
%36 = call double @llvm.fmuladd.f64(double %31, double %35, double 0x3FA87783B2141C39)
%37 = call double @llvm.fmuladd.f64(double %30, double %36, double 1.000000e+00)
%38 = fdiv double %29, %37
store double %38, double* %3
br label %86
39: ; preds = %13
%40 = load double, double* %4
%41 = fcmp olt double %40, 0x40178D93C376C83C
br i1 %41, label %42, label %65
42: ; preds = %39
%43 = load double, double* %4
%44 = fsub double %43, 2.200000e+00
%45 = fdiv double %44, 3.680000e+00
store double %45, double* %5
%46 = load double, double* %5
%47 = load double, double* %5
%48 = load double, double* %5
%49 = load double, double* %5
%50 = call double @llvm.fmuladd.f64(double 0x3F6D804D371E57E9, double %49, double 0x3FF47FC72C74485E)
%51 = load double, double* %5
%52 = call double @llvm.fmuladd.f64(double %50, double %51, double 0x40090D0DEFC48902)
%53 = call double @llvm.fmuladd.f64(double %48, double %52, double 0x400D95E70184FF36)
%54 = call double @llvm.fmuladd.f64(double %47, double %53, double 0x40048ED2EB582E06)
%55 = call double @llvm.fmuladd.f64(double %46, double %54, double 0x3FE74C0563A064A4)
%56 = load double, double* %5
%57 = load double, double* %5
%58 = load double, double* %5
%59 = load double, double* %5
%60 = call double @llvm.fmuladd.f64(double 0x3FF4E20EF52A9208, double %59, double 0x4009E6F790E099FE)
%61 = call double @llvm.fmuladd.f64(double %58, double %60, double 0x4010A8B22B050FA9)
%62 = call double @llvm.fmuladd.f64(double %57, double %61, double 0x40069D6655069B18)
%63 = call double @llvm.fmuladd.f64(double %56, double %62, double 1.000000e+00)
%64 = fdiv double %55, %63
store double %64, double* %3
br label %85
65: ; preds = %39
%66 = load double, double* %4
%67 = fdiv double 5.880000e+00, %66
store double %67, double* %5
%68 = load double, double* %5
%69 = load double, double* %5
%70 = load double, double* %5
%71 = call double @llvm.fmuladd.f64(double 0x3F9B27934574EB4A, double %70, double 0xBFD96289190E1398)
%72 = load double, double* %5
%73 = call double @llvm.fmuladd.f64(double %71, double %72, double 0x3FF82FB23CE2A838)
%74 = call double @llvm.fmuladd.f64(double %69, double %73, double 0xC00019A0DB822B53)
%75 = call double @llvm.fmuladd.f64(double %68, double %74, double 0x3FF00000002C6929)
%76 = load double, double* %5
%77 = load double, double* %5
%78 = load double, double* %5
%79 = call double @llvm.fmuladd.f64(double 0x3F7831739CBFC38D, double %78, double 0xBFD27007774DD1DA)
%80 = load double, double* %5
%81 = call double @llvm.fmuladd.f64(double %79, double %80, double 0x3FF59F2B17D28D81)
%82 = call double @llvm.fmuladd.f64(double %77, double %81, double 0xBFFED6F51EDDFBFF)
%83 = call double @llvm.fmuladd.f64(double %76, double %82, double 1.000000e+00)
%84 = fdiv double %75, %83
store double %84, double* %3
br label %85
85: ; preds = %65, %42
br label %86
86: ; preds = %85, %17
%87 = load double, double* %2
%88 = fcmp olt double %87, 0.000000e+00
br i1 %88, label %89, label %92
89: ; preds = %86
%90 = load double, double* %3
%91 = fneg double %90
br label %94
92: ; preds = %86
%93 = load double, double* %3
br label %94
94: ; preds = %92, %89
%95 = phi double [ %91, %89 ], [ %93, %92 ]
ret double %95
}

LLVM IR (-O2):
define double @airBesselI1By0(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, 0x400199A479A5EF99
br i1 %5, label %6, label %22
6: ; preds = %1
%7 = fdiv double %4, 2.200000e+00
%8 = tail call double @llvm.fmuladd.f64(double %7, double 0x3F8291AF5D71AEFF, double 0x3F873377D7243BFB)
%9 = tail call double @llvm.fmuladd.f64(double %8, double %7, double 0x3FD88B8E92D831F9)
%10 = tail call double @llvm.fmuladd.f64(double %7, double 0x3FB8E91F298E8019, double 0x3FA40FE63EC4DA13)
%11 = insertelement <2 x double> poison, double %7, i64 0
%12 = insertelement <2 x double> %11, double %10, i64 1
%13 = insertelement <2 x double> poison, double %9, i64 0
%14 = insertelement <2 x double> %13, double %7, i64 1
%15 = call <2 x double> @llvm.fmuladd.v2f64(<2 x double> %12, <2 x double> %14, <2 x double> <double 0x3FAAE9E0DA72F9F5, double 0x3FEE8457952A7F63>)
%16 = shufflevector <2 x double> %11, <2 x double> poison, <2 x i32> zeroinitializer
%17 = call <2 x double> @llvm.fmuladd.v2f64(<2 x double> %16, <2 x double> %15, <2 x double> <double 0x3FF1999999737E9E, double 0x3FA87783B2141C39>)
%18 = call <2 x double> @llvm.fmuladd.v2f64(<2 x double> %16, <2 x double> %17, <2 x double> <double 0x39EC1DE38C701EDE, double 1.000000e+00>)
%19 = extractelement <2 x double> %18, i64 0
%20 = extractelement <2 x double> %18, i64 1
%21 = fdiv double %19, %20
br label %51
22: ; preds = %1
%23 = fcmp olt double %4, 0x40178D93C376C83C
br i1 %23, label %24, label %40
24: ; preds = %22
%25 = fadd double %4, -2.200000e+00
%26 = fdiv double %25, 3.680000e+00
%27 = tail call double @llvm.fmuladd.f64(double %26, double 0x3F6D804D371E57E9, double 0x3FF47FC72C74485E)
%28 = insertelement <2 x double> poison, double %27, i64 0
%29 = insertelement <2 x double> %28, double %26, i64 1
%30 = insertelement <2 x double> <double poison, double 0x3FF4E20EF52A9208>, double %26, i64 0
%31 = call <2 x double> @llvm.fmuladd.v2f64(<2 x double> %29, <2 x double> %30, <2 x double> <double 0x40090D0DEFC48902, double 0x4009E6F790E099FE>)
%32 = insertelement <2 x double> poison, double %26, i64 0
%33 = shufflevector <2 x double> %32, <2 x double> poison, <2 x i32> zeroinitializer
%34 = call <2 x double> @llvm.fmuladd.v2f64(<2 x double> %33, <2 x double> %31, <2 x double> <double 0x400D95E70184FF36, double 0x4010A8B22B050FA9>)
%35 = call <2 x double> @llvm.fmuladd.v2f64(<2 x double> %33, <2 x double> %34, <2 x double> <double 0x40048ED2EB582E06, double 0x40069D6655069B18>)
%36 = call <2 x double> @llvm.fmuladd.v2f64(<2 x double> %33, <2 x double> %35, <2 x double> <double 0x3FE74C0563A064A4, double 1.000000e+00>)
%37 = extractelement <2 x double> %36, i64 0
%38 = extractelement <2 x double> %36, i64 1
%39 = fdiv double %37, %38
br label %51
40: ; preds = %22
%41 = fdiv double 5.880000e+00, %4
%42 = insertelement <2 x double> poison, double %41, i64 0
%43 = shufflevector <2 x double> %42, <2 x double> poison, <2 x i32> zeroinitializer
%44 = call <2 x double> @llvm.fmuladd.v2f64(<2 x double> %43, <2 x double> <double 0x3F9B27934574EB4A, double 0x3F7831739CBFC38D>, <2 x double> <double 0xBFD96289190E1398, double 0xBFD27007774DD1DA>)
%45 = call <2 x double> @llvm.fmuladd.v2f64(<2 x double> %44, <2 x double> %43, <2 x double> <double 0x3FF82FB23CE2A838, double 0x3FF59F2B17D28D81>)
%46 = call <2 x double> @llvm.fmuladd.v2f64(<2 x double> %43, <2 x double> %45, <2 x double> <double 0xC00019A0DB822B53, double 0xBFFED6F51EDDFBFF>)
%47 = call <2 x double> @llvm.fmuladd.v2f64(<2 x double> %43, <2 x double> %46, <2 x double> <double 0x3FF00000002C6929, double 1.000000e+00>)
%48 = extractelement <2 x double> %47, i64 0
%49 = extractelement <2 x double> %47, i64 1
%50 = fdiv double %48, %49
br label %51
51: ; preds = %24, %40, %6
%52 = phi double [ %21, %6 ], [ %39, %24 ], [ %50, %40 ]
%53 = fcmp olt double %0, 0.000000e+00
%54 = fneg double %52
%55 = select i1 %53, double %54, double %52
ret double %55
}