#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 */
float cos(double);
double log(float);
double sin(double);
double sqrt(double);
float bessy1(float x) {
  float bessj1(float x);
  float z;
  double xx, y, ans, ans1, ans2;
  if (x < 8.0) {
    y = x * x;
    ans1 = x * (-0.4900604943e13 +
                y * (0.1275274390e13 +
                     y * (-0.5153438139e11 +
                          y * (0.7349264551e9 +
                               y * (-0.4237922726e7 + y * 0.8511937935e4)))));
    ans2 = 0.2499580570e14 +
           y * (0.4244419664e12 +
                y * (0.3733650367e10 +
                     y * (0.2245904002e8 +
                          y * (0.1020426050e6 + y * (0.3549632885e3 + y)))));
    ans = (ans1 / ans2) + 0.636619772 * (bessj1(x) * log(x) - 1.0 / x);
  } else {
    z = 8.0 / x;
    y = z * z;
    xx = x - 2.356194491;
    ans1 = 1.0 + y * (0.183105e-2 +
                      y * (-0.3516396496e-4 +
                           y * (0.2457520174e-5 + y * (-0.240337019e-6))));
    ans2 =
        0.04687499995 +
        y * (-0.2002690873e-3 +
             y * (0.8449199096e-5 + y * (-0.88228987e-6 + y * 0.105787412e-6)));
    ans = sqrt(0.636619772 / x) * (sin(xx) * ans1 + z * cos(xx) * ans2);
  }
  return ans;
}


x86 assembly (clang, -O0):
<bessy1>:
push   %rbp
mov    %rsp,%rbp
sub    $0x60,%rsp
movss  %xmm0,-0x4(%rbp)
movss  -0x4(%rbp),%xmm0
cvtss2sd %xmm0,%xmm1
movsd  0xe92(%rip),%xmm0
ucomisd %xmm1,%xmm0
jbe    1310 <bessy1+0x1c0>
movss  -0x4(%rbp),%xmm0
mulss  -0x4(%rbp),%xmm0
cvtss2sd %xmm0,%xmm0
movsd  %xmm0,-0x18(%rbp)
movss  -0x4(%rbp),%xmm0
cvtss2sd %xmm0,%xmm0
movsd  -0x18(%rbp),%xmm1
movsd  -0x18(%rbp),%xmm2
movsd  -0x18(%rbp),%xmm3
movsd  -0x18(%rbp),%xmm4
movsd  -0x18(%rbp),%xmm5
movsd  0xf03(%rip),%xmm6
mulsd  %xmm6,%xmm5
movsd  0xeff(%rip),%xmm6
addsd  %xmm6,%xmm5
mulsd  %xmm5,%xmm4
movsd  0xedf(%rip),%xmm5
addsd  %xmm5,%xmm4
mulsd  %xmm4,%xmm3
movsd  0xec7(%rip),%xmm4
addsd  %xmm4,%xmm3
mulsd  %xmm3,%xmm2
movsd  0xeaf(%rip),%xmm3
addsd  %xmm3,%xmm2
mulsd  %xmm2,%xmm1
movsd  0xe97(%rip),%xmm2
addsd  %xmm2,%xmm1
mulsd  %xmm1,%xmm0
movsd  %xmm0,-0x28(%rbp)
movsd  -0x18(%rbp),%xmm0
movsd  -0x18(%rbp),%xmm1
movsd  -0x18(%rbp),%xmm2
movsd  -0x18(%rbp),%xmm3
movsd  -0x18(%rbp),%xmm4
movsd  0xe61(%rip),%xmm5
addsd  -0x18(%rbp),%xmm5
mulsd  %xmm5,%xmm4
movsd  0xe48(%rip),%xmm5
addsd  %xmm5,%xmm4
mulsd  %xmm4,%xmm3
movsd  0xe30(%rip),%xmm4
addsd  %xmm4,%xmm3
mulsd  %xmm3,%xmm2
movsd  0xe18(%rip),%xmm3
addsd  %xmm3,%xmm2
mulsd  %xmm2,%xmm1
movsd  0xe00(%rip),%xmm2
addsd  %xmm2,%xmm1
mulsd  %xmm1,%xmm0
movsd  0xde8(%rip),%xmm1
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x30(%rbp)
movsd  -0x28(%rbp),%xmm0
divsd  -0x30(%rbp),%xmm0
movsd  %xmm0,-0x40(%rbp)
movss  -0x4(%rbp),%xmm0
call   1030 <bessj1@plt>
cvtss2sd %xmm0,%xmm0
movsd  %xmm0,-0x38(%rbp)
movss  -0x4(%rbp),%xmm0
call   1060 <log@plt>
movsd  -0x40(%rbp),%xmm1
movaps %xmm0,%xmm3
movsd  -0x38(%rbp),%xmm0
movss  -0x4(%rbp),%xmm2
cvtss2sd %xmm2,%xmm4
movsd  0xd65(%rip),%xmm2
divsd  %xmm4,%xmm2
movq   %xmm2,%rax
movabs $0x8000000000000000,%rcx
xor    %rcx,%rax
movq   %rax,%xmm2
mulsd  %xmm3,%xmm0
addsd  %xmm2,%xmm0
movsd  0xd0a(%rip),%xmm2
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x20(%rbp)
jmp    149e <bessy1+0x34e>
movss  -0x4(%rbp),%xmm0
cvtss2sd %xmm0,%xmm1
movsd  0xcdf(%rip),%xmm0
divsd  %xmm1,%xmm0
cvtsd2ss %xmm0,%xmm0
movss  %xmm0,-0x8(%rbp)
movss  -0x8(%rbp),%xmm0
mulss  -0x8(%rbp),%xmm0
cvtss2sd %xmm0,%xmm0
movsd  %xmm0,-0x18(%rbp)
movss  -0x4(%rbp),%xmm0
cvtss2sd %xmm0,%xmm0
movsd  0xd0e(%rip),%xmm1
subsd  %xmm1,%xmm0
movsd  %xmm0,-0x10(%rbp)
movsd  -0x18(%rbp),%xmm0
movsd  -0x18(%rbp),%xmm1
movsd  -0x18(%rbp),%xmm2
movsd  -0x18(%rbp),%xmm3
movsd  0xcd9(%rip),%xmm4
mulsd  %xmm4,%xmm3
movsd  0xcd5(%rip),%xmm4
addsd  %xmm4,%xmm3
mulsd  %xmm3,%xmm2
movsd  0xcb5(%rip),%xmm3
addsd  %xmm3,%xmm2
mulsd  %xmm2,%xmm1
movsd  0xc9d(%rip),%xmm2
addsd  %xmm2,%xmm1
mulsd  %xmm1,%xmm0
movsd  0xc85(%rip),%xmm1
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x28(%rbp)
movsd  -0x18(%rbp),%xmm0
movsd  -0x18(%rbp),%xmm1
movsd  -0x18(%rbp),%xmm2
movsd  -0x18(%rbp),%xmm3
movsd  0xc50(%rip),%xmm4
mulsd  %xmm4,%xmm3
movsd  0xc4c(%rip),%xmm4
addsd  %xmm4,%xmm3
mulsd  %xmm3,%xmm2
movsd  0xc2c(%rip),%xmm3
addsd  %xmm3,%xmm2
mulsd  %xmm2,%xmm1
movsd  0xc14(%rip),%xmm2
addsd  %xmm2,%xmm1
mulsd  %xmm1,%xmm0
movsd  0xbfc(%rip),%xmm1
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x30(%rbp)
movss  -0x4(%rbp),%xmm0
cvtss2sd %xmm0,%xmm1
movsd  0xbda(%rip),%xmm0
divsd  %xmm1,%xmm0
call   1070 <sqrt@plt>
movsd  %xmm0,-0x48(%rbp)
movsd  -0x10(%rbp),%xmm0
call   1040 <sin@plt>
movsd  %xmm0,-0x58(%rbp)
movsd  -0x28(%rbp),%xmm0
movsd  %xmm0,-0x50(%rbp)
movss  -0x8(%rbp),%xmm0
movss  %xmm0,-0x5c(%rbp)
movsd  -0x10(%rbp),%xmm0
call   1050 <cos@plt>
movss  -0x5c(%rbp),%xmm2
movsd  -0x58(%rbp),%xmm1
movsd  -0x50(%rbp),%xmm3
movaps %xmm0,%xmm4
movsd  -0x48(%rbp),%xmm0
mulss  %xmm4,%xmm2
cvtss2sd %xmm2,%xmm2
mulsd  -0x30(%rbp),%xmm2
mulsd  %xmm3,%xmm1
addsd  %xmm2,%xmm1
mulsd  %xmm1,%xmm0
movsd  %xmm0,-0x20(%rbp)
movsd  -0x20(%rbp),%xmm0
cvtsd2ss %xmm0,%xmm0
add    $0x60,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<bessy1>:
sub    $0x38,%rsp
cvtss2sd %xmm0,%xmm2
movss  0xea0(%rip),%xmm1
ucomiss %xmm0,%xmm1
jbe    1263 <bessy1+0x113>
movaps %xmm0,%xmm1
mulss  %xmm0,%xmm1
cvtss2sd %xmm1,%xmm3
movss  %xmm0,0x10(%rsp)
movsd  0xee6(%rip),%xmm1
mulsd  %xmm3,%xmm1
addsd  0xee2(%rip),%xmm1
mulsd  %xmm3,%xmm1
addsd  0xede(%rip),%xmm1
mulsd  %xmm3,%xmm1
addsd  0xeda(%rip),%xmm1
mulsd  %xmm3,%xmm1
addsd  0xed6(%rip),%xmm1
mulsd  %xmm3,%xmm1
addsd  0xed2(%rip),%xmm1
movapd %xmm1,%xmm4
movsd  0xece(%rip),%xmm1
addsd  %xmm3,%xmm1
mulsd  %xmm3,%xmm1
addsd  0xec6(%rip),%xmm1
mulsd  %xmm3,%xmm1
addsd  0xec2(%rip),%xmm1
mulsd  %xmm3,%xmm1
addsd  0xebe(%rip),%xmm1
mulsd  %xmm2,%xmm4
mulsd  %xmm3,%xmm1
addsd  0xeb6(%rip),%xmm1
mulsd  %xmm3,%xmm1
addsd  0xeb2(%rip),%xmm1
divsd  %xmm1,%xmm4
movsd  %xmm4,0x8(%rsp)
movsd  %xmm2,0x20(%rsp)
call   1030 <bessj1@plt>
cvtss2sd %xmm0,%xmm0
movsd  %xmm0,0x18(%rsp)
movss  0x10(%rsp),%xmm0
call   1060 <log@plt>
movsd  0xe88(%rip),%xmm1
divsd  0x20(%rsp),%xmm1
mulsd  0x18(%rsp),%xmm0
addsd  %xmm1,%xmm0
mulsd  0xe08(%rip),%xmm0
addsd  0x8(%rsp),%xmm0
jmp    137a <bessy1+0x22a>
divss  %xmm0,%xmm1
movss  %xmm1,0x20(%rsp)
movaps %xmm1,%xmm0
mulss  %xmm1,%xmm0
cvtss2sd %xmm0,%xmm0
movsd  0xd90(%rip),%xmm1
mulsd  %xmm0,%xmm1
addsd  0xd8c(%rip),%xmm1
mulsd  %xmm0,%xmm1
addsd  0xd88(%rip),%xmm1
mulsd  %xmm0,%xmm1
addsd  0xd84(%rip),%xmm1
mulsd  %xmm0,%xmm1
addsd  0xd80(%rip),%xmm1
movsd  %xmm1,0x18(%rsp)
movsd  0xd7a(%rip),%xmm1
mulsd  %xmm0,%xmm1
addsd  0xd76(%rip),%xmm1
movsd  0xd36(%rip),%xmm3
mulsd  %xmm0,%xmm1
addsd  0xd6a(%rip),%xmm1
addsd  %xmm2,%xmm3
movsd  %xmm3,0x8(%rsp)
mulsd  %xmm0,%xmm1
addsd  0xd5c(%rip),%xmm1
mulsd  %xmm0,%xmm1
addsd  0xd58(%rip),%xmm1
movsd  %xmm1,0x10(%rsp)
movsd  0xd52(%rip),%xmm0
divsd  %xmm2,%xmm0
xorpd  %xmm1,%xmm1
ucomisd %xmm1,%xmm0
jb     1322 <bessy1+0x1d2>
sqrtsd %xmm0,%xmm0
jmp    1327 <bessy1+0x1d7>
call   1070 <sqrt@plt>
movsd  %xmm0,0x28(%rsp)
movsd  0x8(%rsp),%xmm0
call   1040 <sin@plt>
movsd  %xmm0,0x30(%rsp)
movsd  0x8(%rsp),%xmm0
call   1050 <cos@plt>
movss  0x20(%rsp),%xmm1
mulss  %xmm0,%xmm1
xorps  %xmm0,%xmm0
cvtss2sd %xmm1,%xmm0
movsd  0x10(%rsp),%xmm1
mulsd  %xmm0,%xmm1
movsd  0x30(%rsp),%xmm0
mulsd  0x18(%rsp),%xmm0
addsd  %xmm1,%xmm0
mulsd  0x28(%rsp),%xmm0
cvtsd2ss %xmm0,%xmm0
add    $0x38,%rsp
ret

LLVM IR (-O0):
define float @bessy1(float %0) {
%2 = alloca float
%3 = alloca float
%4 = alloca double
%5 = alloca double
%6 = alloca double
%7 = alloca double
%8 = alloca double
store float %0, float* %2
%9 = load float, float* %2
%10 = fpext float %9 to double
%11 = fcmp olt double %10, 8.000000e+00
br i1 %11, label %12, label %56
12: ; preds = %1
%13 = load float, float* %2
%14 = load float, float* %2
%15 = fmul float %13, %14
%16 = fpext float %15 to double
store double %16, double* %5
%17 = load float, float* %2
%18 = fpext float %17 to double
%19 = load double, 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 %23, double 0x40C09FF80E410B63, double 0xC1502A98AE76C8B4)
%25 = call double @llvm.fmuladd.f64(double %22, double %24, double 0x41C5E70B3B8CCCCD)
%26 = call double @llvm.fmuladd.f64(double %21, double %25, double 0xC227FF60829C0000)
%27 = call double @llvm.fmuladd.f64(double %20, double %26, double 0x42728EC46E9F0000)
%28 = call double @llvm.fmuladd.f64(double %19, double %27, double 0xC291D40B446A6000)
%29 = fmul double %18, %28
store double %29, double* %7
%30 = load double, double* %5
%31 = load double, double* %5
%32 = load double, double* %5
%33 = load double, double* %5
%34 = load double, double* %5
%35 = load double, double* %5
%36 = fadd double 0x40762F69A133C1CE, %35
%37 = call double @llvm.fmuladd.f64(double %34, double %36, double 0x40F8E9A9AE147AE1)
%38 = call double @llvm.fmuladd.f64(double %33, double %37, double 0x41756B2A0051EB85)
%39 = call double @llvm.fmuladd.f64(double %32, double %38, double 0x41EBD15F77E00000)
%40 = call double @llvm.fmuladd.f64(double %31, double %39, double 0x4258B4AD9BD00000)
%41 = call double @llvm.fmuladd.f64(double %30, double %40, double 0x42B6BBCA1E9FA000)
store double %41, double* %8
%42 = load double, double* %7
%43 = load double, double* %8
%44 = fdiv double %42, %43
%45 = load float, float* %2
%46 = call float @bessj1(float %45)
%47 = fpext float %46 to double
%48 = load float, float* %2
%49 = call double @log(float %48)
%50 = load float, float* %2
%51 = fpext float %50 to double
%52 = fdiv double 1.000000e+00, %51
%53 = fneg double %52
%54 = call double @llvm.fmuladd.f64(double %47, double %49, double %53)
%55 = call double @llvm.fmuladd.f64(double 0x3FE45F306D974364, double %54, double %44)
store double %55, double* %6
br label %100
56: ; preds = %1
%57 = load float, float* %2
%58 = fpext float %57 to double
%59 = fdiv double 8.000000e+00, %58
%60 = fptrunc double %59 to float
store float %60, float* %3
%61 = load float, float* %3
%62 = load float, float* %3
%63 = fmul float %61, %62
%64 = fpext float %63 to double
store double %64, double* %5
%65 = load float, float* %2
%66 = fpext float %65 to double
%67 = fsub double %66, 0x4002D97C7F4EE208
store double %67, double* %4
%68 = load double, double* %5
%69 = load double, double* %5
%70 = load double, double* %5
%71 = load double, double* %5
%72 = call double @llvm.fmuladd.f64(double %71, double 0xBE9020F5634D8D14, double 0x3EC49D7C00DF0E15)
%73 = call double @llvm.fmuladd.f64(double %70, double %72, double 0xBF026FA0A2D15CD3)
%74 = call double @llvm.fmuladd.f64(double %69, double %73, double 1.831050e-03)
%75 = call double @llvm.fmuladd.f64(double %68, double %74, double 1.000000e+00)
store double %75, double* %7
%76 = load double, double* %5
%77 = load double, double* %5
%78 = load double, double* %5
%79 = load double, double* %5
%80 = call double @llvm.fmuladd.f64(double %79, double 0x3E7C65A7D5438122, double 0xBEAD9ACFF13878F1)
%81 = call double @llvm.fmuladd.f64(double %78, double %80, double 0x3EE1B82114D8A643)
%82 = call double @llvm.fmuladd.f64(double %77, double %81, double 0xBF2A3FEA5C574380)
%83 = call double @llvm.fmuladd.f64(double %76, double %82, double 0x3FA7FFFFFF920C81)
store double %83, double* %8
%84 = load float, float* %2
%85 = fpext float %84 to double
%86 = fdiv double 0x3FE45F306D974364, %85
%87 = call double @sqrt(double %86)
%88 = load double, double* %4
%89 = call double @sin(double %88)
%90 = load double, double* %7
%91 = load float, float* %3
%92 = load double, double* %4
%93 = call float @cos(double %92)
%94 = fmul float %91, %93
%95 = fpext float %94 to double
%96 = load double, double* %8
%97 = fmul double %95, %96
%98 = call double @llvm.fmuladd.f64(double %89, double %90, double %97)
%99 = fmul double %87, %98
store double %99, double* %6
br label %100
100: ; preds = %56, %12
%101 = load double, double* %6
%102 = fptrunc double %101 to float
ret float %102
}

LLVM IR (-O2):
define float @bessy1(float %0) {
%2 = fpext float %0 to double
%3 = fcmp olt float %0, 8.000000e+00
br i1 %3, label %4, label %26
4: ; preds = %1
%5 = fmul float %0, %0
%6 = fpext float %5 to double
%7 = tail call double @llvm.fmuladd.f64(double %6, double 0x40C09FF80E410B63, double 0xC1502A98AE76C8B4)
%8 = tail call double @llvm.fmuladd.f64(double %6, double %7, double 0x41C5E70B3B8CCCCD)
%9 = tail call double @llvm.fmuladd.f64(double %6, double %8, double 0xC227FF60829C0000)
%10 = tail call double @llvm.fmuladd.f64(double %6, double %9, double 0x42728EC46E9F0000)
%11 = tail call double @llvm.fmuladd.f64(double %6, double %10, double 0xC291D40B446A6000)
%12 = fmul double %11, %2
%13 = fadd double %6, 0x40762F69A133C1CE
%14 = tail call double @llvm.fmuladd.f64(double %6, double %13, double 0x40F8E9A9AE147AE1)
%15 = tail call double @llvm.fmuladd.f64(double %6, double %14, double 0x41756B2A0051EB85)
%16 = tail call double @llvm.fmuladd.f64(double %6, double %15, double 0x41EBD15F77E00000)
%17 = tail call double @llvm.fmuladd.f64(double %6, double %16, double 0x4258B4AD9BD00000)
%18 = tail call double @llvm.fmuladd.f64(double %6, double %17, double 0x42B6BBCA1E9FA000)
%19 = fdiv double %12, %18
%20 = tail call float @bessj1(float %0)
%21 = fpext float %20 to double
%22 = tail call double @log(float %0)
%23 = fdiv double -1.000000e+00, %2
%24 = tail call double @llvm.fmuladd.f64(double %21, double %22, double %23)
%25 = tail call double @llvm.fmuladd.f64(double %24, double 0x3FE45F306D974364, double %19)
br label %48
26: ; preds = %1
%27 = fdiv float 8.000000e+00, %0
%28 = fmul float %27, %27
%29 = fpext float %28 to double
%30 = fadd double %2, 0xC002D97C7F4EE208
%31 = tail call double @llvm.fmuladd.f64(double %29, double 0xBE9020F5634D8D14, double 0x3EC49D7C00DF0E15)
%32 = tail call double @llvm.fmuladd.f64(double %29, double %31, double 0xBF026FA0A2D15CD3)
%33 = tail call double @llvm.fmuladd.f64(double %29, double %32, double 1.831050e-03)
%34 = tail call double @llvm.fmuladd.f64(double %29, double %33, double 1.000000e+00)
%35 = tail call double @llvm.fmuladd.f64(double %29, double 0x3E7C65A7D5438122, double 0xBEAD9ACFF13878F1)
%36 = tail call double @llvm.fmuladd.f64(double %29, double %35, double 0x3EE1B82114D8A643)
%37 = tail call double @llvm.fmuladd.f64(double %29, double %36, double 0xBF2A3FEA5C574380)
%38 = tail call double @llvm.fmuladd.f64(double %29, double %37, double 0x3FA7FFFFFF920C81)
%39 = fdiv double 0x3FE45F306D974364, %2
%40 = tail call double @sqrt(double %39)
%41 = tail call double @sin(double %30)
%42 = tail call float @cos(double %30)
%43 = fmul float %27, %42
%44 = fpext float %43 to double
%45 = fmul double %38, %44
%46 = tail call double @llvm.fmuladd.f64(double %41, double %34, double %45)
%47 = fmul double %40, %46
br label %48
48: ; preds = %26, %4
%49 = phi double [ %25, %4 ], [ %47, %26 ]
%50 = fptrunc double %49 to float
ret float %50
}