#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 cos(double);
double fmoonl(double time) {
  double B0 = 481267.8809, C0 = 218.3162;
  double A[] = {
      62888.0E-4, 12740.0E-4, 6583.0E-4, 2136.0E-4, 1851.0E-4, 1144.0E-4,
      588.0E-4,   571.0E-4,   533.0E-4,  458.0E-4,  409.0E-4,  347.0E-4,
      304.0E-4,   154.0E-4,   125.0E-4,  110.0E-4,  107.0E-4,  100.0E-4,
      85.0E-4,    79.0E-4,    68.0E-4,   52.0E-4,   50.0E-4,   40.0E-4,
      40.0E-4,    40.0E-4,    38.0E-4,   37.0E-4,   28.0E-4,   27.0E-4,
      26.0E-4,    24.0E-4,    23.0E-4,   22.0E-4,   21.0E-4,   21.0E-4,
      21.0E-4,    18.0E-4,    16.0E-4,   12.0E-4,   11.0E-4,   9.0E-4,
      8.0E-4,     7.0E-4,     7.0E-4,    7.0E-4,    7.0E-4,    6.0E-4,
      6.0E-4,     5.0E-4,     5.0E-4,    5.0E-4,    4.0E-4,    4.0E-4,
      3.0E-4,     3.0E-4,     3.0E-4,    3.0E-4,    3.0E-4,    3.0E-4,
      3.0E-4};
  double B[] = {
      477198.868E0, 413335.35E0, 890534.22E0, 954397.74E0,   35999.050E0,
      966404.00E0,  63863.50E0,  377336.30E0, 1367733.100E0, 854535.20E0,
      441199.80E0,  445267.10E0, 513197.9E0,  75870.0E0,     1443603.0E0,
      489205.0E0,   1303870.0E0, 1431597.0E0, 826671.0E0,    449334.0E0,
      926533.0E0,   31932.0E0,   481266.0E0,  1331734.0E0,   1844932.0E0,
      133.0E0,      1781068.0E0, 541062.0E0,  1934.0E0,      918399.0E0,
      1379739.0E0,  99863.0E0,   922466.0E0,  818536.0E0,    990397.0E0,
      71998.0E0,    341337.0E0,  401329.0E0,  1856938.0E0,   1267871.0E0,
      1920802.0E0,  858602.0E0,  1403732.0E0, 790672.0E0,    405201.0E0,
      485333.0E0,   27864.0E0,   111869.0E0,  2258267.0E0,   1908795.0E0,
      1745069.0E0,  509131.0E0,  39871.0E0,   12006.0E0,     958465.0E0,
      381404.0E0,   349472.0E0,  1808933.0E0, 549197.0E0,    4067.0E0,
      2322131.0E0};
  double C[] = {
      44.963E0, 10.74E0, 145.70E0, 179.93E0, 87.53E0, 276.5E0, 124.2E0, 13.2E0,
      280.7E0,  148.2E0, 47.4E0,   27.9E0,   222.5E0, 41.0E0,  52.0E0,  142.0E0,
      246.0E0,  315.0E0, 111.0E0,  188.0E0,  323.0E0, 107.0E0, 205.0E0, 283.0E0,
      56.0E0,   29.0E0,  21.0E0,   259.0E0,  145.0E0, 182.0E0, 17.0E0,  122.0E0,
      163.0E0,  151.0E0, 357.0E0,  85.0E0,   16.0E0,  274.0E0, 152.0E0, 249.0E0,
      186.0E0,  129.0E0, 98.0E0,   114.0E0,  50.0E0,  186.0E0, 127.0E0, 38.0E0,
      156.0E0,  90.0E0,  24.0E0,   242.0E0,  223.0E0, 187.0E0, 340.0E0, 354.0E0,
      337.0E0,  58.0E0,  220.0E0,  70.0E0,   191.0E0};
  double fmoonl = 0, temp;
  int i;
  for (i = 0; i < 61; i++) {
    temp = (B[i] * time + C[i]) * 0.0174532925199433;
    fmoonl += A[i] * cos(temp);
  }
  fmoonl = (fmoonl + B0 * time + C0) * 0.0174532925199433;
  return (fmoonl);
}


x86 assembly (clang, -O0):
<fmoonl>:
push   %rbp
mov    %rsp,%rbp
sub    $0x600,%rsp
movsd  %xmm0,-0x8(%rbp)
movsd  0xed0(%rip),%xmm0
movsd  %xmm0,-0x10(%rbp)
movsd  0xebb(%rip),%xmm0
movsd  %xmm0,-0x18(%rbp)
lea    -0x200(%rbp),%rdi
lea    0xec8(%rip),%rsi
mov    $0x1e8,%edx
call   1030 <memcpy@plt>
lea    -0x3f0(%rbp),%rdi
lea    0x10a0(%rip),%rsi
mov    $0x1e8,%edx
call   1030 <memcpy@plt>
lea    -0x5e0(%rbp),%rdi
lea    0x1278(%rip),%rsi
mov    $0x1e8,%edx
call   1030 <memcpy@plt>
xorps  %xmm0,%xmm0
movsd  %xmm0,-0x5e8(%rbp)
ff
movl   $0x0,-0x5f4(%rbp)
cmpl   $0x3d,-0x5f4(%rbp)
jge    1251 <fmoonl+0x131>
movslq -0x5f4(%rbp),%rax
movsd  -0x3f0(%rbp,%rax,8),%xmm0
ff ff
movsd  -0x8(%rbp),%xmm2
movslq -0x5f4(%rbp),%rax
movsd  -0x5e0(%rbp,%rax,8),%xmm1
ff ff
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  0xe27(%rip),%xmm1
mulsd  %xmm1,%xmm0
movsd  %xmm0,-0x5f0(%rbp)
ff
movslq -0x5f4(%rbp),%rax
movsd  -0x200(%rbp,%rax,8),%xmm0
ff ff
movsd  %xmm0,-0x600(%rbp)
ff
movsd  -0x5f0(%rbp),%xmm0
ff
call   1040 <cos@plt>
movaps %xmm0,%xmm2
movsd  -0x600(%rbp),%xmm0
ff
movsd  -0x5e8(%rbp),%xmm1
ff
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x5e8(%rbp)
ff
mov    -0x5f4(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x5f4(%rbp)
jmp    11a7 <fmoonl+0x87>
movsd  -0x5e8(%rbp),%xmm1
ff
movsd  -0x10(%rbp),%xmm0
movsd  -0x8(%rbp),%xmm2
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
addsd  -0x18(%rbp),%xmm0
movsd  0xd98(%rip),%xmm1
mulsd  %xmm1,%xmm0
movsd  %xmm0,-0x5e8(%rbp)
ff
movsd  -0x5e8(%rbp),%xmm0
ff
add    $0x600,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<fmoonl>:
push   %r15
push   %r14
push   %r12
push   %rbx
sub    $0x18,%rsp
movsd  %xmm0,0x10(%rsp)
xorpd  %xmm0,%xmm0
movsd  %xmm0,0x8(%rsp)
mov    $0x1,%ebx
lea    0x10d9(%rip),%r14
lea    0x12c2(%rip),%r15
lea    0xedb(%rip),%r12
cs nopw 0x0(%rax,%rax,1)
nop
movsd  -0x8(%r14,%rbx,8),%xmm0
mulsd  0x10(%rsp),%xmm0
addsd  -0x8(%r15,%rbx,8),%xmm0
mulsd  0xe94(%rip),%xmm0
call   1030 <cos@plt>
movapd %xmm0,%xmm1
mulsd  -0x8(%r12,%rbx,8),%xmm1
addsd  0x8(%rsp),%xmm1
cmp    $0x3d,%rbx
je     11c5 <fmoonl+0xb5>
movsd  (%r14,%rbx,8),%xmm0
mulsd  0x10(%rsp),%xmm0
addsd  (%r15,%rbx,8),%xmm0
mulsd  0xe5e(%rip),%xmm0
movsd  %xmm1,0x8(%rsp)
call   1030 <cos@plt>
mulsd  (%r12,%rbx,8),%xmm0
addsd  0x8(%rsp),%xmm0
movsd  %xmm0,0x8(%rsp)
add    $0x2,%rbx
jmp    1150 <fmoonl+0x40>
movsd  0x10(%rsp),%xmm0
mulsd  0xe35(%rip),%xmm0
addsd  %xmm1,%xmm0
addsd  0xe31(%rip),%xmm0
mulsd  0xe19(%rip),%xmm0
add    $0x18,%rsp
pop    %rbx
pop    %r12
pop    %r14
pop    %r15
ret

LLVM IR (-O0):
@__const.fmoonl.A = [61 x double] [double 6.288800e+00, double 1.274000e+00, double 6.583000e-01, double 2.136000e-01, double 1.851000e-01, double 1.144000e-01, double 5.880000e-02, double 5.710000e-02, double 5.330000e-02, double 4.580000e-02, double 4.090000e-02, double 3.470000e-02, double 3.040000e-02, double 1.540000e-02, double 1.250000e-02, double 1.100000e-02, double 1.070000e-02, double 1.000000e-02, double 8.500000e-03, double 7.900000e-03, double 0x3F7BDA5119CE075F, double 5.200000e-03, double 5.000000e-03, double 4.000000e-03, double 4.000000e-03, double 4.000000e-03, double 3.800000e-03, double 3.700000e-03, double 2.800000e-03, double 2.700000e-03, double 2.600000e-03, double 2.400000e-03, double 2.300000e-03, double 2.200000e-03, double 2.100000e-03, double 2.100000e-03, double 2.100000e-03, double 1.800000e-03, double 1.600000e-03, double 1.200000e-03, double 1.100000e-03, double 9.000000e-04, double 8.000000e-04, double 7.000000e-04, double 7.000000e-04, double 7.000000e-04, double 7.000000e-04, double 6.000000e-04, double 6.000000e-04, double 5.000000e-04, double 5.000000e-04, double 5.000000e-04, double 4.000000e-04, double 4.000000e-04, double 3.000000e-04, double 3.000000e-04, double 3.000000e-04, double 3.000000e-04, double 3.000000e-04, double 3.000000e-04, double 3.000000e-04]
@__const.fmoonl.B = [61 x double] [double 0x411D203B78D4FDF4, double 0x41193A5D66666666, double 0x412B2D4C70A3D70A, double 0x412D203B7AE147AE, double 0x40E193E19999999A, double 9.664040e+05, double 6.386350e+04, double 0x411707E133333333, double 0x4134DEB51999999A, double 0x412A140E66666666, double 0x411AEDBF33333333, double 0x411B2D4C66666666, double 0x411F52B79999999A, double 7.587000e+04, double 0x4136071300000000, double 4.892050e+05, double 1.303870e+06, double 0x4135D82D00000000, double 8.266710e+05, double 4.493340e+05, double 9.265330e+05, double 3.193200e+04, double 4.812660e+05, double 0x4134521600000000, double 0x413C26C400000000, double 1.330000e+02, double 0x413B2D4C00000000, double 5.410620e+05, double 1.934000e+03, double 9.183990e+05, double 0x41350D9B00000000, double 9.986300e+04, double 9.224660e+05, double 8.185360e+05, double 9.903970e+05, double 7.199800e+04, double 3.413370e+05, double 4.013290e+05, double 0x413C55AA00000000, double 0x4133589F00000000, double 0x413D4F2200000000, double 8.586020e+05, double 0x41356B5400000000, double 7.906720e+05, double 4.052010e+05, double 4.853330e+05, double 2.786400e+04, double 1.118690e+05, double 0x41413AAD80000000, double 0x413D203B00000000, double 0x413AA0AD00000000, double 5.091310e+05, double 3.987100e+04, double 1.200600e+04, double 9.584650e+05, double 3.814040e+05, double 3.494720e+05, double 0x413B9A2500000000, double 5.491970e+05, double 4.067000e+03, double 0x4141B76980000000]
@__const.fmoonl.C = [61 x double] [double 4.496300e+01, double 1.074000e+01, double 1.457000e+02, double 1.799300e+02, double 8.753000e+01, double 2.765000e+02, double 1.242000e+02, double 1.320000e+01, double 2.807000e+02, double 1.482000e+02, double 4.740000e+01, double 2.790000e+01, double 2.225000e+02, double 4.100000e+01, double 5.200000e+01, double 1.420000e+02, double 2.460000e+02, double 3.150000e+02, double 1.110000e+02, double 1.880000e+02, double 3.230000e+02, double 1.070000e+02, double 2.050000e+02, double 2.830000e+02, double 5.600000e+01, double 2.900000e+01, double 2.100000e+01, double 2.590000e+02, double 1.450000e+02, double 1.820000e+02, double 1.700000e+01, double 1.220000e+02, double 1.630000e+02, double 1.510000e+02, double 3.570000e+02, double 8.500000e+01, double 1.600000e+01, double 2.740000e+02, double 1.520000e+02, double 2.490000e+02, double 1.860000e+02, double 1.290000e+02, double 9.800000e+01, double 1.140000e+02, double 5.000000e+01, double 1.860000e+02, double 1.270000e+02, double 3.800000e+01, double 1.560000e+02, double 9.000000e+01, double 2.400000e+01, double 2.420000e+02, double 2.230000e+02, double 1.870000e+02, double 3.400000e+02, double 3.540000e+02, double 3.370000e+02, double 5.800000e+01, double 2.200000e+02, double 7.000000e+01, double 1.910000e+02]
define double @fmoonl(double %0) {
%2 = alloca double
%3 = alloca double
%4 = alloca double
%5 = alloca [61 x double]
%6 = alloca [61 x double]
%7 = alloca [61 x double]
%8 = alloca double
%9 = alloca double
%10 = alloca i32
store double %0, double* %2
store double 0x411D5FCF860AA64C, double* %3
store double 0x406B4A1E4F765FD9, double* %4
%11 = bitcast [61 x double]* %5 to i8*
%12 = bitcast [61 x double]* %6 to i8*
%13 = bitcast [61 x double]* %7 to i8*
store double 0.000000e+00, double* %8
store i32 0, i32* %10
br label %14
14: ; preds = %37, %1
%15 = load i32, i32* %10
%16 = icmp slt i32 %15, 61
br i1 %16, label %17, label %40
17: ; preds = %14
%18 = load i32, i32* %10
%19 = sext i32 %18 to i64
%20 = getelementptr inbounds [61 x double], [61 x double]* %6, i64 0, i64 %19
%21 = load double, double* %20
%22 = load double, double* %2
%23 = load i32, i32* %10
%24 = sext i32 %23 to i64
%25 = getelementptr inbounds [61 x double], [61 x double]* %7, i64 0, i64 %24
%26 = load double, double* %25
%27 = call double @llvm.fmuladd.f64(double %21, double %22, double %26)
%28 = fmul double %27, 0x3F91DF46A2529D3A
store double %28, double* %9
%29 = load i32, i32* %10
%30 = sext i32 %29 to i64
%31 = getelementptr inbounds [61 x double], [61 x double]* %5, i64 0, i64 %30
%32 = load double, double* %31
%33 = load double, double* %9
%34 = call double @cos(double %33)
%35 = load double, double* %8
%36 = call double @llvm.fmuladd.f64(double %32, double %34, double %35)
store double %36, double* %8
br label %37
37: ; preds = %17
%38 = load i32, i32* %10
%39 = add nsw i32 %38, 1
store i32 %39, i32* %10
br label %14
40: ; preds = %14
%41 = load double, double* %8
%42 = load double, double* %3
%43 = load double, double* %2
%44 = call double @llvm.fmuladd.f64(double %42, double %43, double %41)
%45 = load double, double* %4
%46 = fadd double %44, %45
%47 = fmul double %46, 0x3F91DF46A2529D3A
store double %47, double* %8
%48 = load double, double* %8
ret double %48
}

LLVM IR (-O2):
@__const.fmoonl.A = [61 x double] [double 6.288800e+00, double 1.274000e+00, double 6.583000e-01, double 2.136000e-01, double 1.851000e-01, double 1.144000e-01, double 5.880000e-02, double 5.710000e-02, double 5.330000e-02, double 4.580000e-02, double 4.090000e-02, double 3.470000e-02, double 3.040000e-02, double 1.540000e-02, double 1.250000e-02, double 1.100000e-02, double 1.070000e-02, double 1.000000e-02, double 8.500000e-03, double 7.900000e-03, double 0x3F7BDA5119CE075F, double 5.200000e-03, double 5.000000e-03, double 4.000000e-03, double 4.000000e-03, double 4.000000e-03, double 3.800000e-03, double 3.700000e-03, double 2.800000e-03, double 2.700000e-03, double 2.600000e-03, double 2.400000e-03, double 2.300000e-03, double 2.200000e-03, double 2.100000e-03, double 2.100000e-03, double 2.100000e-03, double 1.800000e-03, double 1.600000e-03, double 1.200000e-03, double 1.100000e-03, double 9.000000e-04, double 8.000000e-04, double 7.000000e-04, double 7.000000e-04, double 7.000000e-04, double 7.000000e-04, double 6.000000e-04, double 6.000000e-04, double 5.000000e-04, double 5.000000e-04, double 5.000000e-04, double 4.000000e-04, double 4.000000e-04, double 3.000000e-04, double 3.000000e-04, double 3.000000e-04, double 3.000000e-04, double 3.000000e-04, double 3.000000e-04, double 3.000000e-04]
@__const.fmoonl.B = [61 x double] [double 0x411D203B78D4FDF4, double 0x41193A5D66666666, double 0x412B2D4C70A3D70A, double 0x412D203B7AE147AE, double 0x40E193E19999999A, double 9.664040e+05, double 6.386350e+04, double 0x411707E133333333, double 0x4134DEB51999999A, double 0x412A140E66666666, double 0x411AEDBF33333333, double 0x411B2D4C66666666, double 0x411F52B79999999A, double 7.587000e+04, double 0x4136071300000000, double 4.892050e+05, double 1.303870e+06, double 0x4135D82D00000000, double 8.266710e+05, double 4.493340e+05, double 9.265330e+05, double 3.193200e+04, double 4.812660e+05, double 0x4134521600000000, double 0x413C26C400000000, double 1.330000e+02, double 0x413B2D4C00000000, double 5.410620e+05, double 1.934000e+03, double 9.183990e+05, double 0x41350D9B00000000, double 9.986300e+04, double 9.224660e+05, double 8.185360e+05, double 9.903970e+05, double 7.199800e+04, double 3.413370e+05, double 4.013290e+05, double 0x413C55AA00000000, double 0x4133589F00000000, double 0x413D4F2200000000, double 8.586020e+05, double 0x41356B5400000000, double 7.906720e+05, double 4.052010e+05, double 4.853330e+05, double 2.786400e+04, double 1.118690e+05, double 0x41413AAD80000000, double 0x413D203B00000000, double 0x413AA0AD00000000, double 5.091310e+05, double 3.987100e+04, double 1.200600e+04, double 9.584650e+05, double 3.814040e+05, double 3.494720e+05, double 0x413B9A2500000000, double 5.491970e+05, double 4.067000e+03, double 0x4141B76980000000]
@__const.fmoonl.C = [61 x double] [double 4.496300e+01, double 1.074000e+01, double 1.457000e+02, double 1.799300e+02, double 8.753000e+01, double 2.765000e+02, double 1.242000e+02, double 1.320000e+01, double 2.807000e+02, double 1.482000e+02, double 4.740000e+01, double 2.790000e+01, double 2.225000e+02, double 4.100000e+01, double 5.200000e+01, double 1.420000e+02, double 2.460000e+02, double 3.150000e+02, double 1.110000e+02, double 1.880000e+02, double 3.230000e+02, double 1.070000e+02, double 2.050000e+02, double 2.830000e+02, double 5.600000e+01, double 2.900000e+01, double 2.100000e+01, double 2.590000e+02, double 1.450000e+02, double 1.820000e+02, double 1.700000e+01, double 1.220000e+02, double 1.630000e+02, double 1.510000e+02, double 3.570000e+02, double 8.500000e+01, double 1.600000e+01, double 2.740000e+02, double 1.520000e+02, double 2.490000e+02, double 1.860000e+02, double 1.290000e+02, double 9.800000e+01, double 1.140000e+02, double 5.000000e+01, double 1.860000e+02, double 1.270000e+02, double 3.800000e+01, double 1.560000e+02, double 9.000000e+01, double 2.400000e+01, double 2.420000e+02, double 2.230000e+02, double 1.870000e+02, double 3.400000e+02, double 3.540000e+02, double 3.370000e+02, double 5.800000e+01, double 2.200000e+02, double 7.000000e+01, double 1.910000e+02]
define double @fmoonl(double %0) {
br label %2
2: ; preds = %17, %1
%3 = phi i64 [ 0, %1 ], [ %28, %17 ]
%4 = phi double [ 0.000000e+00, %1 ], [ %27, %17 ]
%5 = getelementptr inbounds [61 x double], [61 x double]* @__const.fmoonl.B, i64 0, i64 %3
%6 = load double, double* %5
%7 = getelementptr inbounds [61 x double], [61 x double]* @__const.fmoonl.C, i64 0, i64 %3
%8 = load double, double* %7
%9 = tail call double @llvm.fmuladd.f64(double %6, double %0, double %8)
%10 = fmul double %9, 0x3F91DF46A2529D3A
%11 = getelementptr inbounds [61 x double], [61 x double]* @__const.fmoonl.A, i64 0, i64 %3
%12 = load double, double* %11
%13 = tail call double @cos(double %10)
%14 = tail call double @llvm.fmuladd.f64(double %12, double %13, double %4)
%15 = or i64 %3, 1
%16 = icmp eq i64 %15, 61
br i1 %16, label %29, label %17
17: ; preds = %2
%18 = getelementptr inbounds [61 x double], [61 x double]* @__const.fmoonl.B, i64 0, i64 %15
%19 = load double, double* %18
%20 = getelementptr inbounds [61 x double], [61 x double]* @__const.fmoonl.C, i64 0, i64 %15
%21 = load double, double* %20
%22 = tail call double @llvm.fmuladd.f64(double %19, double %0, double %21)
%23 = fmul double %22, 0x3F91DF46A2529D3A
%24 = getelementptr inbounds [61 x double], [61 x double]* @__const.fmoonl.A, i64 0, i64 %15
%25 = load double, double* %24
%26 = tail call double @cos(double %23)
%27 = tail call double @llvm.fmuladd.f64(double %25, double %26, double %14)
%28 = add nuw nsw i64 %3, 2
br label %2
29: ; preds = %2
%30 = tail call double @llvm.fmuladd.f64(double %0, double 0x411D5FCF860AA64C, double %14)
%31 = fadd double %30, 0x406B4A1E4F765FD9
%32 = fmul double %31, 0x3F91DF46A2529D3A
ret double %32
}