#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 sin(double);
double eccentricAnomaly(double M, double e) {
  int counter = 1000;
  double Emin = M - 1.0, Emax = M + 1.0, E = M;
  double f, dfm, dE;
  do {
    f = M + (e * sin(E)) - E;
    dfm = 1.0 - (e * cos(E));
    dE = dfm * 1.0e-4;
    if (f > dE) {
      Emin = E;
      dE = Emax - Emin;
      if ((dfm * dE) > f)
        E += (f / dfm);
      else
        E = 0.5 * (Emax + Emin);
    } else if (f < (-dE)) {
      Emax = E;
      dE = Emax - Emin;
      if ((dfm * dE) > -f)
        E += (f / dfm);
      else
        E = 0.5 * (Emax + Emin);
    } else
      return (E);
  } while ((dE > 1.0e-4) && ((--counter) > 0));
  return (E);
}


x86 assembly (clang, -O0):
<eccentricAnomaly>:
push   %rbp
mov    %rsp,%rbp
sub    $0x70,%rsp
movsd  %xmm0,-0x10(%rbp)
movsd  %xmm1,-0x18(%rbp)
movl   $0x3e8,-0x1c(%rbp)
movsd  -0x10(%rbp),%xmm0
movsd  0xeba(%rip),%xmm1
subsd  %xmm1,%xmm0
movsd  %xmm0,-0x28(%rbp)
movsd  0xea9(%rip),%xmm0
addsd  -0x10(%rbp),%xmm0
movsd  %xmm0,-0x30(%rbp)
movsd  -0x10(%rbp),%xmm0
movsd  %xmm0,-0x38(%rbp)
movsd  -0x10(%rbp),%xmm0
movsd  %xmm0,-0x68(%rbp)
movsd  -0x18(%rbp),%xmm0
movsd  %xmm0,-0x60(%rbp)
movsd  -0x38(%rbp),%xmm0
call   1030 <sin@plt>
movsd  -0x68(%rbp),%xmm1
movaps %xmm0,%xmm2
movsd  -0x60(%rbp),%xmm0
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
subsd  -0x38(%rbp),%xmm0
movsd  %xmm0,-0x40(%rbp)
movsd  -0x18(%rbp),%xmm0
movsd  %xmm0,-0x58(%rbp)
movsd  -0x38(%rbp),%xmm0
call   1040 <cos@plt>
movaps %xmm0,%xmm1
movsd  -0x58(%rbp),%xmm0
movq   %xmm0,%rax
movabs $0x8000000000000000,%rcx
xor    %rcx,%rax
movq   %rax,%xmm0
mulsd  %xmm1,%xmm0
movsd  0xe19(%rip),%xmm1
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x48(%rbp)
movsd  0xe10(%rip),%xmm0
mulsd  -0x48(%rbp),%xmm0
movsd  %xmm0,-0x50(%rbp)
movsd  -0x40(%rbp),%xmm0
ucomisd -0x50(%rbp),%xmm0
jbe    1279 <eccentricAnomaly+0x159>
movsd  -0x38(%rbp),%xmm0
movsd  %xmm0,-0x28(%rbp)
movsd  -0x30(%rbp),%xmm0
subsd  -0x28(%rbp),%xmm0
movsd  %xmm0,-0x50(%rbp)
movsd  -0x48(%rbp),%xmm0
mulsd  -0x50(%rbp),%xmm0
ucomisd -0x40(%rbp),%xmm0
jbe    1259 <eccentricAnomaly+0x139>
movsd  -0x40(%rbp),%xmm0
divsd  -0x48(%rbp),%xmm0
addsd  -0x38(%rbp),%xmm0
movsd  %xmm0,-0x38(%rbp)
jmp    1274 <eccentricAnomaly+0x154>
movsd  -0x30(%rbp),%xmm1
addsd  -0x28(%rbp),%xmm1
movsd  0xda5(%rip),%xmm0
mulsd  %xmm1,%xmm0
movsd  %xmm0,-0x38(%rbp)
jmp    133a <eccentricAnomaly+0x21a>
movsd  -0x40(%rbp),%xmm1
movsd  -0x50(%rbp),%xmm0
movq   %xmm0,%rax
movabs $0x8000000000000000,%rcx
xor    %rcx,%rax
movq   %rax,%xmm0
ucomisd %xmm1,%xmm0
jbe    1326 <eccentricAnomaly+0x206>
movsd  -0x38(%rbp),%xmm0
movsd  %xmm0,-0x30(%rbp)
movsd  -0x30(%rbp),%xmm0
subsd  -0x28(%rbp),%xmm0
movsd  %xmm0,-0x50(%rbp)
movsd  -0x48(%rbp),%xmm0
mulsd  -0x50(%rbp),%xmm0
movsd  -0x40(%rbp),%xmm1
movq   %xmm1,%rax
movabs $0x8000000000000000,%rcx
xor    %rcx,%rax
movq   %rax,%xmm1
ucomisd %xmm1,%xmm0
jbe    1306 <eccentricAnomaly+0x1e6>
movsd  -0x40(%rbp),%xmm0
divsd  -0x48(%rbp),%xmm0
addsd  -0x38(%rbp),%xmm0
movsd  %xmm0,-0x38(%rbp)
jmp    1321 <eccentricAnomaly+0x201>
movsd  -0x30(%rbp),%xmm1
addsd  -0x28(%rbp),%xmm1
movsd  0xcf8(%rip),%xmm0
mulsd  %xmm1,%xmm0
movsd  %xmm0,-0x38(%rbp)
jmp    1335 <eccentricAnomaly+0x215>
movsd  -0x38(%rbp),%xmm0
movsd  %xmm0,-0x8(%rbp)
jmp    1382 <eccentricAnomaly+0x262>
jmp    133a <eccentricAnomaly+0x21a>
jmp    133f <eccentricAnomaly+0x21f>
movsd  -0x50(%rbp),%xmm0
xor    %eax,%eax
movsd  0xcba(%rip),%xmm1
ucomisd %xmm1,%xmm0
mov    %al,-0x69(%rbp)
jbe    136d <eccentricAnomaly+0x24d>
mov    -0x1c(%rbp),%eax
add    $0xffffffff,%eax
mov    %eax,-0x1c(%rbp)
cmp    $0x0,%eax
setg   %al
mov    %al,-0x69(%rbp)
mov    -0x69(%rbp),%al
test   $0x1,%al
jne    116b <eccentricAnomaly+0x4b>
movsd  -0x38(%rbp),%xmm0
movsd  %xmm0,-0x8(%rbp)
movsd  -0x8(%rbp),%xmm0
add    $0x70,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<eccentricAnomaly>:
push   %rbx
sub    $0x50,%rsp
movsd  0xed2(%rip),%xmm8
addsd  %xmm0,%xmm8
movsd  0xecd(%rip),%xmm6
addsd  %xmm0,%xmm6
movapd 0xed9(%rip),%xmm2
movapd %xmm1,0x30(%rsp)
xorpd  %xmm1,%xmm2
movapd %xmm2,0x20(%rsp)
mov    $0x3e8,%ebx
movsd  %xmm0,0x8(%rsp)
jmp    119d <eccentricAnomaly+0x7d>
cs nopw 0x0(%rax,%rax,1)
xchg   %ax,%ax
movapd %xmm6,%xmm0
addsd  %xmm2,%xmm0
mulsd  0xe98(%rip),%xmm0
movapd %xmm2,%xmm8
ucomisd %xmm4,%xmm1
jbe    12c1 <eccentricAnomaly+0x1a1>
lea    -0x1(%rbx),%eax
cmp    $0x1,%ebx
mov    %eax,%ebx
jbe    12c1 <eccentricAnomaly+0x1a1>
movsd  %xmm0,(%rsp)
movsd  %xmm6,0x18(%rsp)
movsd  %xmm8,0x10(%rsp)
call   1030 <sin@plt>
movapd %xmm0,%xmm1
mulsd  0x30(%rsp),%xmm1
addsd  0x8(%rsp),%xmm1
movsd  (%rsp),%xmm0
subsd  %xmm0,%xmm1
movapd %xmm1,0x40(%rsp)
call   1040 <cos@plt>
movapd 0x40(%rsp),%xmm7
movsd  0xe2a(%rip),%xmm4
mulsd  0x20(%rsp),%xmm0
addsd  0xe14(%rip),%xmm0
movapd %xmm0,%xmm1
mulsd  %xmm4,%xmm1
ucomisd %xmm1,%xmm7
jbe    1240 <eccentricAnomaly+0x120>
movsd  0x18(%rsp),%xmm6
movapd %xmm6,%xmm1
movsd  (%rsp),%xmm3
subsd  %xmm3,%xmm1
movapd %xmm1,%xmm2
mulsd  %xmm0,%xmm2
ucomisd %xmm7,%xmm2
movapd %xmm3,%xmm2
jbe    1170 <eccentricAnomaly+0x50>
divsd  %xmm0,%xmm7
addsd  %xmm2,%xmm7
movapd %xmm2,%xmm8
jmp    1285 <eccentricAnomaly+0x165>
nopw   0x0(%rax,%rax,1)
movsd  (%rsp),%xmm6
movapd 0xdd3(%rip),%xmm5
xorpd  %xmm5,%xmm1
ucomisd %xmm7,%xmm1
jbe    12bd <eccentricAnomaly+0x19d>
movapd %xmm6,%xmm1
movsd  0x10(%rsp),%xmm8
subsd  %xmm8,%xmm1
movapd %xmm1,%xmm2
mulsd  %xmm0,%xmm2
movapd %xmm7,%xmm3
xorpd  %xmm5,%xmm3
ucomisd %xmm3,%xmm2
jbe    12a0 <eccentricAnomaly+0x180>
divsd  %xmm0,%xmm7
addsd  %xmm6,%xmm7
movapd %xmm7,%xmm0
ucomisd %xmm4,%xmm1
ja     118f <eccentricAnomaly+0x6f>
jmp    12c1 <eccentricAnomaly+0x1a1>
cs nopw 0x0(%rax,%rax,1)
nop
movapd %xmm8,%xmm0
addsd  %xmm6,%xmm0
mulsd  0xd67(%rip),%xmm0
ucomisd %xmm4,%xmm1
ja     118f <eccentricAnomaly+0x6f>
jmp    12c1 <eccentricAnomaly+0x1a1>
movapd %xmm6,%xmm0
add    $0x50,%rsp
pop    %rbx
ret

LLVM IR (-O0):
define double @eccentricAnomaly(double %0, double %1) {
%3 = alloca double
%4 = alloca double
%5 = alloca double
%6 = alloca i32
%7 = alloca double
%8 = alloca double
%9 = alloca double
%10 = alloca double
%11 = alloca double
%12 = alloca double
store double %0, double* %4
store double %1, double* %5
store i32 1000, i32* %6
%13 = load double, double* %4
%14 = fsub double %13, 1.000000e+00
store double %14, double* %7
%15 = load double, double* %4
%16 = fadd double %15, 1.000000e+00
store double %16, double* %8
%17 = load double, double* %4
store double %17, double* %9
br label %18
18: ; preds = %97, %2
%19 = load double, double* %4
%20 = load double, double* %5
%21 = load double, double* %9
%22 = call double @sin(double %21)
%23 = call double @llvm.fmuladd.f64(double %20, double %22, double %19)
%24 = load double, double* %9
%25 = fsub double %23, %24
store double %25, double* %10
%26 = load double, double* %5
%27 = load double, double* %9
%28 = call double @cos(double %27)
%29 = fneg double %26
%30 = call double @llvm.fmuladd.f64(double %29, double %28, double 1.000000e+00)
store double %30, double* %11
%31 = load double, double* %11
%32 = fmul double %31, 1.000000e-04
store double %32, double* %12
%33 = load double, double* %10
%34 = load double, double* %12
%35 = fcmp ogt double %33, %34
br i1 %35, label %36, label %58
36: ; preds = %18
%37 = load double, double* %9
store double %37, double* %7
%38 = load double, double* %8
%39 = load double, double* %7
%40 = fsub double %38, %39
store double %40, double* %12
%41 = load double, double* %11
%42 = load double, double* %12
%43 = fmul double %41, %42
%44 = load double, double* %10
%45 = fcmp ogt double %43, %44
br i1 %45, label %46, label %52
46: ; preds = %36
%47 = load double, double* %10
%48 = load double, double* %11
%49 = fdiv double %47, %48
%50 = load double, double* %9
%51 = fadd double %50, %49
store double %51, double* %9
br label %57
52: ; preds = %36
%53 = load double, double* %8
%54 = load double, double* %7
%55 = fadd double %53, %54
%56 = fmul double 5.000000e-01, %55
store double %56, double* %9
br label %57
57: ; preds = %52, %46
br label %89
58: ; preds = %18
%59 = load double, double* %10
%60 = load double, double* %12
%61 = fneg double %60
%62 = fcmp olt double %59, %61
br i1 %62, label %63, label %86
63: ; preds = %58
%64 = load double, double* %9
store double %64, double* %8
%65 = load double, double* %8
%66 = load double, double* %7
%67 = fsub double %65, %66
store double %67, double* %12
%68 = load double, double* %11
%69 = load double, double* %12
%70 = fmul double %68, %69
%71 = load double, double* %10
%72 = fneg double %71
%73 = fcmp ogt double %70, %72
br i1 %73, label %74, label %80
74: ; preds = %63
%75 = load double, double* %10
%76 = load double, double* %11
%77 = fdiv double %75, %76
%78 = load double, double* %9
%79 = fadd double %78, %77
store double %79, double* %9
br label %85
80: ; preds = %63
%81 = load double, double* %8
%82 = load double, double* %7
%83 = fadd double %81, %82
%84 = fmul double 5.000000e-01, %83
store double %84, double* %9
br label %85
85: ; preds = %80, %74
br label %88
86: ; preds = %58
%87 = load double, double* %9
store double %87, double* %3
br label %101
88: ; preds = %85
br label %89
89: ; preds = %88, %57
br label %90
90: ; preds = %89
%91 = load double, double* %12
%92 = fcmp ogt double %91, 1.000000e-04
br i1 %92, label %93, label %97
93: ; preds = %90
%94 = load i32, i32* %6
%95 = add nsw i32 %94, -1
store i32 %95, i32* %6
%96 = icmp sgt i32 %95, 0
br label %97
97: ; preds = %93, %90
%98 = phi i1 [ false, %90 ], [ %96, %93 ]
br i1 %98, label %18, label %99
99: ; preds = %97
%100 = load double, double* %9
store double %100, double* %3
br label %101
101: ; preds = %99, %86
%102 = load double, double* %3
ret double %102
}

LLVM IR (-O2):
define double @eccentricAnomaly(double %0, double %1) {
%3 = fadd double %0, -1.000000e+00
%4 = fadd double %0, 1.000000e+00
%5 = fneg double %1
br label %6
6: ; preds = %42, %2
%7 = phi double [ %3, %2 ], [ %43, %42 ]
%8 = phi double [ %4, %2 ], [ %44, %42 ]
%9 = phi double [ %0, %2 ], [ %45, %42 ]
%10 = phi i32 [ 1000, %2 ], [ %48, %42 ]
%11 = tail call double @sin(double %9)
%12 = tail call double @llvm.fmuladd.f64(double %1, double %11, double %0)
%13 = fsub double %12, %9
%14 = tail call double @cos(double %9)
%15 = tail call double @llvm.fmuladd.f64(double %5, double %14, double 1.000000e+00)
%16 = fmul double %15, 1.000000e-04
%17 = fcmp ogt double %13, %16
br i1 %17, label %18, label %28
18: ; preds = %6
%19 = fsub double %8, %9
%20 = fmul double %19, %15
%21 = fcmp ogt double %20, %13
br i1 %21, label %22, label %25
22: ; preds = %18
%23 = fdiv double %13, %15
%24 = fadd double %9, %23
br label %42
25: ; preds = %18
%26 = fadd double %8, %9
%27 = fmul double %26, 5.000000e-01
br label %42
28: ; preds = %6
%29 = fneg double %16
%30 = fcmp olt double %13, %29
br i1 %30, label %31, label %51
31: ; preds = %28
%32 = fsub double %9, %7
%33 = fmul double %32, %15
%34 = fneg double %13
%35 = fcmp ogt double %33, %34
br i1 %35, label %36, label %39
36: ; preds = %31
%37 = fdiv double %13, %15
%38 = fadd double %9, %37
br label %42
39: ; preds = %31
%40 = fadd double %7, %9
%41 = fmul double %40, 5.000000e-01
br label %42
42: ; preds = %25, %22, %36, %39
%43 = phi double [ %9, %22 ], [ %9, %25 ], [ %7, %36 ], [ %7, %39 ]
%44 = phi double [ %8, %22 ], [ %8, %25 ], [ %9, %36 ], [ %9, %39 ]
%45 = phi double [ %24, %22 ], [ %27, %25 ], [ %38, %36 ], [ %41, %39 ]
%46 = phi double [ %19, %22 ], [ %19, %25 ], [ %32, %36 ], [ %32, %39 ]
%47 = fcmp ogt double %46, 1.000000e-04
%48 = add nsw i32 %10, -1
%49 = icmp ugt i32 %10, 1
%50 = select i1 %47, i1 %49, i1 false
br i1 %50, label %6, label %51
51: ; preds = %42, %28
%52 = phi double [ %9, %28 ], [ %45, %42 ]
ret double %52
}