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


x86 assembly (clang, -O0):
<sin>:
push   %rbp
mov    %rsp,%rbp
movsd  %xmm0,-0x8(%rbp)
xorps  %xmm0,%xmm0
movsd  %xmm0,-0x10(%rbp)
movsd  0xeef(%rip),%xmm0
movsd  %xmm0,-0x28(%rbp)
movsd  -0x8(%rbp),%xmm1
movsd  -0x8(%rbp),%xmm0
movsd  0xed0(%rip),%xmm2
divsd  %xmm2,%xmm0
cvttsd2si %xmm0,%eax
cvtsi2sd %eax,%xmm0
movq   %xmm0,%rax
movabs $0x8000000000000000,%rcx
xor    %rcx,%rax
movq   %rax,%xmm0
movsd  0xea5(%rip),%xmm2
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x8(%rbp)
movsd  -0x8(%rbp),%xmm0
mulsd  -0x8(%rbp),%xmm0
movsd  %xmm0,-0x18(%rbp)
movsd  -0x8(%rbp),%xmm0
movsd  %xmm0,-0x20(%rbp)
movl   $0x0,-0x2c(%rbp)
cmpl   $0xa,-0x2c(%rbp)
jge    11fd <sin+0xfd>
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    $0x2,%eax
mov    -0x2c(%rbp),%ecx
shl    $0x1,%ecx
add    $0x3,%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    1188 <sin+0x88>
movsd  -0x10(%rbp),%xmm0
pop    %rbp
ret

x86 assembly (clang, -O2):
<sin>:
movapd %xmm0,%xmm1
movsd  0xef4(%rip),%xmm0
movapd %xmm1,%xmm2
divsd  %xmm0,%xmm2
cvttpd2dq %xmm2,%xmm2
cvtdq2pd %xmm2,%xmm2
mulsd  %xmm0,%xmm2
subsd  %xmm2,%xmm1
movapd 0xee4(%rip),%xmm2
xorpd  %xmm1,%xmm2
mulsd  %xmm1,%xmm2
xorpd  %xmm4,%xmm4
addsd  %xmm1,%xmm4
mulsd  %xmm2,%xmm1
movapd %xmm2,%xmm0
mulsd  %xmm1,%xmm0
divsd  0xeb8(%rip),%xmm1
movapd %xmm2,%xmm3
mulsd  %xmm0,%xmm3
unpcklpd %xmm3,%xmm0
divpd  0xebc(%rip),%xmm0
addsd  %xmm4,%xmm1
addsd  %xmm0,%xmm1
unpckhpd %xmm0,%xmm0
mulsd  %xmm2,%xmm3
movapd %xmm2,%xmm4
mulsd  %xmm3,%xmm4
unpcklpd %xmm4,%xmm3
divpd  0xea8(%rip),%xmm3
addsd  %xmm1,%xmm0
addsd  %xmm3,%xmm0
unpckhpd %xmm3,%xmm3
mulsd  %xmm2,%xmm4
movapd %xmm2,%xmm1
mulsd  %xmm4,%xmm1
unpcklpd %xmm1,%xmm4
divpd  0xe94(%rip),%xmm4
addsd  %xmm3,%xmm0
addsd  %xmm4,%xmm0
unpckhpd %xmm4,%xmm4
mulsd  %xmm2,%xmm1
mulsd  %xmm1,%xmm2
unpcklpd %xmm2,%xmm1
divpd  0xe84(%rip),%xmm1
addsd  %xmm4,%xmm0
addsd  %xmm1,%xmm0
unpckhpd %xmm1,%xmm1
addsd  %xmm1,%xmm0
ret

LLVM IR (-O0):
define double @sin(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* %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
%18 = load double, double* %2
store double %18, double* %5
store i32 0, i32* %7
br label %19
19: ; preds = %42, %1
%20 = load i32, i32* %7
%21 = icmp slt i32 %20, 10
br i1 %21, label %22, label %45
22: ; preds = %19
%23 = load double, double* %5
%24 = load double, double* %6
%25 = fdiv double %23, %24
%26 = load double, double* %3
%27 = fadd double %26, %25
store double %27, double* %3
%28 = load double, double* %4
%29 = fneg double %28
%30 = load double, double* %5
%31 = fmul double %30, %29
store double %31, double* %5
%32 = load i32, i32* %7
%33 = mul nsw i32 2, %32
%34 = add nsw i32 %33, 2
%35 = load i32, i32* %7
%36 = mul nsw i32 2, %35
%37 = add nsw i32 %36, 3
%38 = mul nsw i32 %34, %37
%39 = sitofp i32 %38 to double
%40 = load double, double* %6
%41 = fmul double %40, %39
store double %41, double* %6
br label %42
42: ; preds = %22
%43 = load i32, i32* %7
%44 = add nsw i32 %43, 1
store i32 %44, i32* %7
br label %19
45: ; preds = %19
%46 = load double, double* %3
ret double %46
}

LLVM IR (-O2):
define double @sin(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 = fadd double %6, 0.000000e+00
%10 = fmul double %8, %6
%11 = fdiv double %10, 6.000000e+00
%12 = fadd double %9, %11
%13 = fmul double %8, %10
%14 = fmul double %8, %13
%15 = insertelement <2 x double> poison, double %13, i64 0
%16 = insertelement <2 x double> %15, double %14, i64 1
%17 = fdiv <2 x double> %16, <double 1.200000e+02, double 5.040000e+03>
%18 = extractelement <2 x double> %17, i64 0
%19 = fadd double %12, %18
%20 = extractelement <2 x double> %17, i64 1
%21 = fadd double %19, %20
%22 = fmul double %8, %14
%23 = fmul double %8, %22
%24 = insertelement <2 x double> poison, double %22, i64 0
%25 = insertelement <2 x double> %24, double %23, i64 1
%26 = fdiv <2 x double> %25, <double 3.628800e+05, double 3.991680e+07>
%27 = extractelement <2 x double> %26, i64 0
%28 = fadd double %21, %27
%29 = extractelement <2 x double> %26, i64 1
%30 = fadd double %28, %29
%31 = fmul double %8, %23
%32 = fmul double %8, %31
%33 = insertelement <2 x double> poison, double %31, i64 0
%34 = insertelement <2 x double> %33, double %32, i64 1
%35 = fdiv <2 x double> %34, <double 0x41F7328CC0000000, double 0x4273077775800000>
%36 = extractelement <2 x double> %35, i64 0
%37 = fadd double %30, %36
%38 = extractelement <2 x double> %35, i64 1
%39 = fadd double %37, %38
%40 = fmul double %8, %32
%41 = fmul double %8, %40
%42 = insertelement <2 x double> poison, double %40, i64 0
%43 = insertelement <2 x double> %42, double %41, i64 1
%44 = fdiv <2 x double> %43, <double 0x42F437EEECD80000, double 0x437B02B930689000>
%45 = extractelement <2 x double> %44, i64 0
%46 = fadd double %39, %45
%47 = extractelement <2 x double> %44, i64 1
%48 = fadd double %46, %47
ret double %48
}