double cos(double x) {
  double ret = 0.0;
  double x2;
  double num = 1.0;
  double fact = 1.0;
  int i;
  x = x - ((double)(int)(x / (2 * 3.14159265358979323846))) *
              (2 * 3.14159265358979323846);
  x2 = x * x;
  for (i = 0; i < 10; i++) {
    ret += num / fact;
    num *= -x2;
    fact *= (2 * i + 1) * (2 * i + 2);
  }
  return ret;
}


x86 assembly (clang, -O0):
<cos>:
push   %rbp
mov    %rsp,%rbp
movsd  %xmm0,-0x8(%rbp)
xorps  %xmm0,%xmm0
movsd  %xmm0,-0x10(%rbp)
movsd  0xeef(%rip),%xmm0
movsd  %xmm0,-0x20(%rbp)
movsd  0xee2(%rip),%xmm0
movsd  %xmm0,-0x28(%rbp)
movsd  -0x8(%rbp),%xmm1
movsd  -0x8(%rbp),%xmm0
movsd  0xec3(%rip),%xmm2
divsd  %xmm2,%xmm0
cvttsd2si %xmm0,%eax
cvtsi2sd %eax,%xmm0
movq   %xmm0,%rax
movabs $0x8000000000000000,%rcx
xor    %rcx,%rax
movq   %rax,%xmm0
movsd  0xe98(%rip),%xmm2
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x8(%rbp)
movsd  -0x8(%rbp),%xmm0
mulsd  -0x8(%rbp),%xmm0
movsd  %xmm0,-0x18(%rbp)
movl   $0x0,-0x2c(%rbp)
cmpl   $0xa,-0x2c(%rbp)
jge    1200 <cos+0x100>
movsd  -0x20(%rbp),%xmm0
divsd  -0x28(%rbp),%xmm0
addsd  -0x10(%rbp),%xmm0
movsd  %xmm0,-0x10(%rbp)
movsd  -0x18(%rbp),%xmm0
movq   %xmm0,%rax
movabs $0x8000000000000000,%rcx
xor    %rcx,%rax
movq   %rax,%xmm0
mulsd  -0x20(%rbp),%xmm0
movsd  %xmm0,-0x20(%rbp)
mov    -0x2c(%rbp),%eax
shl    $0x1,%eax
add    $0x1,%eax
mov    -0x2c(%rbp),%ecx
shl    $0x1,%ecx
add    $0x2,%ecx
imul   %ecx,%eax
cvtsi2sd %eax,%xmm0
mulsd  -0x28(%rbp),%xmm0
movsd  %xmm0,-0x28(%rbp)
mov    -0x2c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x2c(%rbp)
jmp    118b <cos+0x8b>
movsd  -0x10(%rbp),%xmm0
pop    %rbp
ret

x86 assembly (clang, -O2):
<cos>:
movsd  0xef8(%rip),%xmm1
movapd %xmm0,%xmm2
divsd  %xmm1,%xmm2
cvttpd2dq %xmm2,%xmm2
cvtdq2pd %xmm2,%xmm2
mulsd  %xmm1,%xmm2
subsd  %xmm2,%xmm0
movapd 0xef8(%rip),%xmm1
xorpd  %xmm0,%xmm1
mulsd  %xmm0,%xmm1
movsd  0xed0(%rip),%xmm0
mulsd  %xmm1,%xmm0
addsd  0xecc(%rip),%xmm0
movapd %xmm1,%xmm4
mulsd  %xmm1,%xmm4
movapd %xmm1,%xmm2
mulsd  %xmm4,%xmm2
unpcklpd %xmm2,%xmm4
divpd  0xed0(%rip),%xmm4
addsd  %xmm4,%xmm0
unpckhpd %xmm4,%xmm4
mulsd  %xmm1,%xmm2
movapd %xmm1,%xmm3
mulsd  %xmm2,%xmm3
unpcklpd %xmm3,%xmm2
divpd  0xec0(%rip),%xmm2
addsd  %xmm0,%xmm4
addsd  %xmm2,%xmm4
unpckhpd %xmm2,%xmm2
mulsd  %xmm1,%xmm3
movapd %xmm1,%xmm0
mulsd  %xmm3,%xmm0
unpcklpd %xmm0,%xmm3
divpd  0xeac(%rip),%xmm3
addsd  %xmm4,%xmm2
addsd  %xmm3,%xmm2
unpckhpd %xmm3,%xmm3
mulsd  %xmm1,%xmm0
mulsd  %xmm0,%xmm1
unpcklpd %xmm1,%xmm0
divpd  0xe9c(%rip),%xmm0
addsd  %xmm2,%xmm3
addsd  %xmm0,%xmm3
unpckhpd %xmm0,%xmm0
addsd  %xmm3,%xmm0
ret

LLVM IR (-O0):
define double @cos(double %0) {
%2 = alloca double
%3 = alloca double
%4 = alloca double
%5 = alloca double
%6 = alloca double
%7 = alloca i32
store double %0, double* %2
store double 0.000000e+00, double* %3
store double 1.000000e+00, double* %5
store double 1.000000e+00, double* %6
%8 = load double, double* %2
%9 = load double, double* %2
%10 = fdiv double %9, 0x401921FB54442D18
%11 = fptosi double %10 to i32
%12 = sitofp i32 %11 to double
%13 = fneg double %12
%14 = call double @llvm.fmuladd.f64(double %13, double 0x401921FB54442D18, double %8)
store double %14, double* %2
%15 = load double, double* %2
%16 = load double, double* %2
%17 = fmul double %15, %16
store double %17, double* %4
store i32 0, i32* %7
br label %18
18: ; preds = %41, %1
%19 = load i32, i32* %7
%20 = icmp slt i32 %19, 10
br i1 %20, label %21, label %44
21: ; preds = %18
%22 = load double, double* %5
%23 = load double, double* %6
%24 = fdiv double %22, %23
%25 = load double, double* %3
%26 = fadd double %25, %24
store double %26, double* %3
%27 = load double, double* %4
%28 = fneg double %27
%29 = load double, double* %5
%30 = fmul double %29, %28
store double %30, double* %5
%31 = load i32, i32* %7
%32 = mul nsw i32 2, %31
%33 = add nsw i32 %32, 1
%34 = load i32, i32* %7
%35 = mul nsw i32 2, %34
%36 = add nsw i32 %35, 2
%37 = mul nsw i32 %33, %36
%38 = sitofp i32 %37 to double
%39 = load double, double* %6
%40 = fmul double %39, %38
store double %40, double* %6
br label %41
41: ; preds = %21
%42 = load i32, i32* %7
%43 = add nsw i32 %42, 1
store i32 %43, i32* %7
br label %18
44: ; preds = %18
%45 = load double, double* %3
ret double %45
}

LLVM IR (-O2):
define double @cos(double %0) {
%2 = fdiv double %0, 0x401921FB54442D18
%3 = fptosi double %2 to i32
%4 = sitofp i32 %3 to double
%5 = fneg double %4
%6 = tail call double @llvm.fmuladd.f64(double %5, double 0x401921FB54442D18, double %0)
%7 = fneg double %6
%8 = fmul double %6, %7
%9 = fmul double %8, 5.000000e-01
%10 = fadd double %9, 1.000000e+00
%11 = fmul double %8, %8
%12 = fmul double %8, %11
%13 = insertelement <2 x double> poison, double %11, i64 0
%14 = insertelement <2 x double> %13, double %12, i64 1
%15 = fdiv <2 x double> %14, <double 2.400000e+01, double 7.200000e+02>
%16 = extractelement <2 x double> %15, i64 0
%17 = fadd double %10, %16
%18 = extractelement <2 x double> %15, i64 1
%19 = fadd double %17, %18
%20 = fmul double %8, %12
%21 = fmul double %8, %20
%22 = insertelement <2 x double> poison, double %20, i64 0
%23 = insertelement <2 x double> %22, double %21, i64 1
%24 = fdiv <2 x double> %23, <double 4.032000e+04, double 3.628800e+06>
%25 = extractelement <2 x double> %24, i64 0
%26 = fadd double %19, %25
%27 = extractelement <2 x double> %24, i64 1
%28 = fadd double %26, %27
%29 = fmul double %8, %21
%30 = fmul double %8, %29
%31 = insertelement <2 x double> poison, double %29, i64 0
%32 = insertelement <2 x double> %31, double %30, i64 1
%33 = fdiv <2 x double> %32, <double 0x41BC8CFC00000000, double 0x42344C3B28000000>
%34 = extractelement <2 x double> %33, i64 0
%35 = fadd double %28, %34
%36 = extractelement <2 x double> %33, i64 1
%37 = fadd double %35, %36
%38 = fmul double %8, %30
%39 = fmul double %8, %38
%40 = insertelement <2 x double> poison, double %38, i64 0
%41 = insertelement <2 x double> %40, double %39, i64 1
%42 = fdiv <2 x double> %41, <double 0x42B3077775800000, double 0x4336BEECCA730000>
%43 = extractelement <2 x double> %42, i64 0
%44 = fadd double %37, %43
%45 = extractelement <2 x double> %42, i64 1
%46 = fadd double %44, %45
ret double %46
}