#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 fabs(double);
void drift_kepu_stumpff(double x, double *c0, double *c1, double *c2,
                        double *c3) {
  int n = 0;
  double xm = 0.1;
  while (fabs(x) >= xm) {
    n++;
    x = x / 4.;
  }
  *c2 = (1. -
         x *
             (1. -
              x *
                  (1. - x * (1. - x * (1. - x * (1. - x / 182.) / 132.) / 90.) /
                            56.) /
                  30.) /
             12.) /
        2.;
  *c3 =
      (1. -
       x *
           (1. -
            x *
                (1. - x * (1. - x * (1. - x * (1. - x / 210.) / 156.) / 110.) /
                          72.) /
                42.) /
           20.) /
      6.;
  *c1 = 1. - x * (*c3);
  *c0 = 1. - x * (*c2);
  for (int i = n; i >= 1; i--) {
    *c3 = ((*c2) + (*c0) * (*c3)) / 4.;
    *c2 = (*c1) * (*c1) / 2.;
    *c1 = (*c0) * (*c1);
    *c0 = 2. * (*c0) * (*c0) - 1.;
    x = x * 4.;
  }
}


x86 assembly (clang, -O0):
<drift_kepu_stumpff>:
push   %rbp
mov    %rsp,%rbp
movsd  %xmm0,-0x8(%rbp)
mov    %rdi,-0x10(%rbp)
mov    %rsi,-0x18(%rbp)
mov    %rdx,-0x20(%rbp)
mov    %rcx,-0x28(%rbp)
movl   $0x0,-0x2c(%rbp)
movsd  0xed8(%rip),%xmm0
movsd  %xmm0,-0x38(%rbp)
movsd  -0x8(%rbp),%xmm0
movaps 0xf57(%rip),%xmm1
pand   %xmm1,%xmm0
ucomisd -0x38(%rbp),%xmm0
jb     116c <drift_kepu_stumpff+0x6c>
mov    -0x2c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x2c(%rbp)
movsd  -0x8(%rbp),%xmm0
movsd  0xf22(%rip),%xmm1
divsd  %xmm1,%xmm0
movsd  %xmm0,-0x8(%rbp)
jmp    112d <drift_kepu_stumpff+0x2d>
movsd  -0x8(%rbp),%xmm1
movsd  -0x8(%rbp),%xmm2
movsd  -0x8(%rbp),%xmm3
movsd  -0x8(%rbp),%xmm4
movsd  -0x8(%rbp),%xmm5
movsd  -0x8(%rbp),%xmm6
movsd  0xee6(%rip),%xmm0
divsd  %xmm0,%xmm6
movsd  0xe6a(%rip),%xmm0
subsd  %xmm6,%xmm0
mulsd  %xmm0,%xmm5
movsd  0xec2(%rip),%xmm0
divsd  %xmm0,%xmm5
movsd  0xe4e(%rip),%xmm0
subsd  %xmm5,%xmm0
mulsd  %xmm0,%xmm4
movsd  0xe9e(%rip),%xmm0
divsd  %xmm0,%xmm4
movsd  0xe32(%rip),%xmm0
subsd  %xmm4,%xmm0
mulsd  %xmm0,%xmm3
movsd  0xe7a(%rip),%xmm0
divsd  %xmm0,%xmm3
movsd  0xe16(%rip),%xmm0
subsd  %xmm3,%xmm0
mulsd  %xmm0,%xmm2
movsd  0xe56(%rip),%xmm0
divsd  %xmm0,%xmm2
movsd  0xdfa(%rip),%xmm0
subsd  %xmm2,%xmm0
mulsd  %xmm0,%xmm1
movsd  0xe32(%rip),%xmm0
divsd  %xmm0,%xmm1
movsd  0xdde(%rip),%xmm0
subsd  %xmm1,%xmm0
movsd  0xe12(%rip),%xmm1
divsd  %xmm1,%xmm0
mov    -0x20(%rbp),%rax
movsd  %xmm0,(%rax)
movsd  -0x8(%rbp),%xmm1
movsd  -0x8(%rbp),%xmm2
movsd  -0x8(%rbp),%xmm3
movsd  -0x8(%rbp),%xmm4
movsd  -0x8(%rbp),%xmm5
movsd  -0x8(%rbp),%xmm6
movsd  0xdd8(%rip),%xmm0
divsd  %xmm0,%xmm6
movsd  0xd94(%rip),%xmm0
subsd  %xmm6,%xmm0
mulsd  %xmm0,%xmm5
movsd  0xdb4(%rip),%xmm0
divsd  %xmm0,%xmm5
movsd  0xd78(%rip),%xmm0
subsd  %xmm5,%xmm0
mulsd  %xmm0,%xmm4
movsd  0xd90(%rip),%xmm0
divsd  %xmm0,%xmm4
movsd  0xd5c(%rip),%xmm0
subsd  %xmm4,%xmm0
mulsd  %xmm0,%xmm3
movsd  0xd6c(%rip),%xmm0
divsd  %xmm0,%xmm3
movsd  0xd40(%rip),%xmm0
subsd  %xmm3,%xmm0
mulsd  %xmm0,%xmm2
movsd  0xd48(%rip),%xmm0
divsd  %xmm0,%xmm2
movsd  0xd24(%rip),%xmm0
subsd  %xmm2,%xmm0
mulsd  %xmm0,%xmm1
movsd  0xd24(%rip),%xmm0
divsd  %xmm0,%xmm1
movsd  0xd08(%rip),%xmm0
subsd  %xmm1,%xmm0
movsd  0xd04(%rip),%xmm1
divsd  %xmm1,%xmm0
mov    -0x28(%rbp),%rax
movsd  %xmm0,(%rax)
movsd  -0x8(%rbp),%xmm0
mov    -0x28(%rbp),%rax
movsd  (%rax),%xmm1
movq   %xmm0,%rax
movabs $0x8000000000000000,%rcx
xor    %rcx,%rax
movq   %rax,%xmm0
mulsd  %xmm1,%xmm0
movsd  0xcc0(%rip),%xmm1
addsd  %xmm1,%xmm0
mov    -0x18(%rbp),%rax
movsd  %xmm0,(%rax)
movsd  -0x8(%rbp),%xmm0
mov    -0x20(%rbp),%rax
movsd  (%rax),%xmm1
movq   %xmm0,%rax
movabs $0x8000000000000000,%rcx
xor    %rcx,%rax
movq   %rax,%xmm0
mulsd  %xmm1,%xmm0
movsd  0xc84(%rip),%xmm1
addsd  %xmm1,%xmm0
mov    -0x10(%rbp),%rax
movsd  %xmm0,(%rax)
mov    -0x2c(%rbp),%eax
mov    %eax,-0x3c(%rbp)
cmpl   $0x1,-0x3c(%rbp)
jl     1460 <drift_kepu_stumpff+0x360>
mov    -0x20(%rbp),%rax
movsd  (%rax),%xmm1
mov    -0x10(%rbp),%rax
movsd  (%rax),%xmm0
mov    -0x28(%rbp),%rax
movsd  (%rax),%xmm2
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  0xcb8(%rip),%xmm1
divsd  %xmm1,%xmm0
mov    -0x28(%rbp),%rax
movsd  %xmm0,(%rax)
mov    -0x18(%rbp),%rax
movsd  (%rax),%xmm0
mov    -0x18(%rbp),%rax
mulsd  (%rax),%xmm0
movsd  0xc5c(%rip),%xmm1
divsd  %xmm1,%xmm0
mov    -0x20(%rbp),%rax
movsd  %xmm0,(%rax)
mov    -0x10(%rbp),%rax
movsd  (%rax),%xmm0
mov    -0x18(%rbp),%rax
mulsd  (%rax),%xmm0
mov    -0x18(%rbp),%rax
movsd  %xmm0,(%rax)
mov    -0x10(%rbp),%rax
movsd  0xc2c(%rip),%xmm0
mulsd  (%rax),%xmm0
mov    -0x10(%rbp),%rax
movsd  (%rax),%xmm1
mulsd  %xmm1,%xmm0
movsd  0xc54(%rip),%xmm1
addsd  %xmm1,%xmm0
mov    -0x10(%rbp),%rax
movsd  %xmm0,(%rax)
movsd  0xc38(%rip),%xmm0
mulsd  -0x8(%rbp),%xmm0
movsd  %xmm0,-0x8(%rbp)
mov    -0x3c(%rbp),%eax
add    $0xffffffff,%eax
mov    %eax,-0x3c(%rbp)
jmp    1396 <drift_kepu_stumpff+0x296>
pop    %rbp
ret

x86 assembly (clang, -O2):
<drift_kepu_stumpff>:
movapd 0xef8(%rip),%xmm1
andpd  %xmm0,%xmm1
xor    %eax,%eax
ucomisd 0xefa(%rip),%xmm1
jb     1155 <drift_kepu_stumpff+0x55>
xor    %eax,%eax
movsd  0xef6(%rip),%xmm1
movapd 0xed6(%rip),%xmm2
movsd  0xede(%rip),%xmm3
cs nopw 0x0(%rax,%rax,1)
nopl   0x0(%rax)
add    $0x1,%eax
mulsd  %xmm1,%xmm0
movapd %xmm0,%xmm4
andpd  %xmm2,%xmm4
ucomisd %xmm3,%xmm4
jae    1140 <drift_kepu_stumpff+0x40>
movapd %xmm0,%xmm2
divsd  0xebf(%rip),%xmm2
movsd  0xebf(%rip),%xmm1
addsd  %xmm1,%xmm2
mulsd  %xmm0,%xmm2
divsd  0xeb7(%rip),%xmm2
addsd  %xmm1,%xmm2
mulsd  %xmm0,%xmm2
divsd  0xeaf(%rip),%xmm2
addsd  %xmm1,%xmm2
mulsd  %xmm0,%xmm2
divsd  0xea7(%rip),%xmm2
addsd  %xmm1,%xmm2
mulsd  %xmm0,%xmm2
divsd  0xe9f(%rip),%xmm2
addsd  %xmm1,%xmm2
mulsd  %xmm0,%xmm2
divsd  0xe97(%rip),%xmm2
addsd  %xmm1,%xmm2
mulsd  0xe93(%rip),%xmm2
movsd  %xmm2,(%rdx)
movapd %xmm0,%xmm2
divsd  0xe8b(%rip),%xmm2
addsd  %xmm1,%xmm2
mulsd  %xmm0,%xmm2
divsd  0xe83(%rip),%xmm2
addsd  %xmm1,%xmm2
mulsd  %xmm0,%xmm2
divsd  0xe7b(%rip),%xmm2
addsd  %xmm1,%xmm2
mulsd  %xmm0,%xmm2
divsd  0xe73(%rip),%xmm2
addsd  %xmm1,%xmm2
mulsd  %xmm0,%xmm2
divsd  0xe6b(%rip),%xmm2
addsd  %xmm1,%xmm2
mulsd  %xmm0,%xmm2
divsd  0xe63(%rip),%xmm2
addsd  %xmm1,%xmm2
divsd  0xe5f(%rip),%xmm2
movsd  %xmm2,(%rcx)
mulsd  %xmm0,%xmm2
movapd %xmm1,%xmm3
subsd  %xmm2,%xmm3
movsd  %xmm3,(%rsi)
mulsd  (%rdx),%xmm0
subsd  %xmm0,%xmm1
movsd  %xmm1,(%rdi)
test   %eax,%eax
jle    12bc <drift_kepu_stumpff+0x1bc>
add    $0x1,%eax
movsd  0xdb8(%rip),%xmm0
movsd  0xdf0(%rip),%xmm2
movsd  0xe28(%rip),%xmm3
mulsd  (%rcx),%xmm1
addsd  (%rdx),%xmm1
mulsd  %xmm0,%xmm1
movsd  %xmm1,(%rcx)
movsd  (%rsi),%xmm1
mulsd  %xmm1,%xmm1
mulsd  %xmm2,%xmm1
movsd  %xmm1,(%rdx)
movsd  (%rdi),%xmm1
mulsd  (%rsi),%xmm1
movsd  %xmm1,(%rsi)
movsd  (%rdi),%xmm4
movapd %xmm4,%xmm1
addsd  %xmm4,%xmm1
mulsd  %xmm4,%xmm1
addsd  %xmm3,%xmm1
movsd  %xmm1,(%rdi)
add    $0xffffffff,%eax
cmp    $0x1,%eax
ja     1270 <drift_kepu_stumpff+0x170>
ret

LLVM IR (-O0):
define void @drift_kepu_stumpff(double %0, double* %1, double* %2, double* %3, double* %4) {
%6 = alloca double
%7 = alloca double*
%8 = alloca double*
%9 = alloca double*
%10 = alloca double*
%11 = alloca i32
%12 = alloca double
%13 = alloca i32
store double %0, double* %6
store double* %1, double** %7
store double* %2, double** %8
store double* %3, double** %9
store double* %4, double** %10
store i32 0, i32* %11
store double 1.000000e-01, double* %12
br label %14
14: ; preds = %19, %5
%15 = load double, double* %6
%16 = call double @llvm.fabs.f64(double %15)
%17 = load double, double* %12
%18 = fcmp oge double %16, %17
br i1 %18, label %19, label %24
19: ; preds = %14
%20 = load i32, i32* %11
%21 = add nsw i32 %20, 1
store i32 %21, i32* %11
%22 = load double, double* %6
%23 = fdiv double %22, 4.000000e+00
store double %23, double* %6
br label %14
24: ; preds = %14
%25 = load double, double* %6
%26 = load double, double* %6
%27 = load double, double* %6
%28 = load double, double* %6
%29 = load double, double* %6
%30 = load double, double* %6
%31 = fdiv double %30, 1.820000e+02
%32 = fsub double 1.000000e+00, %31
%33 = fmul double %29, %32
%34 = fdiv double %33, 1.320000e+02
%35 = fsub double 1.000000e+00, %34
%36 = fmul double %28, %35
%37 = fdiv double %36, 9.000000e+01
%38 = fsub double 1.000000e+00, %37
%39 = fmul double %27, %38
%40 = fdiv double %39, 5.600000e+01
%41 = fsub double 1.000000e+00, %40
%42 = fmul double %26, %41
%43 = fdiv double %42, 3.000000e+01
%44 = fsub double 1.000000e+00, %43
%45 = fmul double %25, %44
%46 = fdiv double %45, 1.200000e+01
%47 = fsub double 1.000000e+00, %46
%48 = fdiv double %47, 2.000000e+00
%49 = load double*, double** %9
store double %48, double* %49
%50 = load double, double* %6
%51 = load double, double* %6
%52 = load double, double* %6
%53 = load double, double* %6
%54 = load double, double* %6
%55 = load double, double* %6
%56 = fdiv double %55, 2.100000e+02
%57 = fsub double 1.000000e+00, %56
%58 = fmul double %54, %57
%59 = fdiv double %58, 1.560000e+02
%60 = fsub double 1.000000e+00, %59
%61 = fmul double %53, %60
%62 = fdiv double %61, 1.100000e+02
%63 = fsub double 1.000000e+00, %62
%64 = fmul double %52, %63
%65 = fdiv double %64, 7.200000e+01
%66 = fsub double 1.000000e+00, %65
%67 = fmul double %51, %66
%68 = fdiv double %67, 4.200000e+01
%69 = fsub double 1.000000e+00, %68
%70 = fmul double %50, %69
%71 = fdiv double %70, 2.000000e+01
%72 = fsub double 1.000000e+00, %71
%73 = fdiv double %72, 6.000000e+00
%74 = load double*, double** %10
store double %73, double* %74
%75 = load double, double* %6
%76 = load double*, double** %10
%77 = load double, double* %76
%78 = fneg double %75
%79 = call double @llvm.fmuladd.f64(double %78, double %77, double 1.000000e+00)
%80 = load double*, double** %8
store double %79, double* %80
%81 = load double, double* %6
%82 = load double*, double** %9
%83 = load double, double* %82
%84 = fneg double %81
%85 = call double @llvm.fmuladd.f64(double %84, double %83, double 1.000000e+00)
%86 = load double*, double** %7
store double %85, double* %86
%87 = load i32, i32* %11
store i32 %87, i32* %13
br label %88
88: ; preds = %123, %24
%89 = load i32, i32* %13
%90 = icmp sge i32 %89, 1
br i1 %90, label %91, label %126
91: ; preds = %88
%92 = load double*, double** %9
%93 = load double, double* %92
%94 = load double*, double** %7
%95 = load double, double* %94
%96 = load double*, double** %10
%97 = load double, double* %96
%98 = call double @llvm.fmuladd.f64(double %95, double %97, double %93)
%99 = fdiv double %98, 4.000000e+00
%100 = load double*, double** %10
store double %99, double* %100
%101 = load double*, double** %8
%102 = load double, double* %101
%103 = load double*, double** %8
%104 = load double, double* %103
%105 = fmul double %102, %104
%106 = fdiv double %105, 2.000000e+00
%107 = load double*, double** %9
store double %106, double* %107
%108 = load double*, double** %7
%109 = load double, double* %108
%110 = load double*, double** %8
%111 = load double, double* %110
%112 = fmul double %109, %111
%113 = load double*, double** %8
store double %112, double* %113
%114 = load double*, double** %7
%115 = load double, double* %114
%116 = fmul double 2.000000e+00, %115
%117 = load double*, double** %7
%118 = load double, double* %117
%119 = call double @llvm.fmuladd.f64(double %116, double %118, double -1.000000e+00)
%120 = load double*, double** %7
store double %119, double* %120
%121 = load double, double* %6
%122 = fmul double %121, 4.000000e+00
store double %122, double* %6
br label %123
123: ; preds = %91
%124 = load i32, i32* %13
%125 = add nsw i32 %124, -1
store i32 %125, i32* %13
br label %88
126: ; preds = %88
ret void
}

LLVM IR (-O2):
define void @drift_kepu_stumpff(double %0, double* nocapture %1, double* nocapture %2, double* nocapture %3, double* nocapture %4) {
%6 = tail call double @llvm.fabs.f64(double %0)
%7 = fcmp ult double %6, 1.000000e-01
br i1 %7, label %15, label %8
8: ; preds = %5, %8
%9 = phi double [ %12, %8 ], [ %0, %5 ]
%10 = phi i32 [ %11, %8 ], [ 0, %5 ]
%11 = add nuw nsw i32 %10, 1
%12 = fmul double %9, 2.500000e-01
%13 = tail call double @llvm.fabs.f64(double %12)
%14 = fcmp ult double %13, 1.000000e-01
br i1 %14, label %15, label %8
15: ; preds = %8, %5
%16 = phi i32 [ 0, %5 ], [ %11, %8 ]
%17 = phi double [ %0, %5 ], [ %12, %8 ]
%18 = fdiv double %17, 1.820000e+02
%19 = fsub double 1.000000e+00, %18
%20 = fmul double %17, %19
%21 = fdiv double %20, 1.320000e+02
%22 = fsub double 1.000000e+00, %21
%23 = fmul double %17, %22
%24 = fdiv double %23, 9.000000e+01
%25 = fsub double 1.000000e+00, %24
%26 = fmul double %17, %25
%27 = fdiv double %26, 5.600000e+01
%28 = fsub double 1.000000e+00, %27
%29 = fmul double %17, %28
%30 = fdiv double %29, 3.000000e+01
%31 = fsub double 1.000000e+00, %30
%32 = fmul double %17, %31
%33 = fdiv double %32, 1.200000e+01
%34 = fsub double 1.000000e+00, %33
%35 = fmul double %34, 5.000000e-01
store double %35, double* %3
%36 = fdiv double %17, 2.100000e+02
%37 = fsub double 1.000000e+00, %36
%38 = fmul double %17, %37
%39 = fdiv double %38, 1.560000e+02
%40 = fsub double 1.000000e+00, %39
%41 = fmul double %17, %40
%42 = fdiv double %41, 1.100000e+02
%43 = fsub double 1.000000e+00, %42
%44 = fmul double %17, %43
%45 = fdiv double %44, 7.200000e+01
%46 = fsub double 1.000000e+00, %45
%47 = fmul double %17, %46
%48 = fdiv double %47, 4.200000e+01
%49 = fsub double 1.000000e+00, %48
%50 = fmul double %17, %49
%51 = fdiv double %50, 2.000000e+01
%52 = fsub double 1.000000e+00, %51
%53 = fdiv double %52, 6.000000e+00
store double %53, double* %4
%54 = fneg double %17
%55 = tail call double @llvm.fmuladd.f64(double %54, double %53, double 1.000000e+00)
store double %55, double* %2
%56 = load double, double* %3
%57 = tail call double @llvm.fmuladd.f64(double %54, double %56, double 1.000000e+00)
store double %57, double* %1
%58 = icmp sgt i32 %16, 0
br i1 %58, label %60, label %59
59: ; preds = %60, %15
ret void
60: ; preds = %15, %60
%61 = phi double [ %75, %60 ], [ %57, %15 ]
%62 = phi i32 [ %76, %60 ], [ %16, %15 ]
%63 = load double, double* %3
%64 = load double, double* %4
%65 = tail call double @llvm.fmuladd.f64(double %61, double %64, double %63)
%66 = fmul double %65, 2.500000e-01
store double %66, double* %4
%67 = load double, double* %2
%68 = fmul double %67, %67
%69 = fmul double %68, 5.000000e-01
store double %69, double* %3
%70 = load double, double* %1
%71 = load double, double* %2
%72 = fmul double %70, %71
store double %72, double* %2
%73 = load double, double* %1
%74 = fmul double %73, 2.000000e+00
%75 = tail call double @llvm.fmuladd.f64(double %74, double %73, double -1.000000e+00)
store double %75, double* %1
%76 = add nsw i32 %62, -1
%77 = icmp ugt i32 %62, 1
br i1 %77, label %60, label %59
}