#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 */
typedef int int32_t;

/* Variables and functions */
scalar_t__ FLT_EPSILON;
scalar_t__ fabsf(float);
float DcmTaylorSeriesTrig(float x2, int32_t f0) {
  int32_t f = 1;
  int32_t fact = 1;
  while (f < f0) {
    ++f;
    fact *= f;
  }
  float delta = 1.0f / (float)fact;
  float ans = delta;
  while (fabsf(delta) > FLT_EPSILON && f < 64) {
    ++f;
    fact = f;
    ++f;
    fact *= -f;
    delta *= x2 / (float)fact;
    ans += delta;
  }
  return ans;
}


x86 assembly (clang, -O0):
<DcmTaylorSeriesTrig>:
push   %rbp
mov    %rsp,%rbp
sub    $0x20,%rsp
movss  %xmm0,-0x4(%rbp)
mov    %edi,-0x8(%rbp)
movl   $0x1,-0xc(%rbp)
movl   $0x1,-0x10(%rbp)
mov    -0xc(%rbp),%eax
cmp    -0x8(%rbp),%eax
jge    1152 <DcmTaylorSeriesTrig+0x42>
mov    -0xc(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0xc(%rbp)
mov    -0xc(%rbp),%eax
imul   -0x10(%rbp),%eax
mov    %eax,-0x10(%rbp)
jmp    112e <DcmTaylorSeriesTrig+0x1e>
cvtsi2ssl -0x10(%rbp),%xmm1
movss  0xea1(%rip),%xmm0
divss  %xmm1,%xmm0
movss  %xmm0,-0x14(%rbp)
movss  -0x14(%rbp),%xmm0
movss  %xmm0,-0x18(%rbp)
movss  -0x14(%rbp),%xmm0
call   1030 <fabsf@plt>
mov    %rax,%rcx
xor    %eax,%eax
mov    0x2e58(%rip),%rdx
cmp    (%rdx),%rcx
mov    %al,-0x19(%rbp)
jle    119e <DcmTaylorSeriesTrig+0x8e>
cmpl   $0x40,-0xc(%rbp)
setl   %al
mov    %al,-0x19(%rbp)
mov    -0x19(%rbp),%al
test   $0x1,%al
jne    11ae <DcmTaylorSeriesTrig+0x9e>
jmp    11fe <DcmTaylorSeriesTrig+0xee>
mov    -0xc(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0xc(%rbp)
mov    -0xc(%rbp),%eax
mov    %eax,-0x10(%rbp)
mov    -0xc(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0xc(%rbp)
xor    %eax,%eax
sub    -0xc(%rbp),%eax
imul   -0x10(%rbp),%eax
mov    %eax,-0x10(%rbp)
movss  -0x4(%rbp),%xmm0
cvtsi2ssl -0x10(%rbp),%xmm1
divss  %xmm1,%xmm0
mulss  -0x14(%rbp),%xmm0
movss  %xmm0,-0x14(%rbp)
movss  -0x14(%rbp),%xmm0
addss  -0x18(%rbp),%xmm0
movss  %xmm0,-0x18(%rbp)
jmp    1172 <DcmTaylorSeriesTrig+0x62>
movss  -0x18(%rbp),%xmm0
add    $0x20,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<DcmTaylorSeriesTrig>:
push   %rbp
push   %r14
push   %rbx
sub    $0x10,%rsp
movss  %xmm0,0x8(%rsp)
movd   0xeda(%rip),%xmm0
mov    $0x1,%ebx
movdqa %xmm0,%xmm1
cmp    $0x2,%edi
jl     13ca <DcmTaylorSeriesTrig+0x2ba>
lea    -0x1(%rdi),%ecx
mov    $0x1,%edx
mov    $0x1,%eax
cmp    $0x8,%ecx
jb     13a1 <DcmTaylorSeriesTrig+0x291>
mov    %ecx,%eax
and    $0xfffffff8,%eax
lea    -0x8(%rax),%ebp
mov    %ebp,%esi
shr    $0x3,%esi
add    $0x1,%esi
mov    %esi,%edx
and    $0x3,%edx
cmp    $0x18,%ebp
jae    1182 <DcmTaylorSeriesTrig+0x72>
movdqa 0xe9f(%rip),%xmm8
movdqa 0xea7(%rip),%xmm1
movdqa %xmm1,%xmm2
jmp    12df <DcmTaylorSeriesTrig+0x1cf>
and    $0xfffffffc,%esi
movdqa 0xe82(%rip),%xmm8
movdqa 0xe8a(%rip),%xmm1
movdqa 0xe91(%rip),%xmm9
movdqa 0xe98(%rip),%xmm10
movdqa 0xe9f(%rip),%xmm11
movdqa 0xea6(%rip),%xmm12
movdqa 0xead(%rip),%xmm13
movdqa 0xeb4(%rip),%xmm14
movdqa 0xebb(%rip),%xmm15
movdqa 0xec3(%rip),%xmm3
movdqa %xmm1,%xmm2
cs nopw 0x0(%rax,%rax,1)
nopl   0x0(%rax,%rax,1)
movdqa %xmm8,%xmm7
psubd  0xec3(%rip),%xmm7
movdqa %xmm8,%xmm0
paddd  %xmm9,%xmm0
pshufd $0xf5,%xmm7,%xmm4
pshufd $0xf5,%xmm1,%xmm5
pmuludq %xmm4,%xmm5
pmuludq %xmm1,%xmm7
pshufd $0xf5,%xmm2,%xmm1
pshufd $0xf5,%xmm0,%xmm4
pmuludq %xmm1,%xmm4
pmuludq %xmm2,%xmm0
movdqa %xmm8,%xmm1
paddd  %xmm10,%xmm1
movdqa %xmm8,%xmm2
paddd  %xmm11,%xmm2
pmuludq %xmm1,%xmm7
pshufd $0xf5,%xmm1,%xmm1
pmuludq %xmm5,%xmm1
pmuludq %xmm2,%xmm0
pshufd $0xf5,%xmm2,%xmm2
pmuludq %xmm4,%xmm2
movdqa %xmm8,%xmm4
paddd  %xmm12,%xmm4
pshufd $0xf5,%xmm4,%xmm5
pmuludq %xmm1,%xmm5
movdqa %xmm8,%xmm6
paddd  %xmm13,%xmm6
pmuludq %xmm7,%xmm4
pshufd $0xf5,%xmm6,%xmm7
pmuludq %xmm2,%xmm7
pmuludq %xmm0,%xmm6
movdqa %xmm8,%xmm0
paddd  %xmm14,%xmm0
pmuludq %xmm0,%xmm4
pshufd $0xf5,%xmm0,%xmm0
pmuludq %xmm5,%xmm0
pshufd $0xe8,%xmm4,%xmm1
pshufd $0xe8,%xmm0,%xmm0
punpckldq %xmm0,%xmm1
movdqa %xmm8,%xmm0
paddd  %xmm15,%xmm0
pmuludq %xmm0,%xmm6
pshufd $0xf5,%xmm0,%xmm0
pmuludq %xmm7,%xmm0
pshufd $0xe8,%xmm6,%xmm2
pshufd $0xe8,%xmm0,%xmm0
punpckldq %xmm0,%xmm2
paddd  %xmm3,%xmm8
add    $0xfffffffc,%esi
jne    11f0 <DcmTaylorSeriesTrig+0xe0>
test   %edx,%edx
je     135c <DcmTaylorSeriesTrig+0x24c>
pcmpeqd %xmm3,%xmm3
movdqa 0xd41(%rip),%xmm4
movdqa 0xdb9(%rip),%xmm5
nopw   0x0(%rax,%rax,1)
movdqa %xmm8,%xmm0
psubd  %xmm3,%xmm0
movdqa %xmm8,%xmm6
paddd  %xmm4,%xmm6
pshufd $0xf5,%xmm1,%xmm7
pmuludq %xmm0,%xmm1
pshufd $0xe8,%xmm1,%xmm1
pshufd $0xf5,%xmm0,%xmm0
pmuludq %xmm7,%xmm0
pshufd $0xe8,%xmm0,%xmm0
punpckldq %xmm0,%xmm1
pshufd $0xf5,%xmm2,%xmm0
pmuludq %xmm6,%xmm2
pshufd $0xe8,%xmm2,%xmm2
pshufd $0xf5,%xmm6,%xmm6
pmuludq %xmm0,%xmm6
pshufd $0xe8,%xmm6,%xmm0
punpckldq %xmm0,%xmm2
paddd  %xmm5,%xmm8
add    $0xffffffff,%edx
jne    1300 <DcmTaylorSeriesTrig+0x1f0>
pshufd $0xf5,%xmm1,%xmm0
pshufd $0xf5,%xmm2,%xmm3
pmuludq %xmm0,%xmm3
pmuludq %xmm1,%xmm2
pshufd $0xee,%xmm2,%xmm0
pmuludq %xmm2,%xmm0
pshufd $0xaa,%xmm3,%xmm1
pmuludq %xmm3,%xmm1
pmuludq %xmm0,%xmm1
movd   %xmm1,%edx
cmp    %eax,%ecx
jne    1396 <DcmTaylorSeriesTrig+0x286>
movd   0xc6c(%rip),%xmm0
jmp    13c1 <DcmTaylorSeriesTrig+0x2b1>
or     $0x1,%eax
movd   0xc5f(%rip),%xmm0
mov    %edi,%ecx
neg    %ecx
add    $0x1,%eax
nopl   0x0(%rax,%rax,1)
imul   %eax,%edx
lea    (%rcx,%rax,1),%esi
add    $0x1,%esi
add    $0x1,%eax
cmp    $0x1,%esi
jne    13b0 <DcmTaylorSeriesTrig+0x2a0>
xorps  %xmm1,%xmm1
cvtsi2ss %edx,%xmm1
mov    %edi,%ebx
divss  %xmm1,%xmm0
movss  %xmm0,0x4(%rsp)
call   1030 <fabsf@plt>
mov    0x2c00(%rip),%r14
cmp    (%r14),%rax
jle    1453 <DcmTaylorSeriesTrig+0x343>
cmp    $0x3f,%ebx
ja     1453 <DcmTaylorSeriesTrig+0x343>
mov    $0xfffffffe,%ebp
sub    %ebx,%ebp
movss  0x4(%rsp),%xmm0
movaps %xmm0,%xmm1
nopw   0x0(%rax,%rax,1)
lea    0x1(%rbx),%eax
imul   %ebp,%eax
xorps  %xmm2,%xmm2
cvtsi2ss %eax,%xmm2
movss  0x8(%rsp),%xmm3
divss  %xmm2,%xmm3
mulss  %xmm1,%xmm3
addss  %xmm3,%xmm0
movss  %xmm0,0x4(%rsp)
movss  %xmm3,0xc(%rsp)
movaps %xmm3,%xmm0
call   1030 <fabsf@plt>
cmp    (%r14),%rax
jle    1453 <DcmTaylorSeriesTrig+0x343>
lea    0x2(%rbx),%eax
add    $0xfffffffe,%ebp
cmp    $0x3e,%ebx
mov    %eax,%ebx
movss  0x4(%rsp),%xmm0
movss  0xc(%rsp),%xmm1
jb     1400 <DcmTaylorSeriesTrig+0x2f0>
jmp    1459 <DcmTaylorSeriesTrig+0x349>
movss  0x4(%rsp),%xmm0
add    $0x10,%rsp
pop    %rbx
pop    %r14
pop    %rbp
ret

LLVM IR (-O0):
@FLT_EPSILON = global i64 0
define float @DcmTaylorSeriesTrig(float %0, i32 %1) {
%3 = alloca float
%4 = alloca i32
%5 = alloca i32
%6 = alloca i32
%7 = alloca float
%8 = alloca float
store float %0, float* %3
store i32 %1, i32* %4
store i32 1, i32* %5
store i32 1, i32* %6
br label %9
9: ; preds = %13, %2
%10 = load i32, i32* %5
%11 = load i32, i32* %4
%12 = icmp slt i32 %10, %11
br i1 %12, label %13, label %19
13: ; preds = %9
%14 = load i32, i32* %5
%15 = add nsw i32 %14, 1
store i32 %15, i32* %5
%16 = load i32, i32* %5
%17 = load i32, i32* %6
%18 = mul nsw i32 %17, %16
store i32 %18, i32* %6
br label %9
19: ; preds = %9
%20 = load i32, i32* %6
%21 = sitofp i32 %20 to float
%22 = fdiv float 1.000000e+00, %21
store float %22, float* %7
%23 = load float, float* %7
store float %23, float* %8
br label %24
24: ; preds = %34, %19
%25 = load float, float* %7
%26 = call i64 @fabsf(float %25)
%27 = load i64, i64* @FLT_EPSILON
%28 = icmp sgt i64 %26, %27
br i1 %28, label %29, label %32
29: ; preds = %24
%30 = load i32, i32* %5
%31 = icmp slt i32 %30, 64
br label %32
32: ; preds = %29, %24
%33 = phi i1 [ false, %24 ], [ %31, %29 ]
br i1 %33, label %34, label %53
34: ; preds = %32
%35 = load i32, i32* %5
%36 = add nsw i32 %35, 1
store i32 %36, i32* %5
%37 = load i32, i32* %5
store i32 %37, i32* %6
%38 = load i32, i32* %5
%39 = add nsw i32 %38, 1
store i32 %39, i32* %5
%40 = load i32, i32* %5
%41 = sub nsw i32 0, %40
%42 = load i32, i32* %6
%43 = mul nsw i32 %42, %41
store i32 %43, i32* %6
%44 = load float, float* %3
%45 = load i32, i32* %6
%46 = sitofp i32 %45 to float
%47 = fdiv float %44, %46
%48 = load float, float* %7
%49 = fmul float %48, %47
store float %49, float* %7
%50 = load float, float* %7
%51 = load float, float* %8
%52 = fadd float %51, %50
store float %52, float* %8
br label %24
53: ; preds = %32
%54 = load float, float* %8
ret float %54
}

LLVM IR (-O2):
@FLT_EPSILON = global i64 0
define float @DcmTaylorSeriesTrig(float %0, i32 %1) {
%3 = icmp sgt i32 %1, 1
br i1 %3, label %4, label %78
4: ; preds = %2
%5 = add i32 %1, -1
%6 = icmp ult i32 %5, 8
br i1 %6, label %66, label %7
7: ; preds = %4
%8 = and i32 %5, -8
%9 = or i32 %8, 1
%10 = add i32 %8, -8
%11 = lshr exact i32 %10, 3
%12 = add nuw nsw i32 %11, 1
%13 = and i32 %12, 3
%14 = icmp ult i32 %10, 24
br i1 %14, label %41, label %15
15: ; preds = %7
%16 = and i32 %12, 1073741820
br label %17
17: ; preds = %17, %15
%18 = phi <4 x i32> [ <i32 1, i32 1, i32 1, i32 1>, %15 ], [ %36, %17 ]
%19 = phi <4 x i32> [ <i32 1, i32 1, i32 1, i32 1>, %15 ], [ %37, %17 ]
%20 = phi <4 x i32> [ <i32 1, i32 2, i32 3, i32 4>, %15 ], [ %38, %17 ]
%21 = phi i32 [ 0, %15 ], [ %39, %17 ]
%22 = add nuw nsw <4 x i32> %20, <i32 1, i32 1, i32 1, i32 1>
%23 = add <4 x i32> %20, <i32 5, i32 5, i32 5, i32 5>
%24 = mul <4 x i32> %18, %22
%25 = mul <4 x i32> %19, %23
%26 = add <4 x i32> %20, <i32 9, i32 9, i32 9, i32 9>
%27 = add <4 x i32> %20, <i32 13, i32 13, i32 13, i32 13>
%28 = mul <4 x i32> %24, %26
%29 = mul <4 x i32> %25, %27
%30 = add <4 x i32> %20, <i32 17, i32 17, i32 17, i32 17>
%31 = add <4 x i32> %20, <i32 21, i32 21, i32 21, i32 21>
%32 = mul <4 x i32> %28, %30
%33 = mul <4 x i32> %29, %31
%34 = add <4 x i32> %20, <i32 25, i32 25, i32 25, i32 25>
%35 = add <4 x i32> %20, <i32 29, i32 29, i32 29, i32 29>
%36 = mul <4 x i32> %32, %34
%37 = mul <4 x i32> %33, %35
%38 = add <4 x i32> %20, <i32 32, i32 32, i32 32, i32 32>
%39 = add i32 %21, 4
%40 = icmp eq i32 %39, %16
br i1 %40, label %41, label %17
41: ; preds = %17, %7
%42 = phi <4 x i32> [ undef, %7 ], [ %36, %17 ]
%43 = phi <4 x i32> [ undef, %7 ], [ %37, %17 ]
%44 = phi <4 x i32> [ <i32 1, i32 1, i32 1, i32 1>, %7 ], [ %36, %17 ]
%45 = phi <4 x i32> [ <i32 1, i32 1, i32 1, i32 1>, %7 ], [ %37, %17 ]
%46 = phi <4 x i32> [ <i32 1, i32 2, i32 3, i32 4>, %7 ], [ %38, %17 ]
%47 = icmp eq i32 %13, 0
br i1 %47, label %60, label %48
48: ; preds = %41, %48
%49 = phi <4 x i32> [ %55, %48 ], [ %44, %41 ]
%50 = phi <4 x i32> [ %56, %48 ], [ %45, %41 ]
%51 = phi <4 x i32> [ %57, %48 ], [ %46, %41 ]
%52 = phi i32 [ %58, %48 ], [ 0, %41 ]
%53 = add nuw nsw <4 x i32> %51, <i32 1, i32 1, i32 1, i32 1>
%54 = add <4 x i32> %51, <i32 5, i32 5, i32 5, i32 5>
%55 = mul <4 x i32> %49, %53
%56 = mul <4 x i32> %50, %54
%57 = add <4 x i32> %51, <i32 8, i32 8, i32 8, i32 8>
%58 = add i32 %52, 1
%59 = icmp eq i32 %58, %13
br i1 %59, label %60, label %48
60: ; preds = %48, %41
%61 = phi <4 x i32> [ %42, %41 ], [ %55, %48 ]
%62 = phi <4 x i32> [ %43, %41 ], [ %56, %48 ]
%63 = mul <4 x i32> %62, %61
%64 = call i32 @llvm.vector.reduce.mul.v4i32(<4 x i32> %63)
%65 = icmp eq i32 %5, %8
br i1 %65, label %75, label %66
66: ; preds = %4, %60
%67 = phi i32 [ 1, %4 ], [ %64, %60 ]
%68 = phi i32 [ 1, %4 ], [ %9, %60 ]
br label %69
69: ; preds = %66, %69
%70 = phi i32 [ %73, %69 ], [ %67, %66 ]
%71 = phi i32 [ %72, %69 ], [ %68, %66 ]
%72 = add nuw nsw i32 %71, 1
%73 = mul nsw i32 %70, %72
%74 = icmp eq i32 %72, %1
br i1 %74, label %75, label %69
75: ; preds = %69, %60
%76 = phi i32 [ %64, %60 ], [ %73, %69 ]
%77 = sitofp i32 %76 to float
br label %78
78: ; preds = %75, %2
%79 = phi i32 [ 1, %2 ], [ %1, %75 ]
%80 = phi float [ 1.000000e+00, %2 ], [ %77, %75 ]
%81 = fdiv float 1.000000e+00, %80
%82 = tail call i64 @fabsf(float %81)
%83 = load i64, i64* @FLT_EPSILON
%84 = icmp sgt i64 %82, %83
%85 = icmp ult i32 %79, 64
%86 = and i1 %84, %85
br i1 %86, label %87, label %104
87: ; preds = %78, %87
%88 = phi float [ %98, %87 ], [ %81, %78 ]
%89 = phi float [ %97, %87 ], [ %81, %78 ]
%90 = phi i32 [ %92, %87 ], [ %79, %78 ]
%91 = add nuw nsw i32 %90, 1
%92 = add nuw nsw i32 %90, 2
%93 = sub nuw nsw i32 -2, %90
%94 = mul nsw i32 %91, %93
%95 = sitofp i32 %94 to float
%96 = fdiv float %0, %95
%97 = fmul float %89, %96
%98 = fadd float %88, %97
%99 = tail call i64 @fabsf(float %97)
%100 = load i64, i64* @FLT_EPSILON
%101 = icmp sgt i64 %99, %100
%102 = icmp ult i32 %90, 62
%103 = select i1 %101, i1 %102, i1 false
br i1 %103, label %87, label %104
104: ; preds = %87, %78
%105 = phi float [ %81, %78 ], [ %98, %87 ]
ret float %105
}