float sine(float x) {
  if (x < -3.14159265)
    x += 6.28318531;
  else if (x > 3.14159265)
    x -= 6.28318531;
  float result = 0.0;
  if (x < 0) {
    result = 1.27323954 * x + .405284735 * x * x;
    if (result < 0)
      result = .225 * (result * -result - result) + result;
    else
      result = .225 * (result * result - result) + result;
  } else {
    result = 1.27323954 * x - 0.405284735 * x * x;
    if (result < 0)
      result = .225 * (result * -result - result) + result;
    else
      result = .225 * (result * result - result) + result;
  }
  return result;
}


x86 assembly (clang, -O0):
<sine>:
push   %rbp
mov    %rsp,%rbp
movss  %xmm0,-0x4(%rbp)
movss  -0x4(%rbp),%xmm0
cvtss2sd %xmm0,%xmm1
movsd  0xee6(%rip),%xmm0
ucomisd %xmm1,%xmm0
jbe    1147 <sine+0x47>
movss  -0x4(%rbp),%xmm0
cvtss2sd %xmm0,%xmm0
movsd  0xedb(%rip),%xmm1
addsd  %xmm1,%xmm0
cvtsd2ss %xmm0,%xmm0
movss  %xmm0,-0x4(%rbp)
jmp    1185 <sine+0x85>
movss  -0x4(%rbp),%xmm0
cvtss2sd %xmm0,%xmm0
movsd  0xeb0(%rip),%xmm1
ucomisd %xmm1,%xmm0
jbe    1180 <sine+0x80>
movss  -0x4(%rbp),%xmm0
cvtss2sd %xmm0,%xmm0
movsd  0xe9d(%rip),%xmm1
subsd  %xmm1,%xmm0
cvtsd2ss %xmm0,%xmm0
movss  %xmm0,-0x4(%rbp)
jmp    1185 <sine+0x85>
xorps  %xmm0,%xmm0
movss  %xmm0,-0x8(%rbp)
xorps  %xmm0,%xmm0
ucomiss -0x4(%rbp),%xmm0
jbe    1296 <sine+0x196>
movss  -0x4(%rbp),%xmm0
cvtss2sd %xmm0,%xmm0
movss  -0x4(%rbp),%xmm1
cvtss2sd %xmm1,%xmm2
movsd  0xe6c(%rip),%xmm1
mulsd  %xmm2,%xmm1
movss  -0x4(%rbp),%xmm2
cvtss2sd %xmm2,%xmm2
mulsd  %xmm2,%xmm1
movsd  0xe4b(%rip),%xmm2
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
cvtsd2ss %xmm0,%xmm0
movss  %xmm0,-0x8(%rbp)
xorps  %xmm0,%xmm0
ucomiss -0x8(%rbp),%xmm0
jbe    1247 <sine+0x147>
movss  -0x8(%rbp),%xmm0
movss  -0x8(%rbp),%xmm1
movd   %xmm1,%eax
xor    $0x80000000,%eax
movd   %eax,%xmm2
movss  -0x8(%rbp),%xmm1
movd   %xmm1,%eax
xor    $0x80000000,%eax
movd   %eax,%xmm1
mulss  %xmm2,%xmm0
addss  %xmm1,%xmm0
cvtss2sd %xmm0,%xmm0
movss  -0x8(%rbp),%xmm1
cvtss2sd %xmm1,%xmm1
movsd  0xdf7(%rip),%xmm2
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
cvtsd2ss %xmm0,%xmm0
movss  %xmm0,-0x8(%rbp)
jmp    1291 <sine+0x191>
movss  -0x8(%rbp),%xmm0
movss  -0x8(%rbp),%xmm2
movss  -0x8(%rbp),%xmm1
movd   %xmm1,%eax
xor    $0x80000000,%eax
movd   %eax,%xmm1
mulss  %xmm2,%xmm0
addss  %xmm1,%xmm0
cvtss2sd %xmm0,%xmm0
movss  -0x8(%rbp),%xmm1
cvtss2sd %xmm1,%xmm1
movsd  0xda8(%rip),%xmm2
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
cvtsd2ss %xmm0,%xmm0
movss  %xmm0,-0x8(%rbp)
jmp    13a9 <sine+0x2a9>
movss  -0x4(%rbp),%xmm0
cvtss2sd %xmm0,%xmm0
movss  -0x4(%rbp),%xmm1
cvtss2sd %xmm1,%xmm2
movsd  0xd70(%rip),%xmm1
mulsd  %xmm2,%xmm1
movss  -0x4(%rbp),%xmm2
cvtss2sd %xmm2,%xmm2
mulsd  %xmm2,%xmm1
movq   %xmm1,%rax
movabs $0x8000000000000000,%rcx
xor    %rcx,%rax
movq   %rax,%xmm1
movsd  0xd38(%rip),%xmm2
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
cvtsd2ss %xmm0,%xmm0
movss  %xmm0,-0x8(%rbp)
xorps  %xmm0,%xmm0
ucomiss -0x8(%rbp),%xmm0
jbe    135a <sine+0x25a>
movss  -0x8(%rbp),%xmm0
movss  -0x8(%rbp),%xmm1
movd   %xmm1,%eax
xor    $0x80000000,%eax
movd   %eax,%xmm2
movss  -0x8(%rbp),%xmm1
movd   %xmm1,%eax
xor    $0x80000000,%eax
movd   %eax,%xmm1
mulss  %xmm2,%xmm0
addss  %xmm1,%xmm0
cvtss2sd %xmm0,%xmm0
movss  -0x8(%rbp),%xmm1
cvtss2sd %xmm1,%xmm1
movsd  0xce4(%rip),%xmm2
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
cvtsd2ss %xmm0,%xmm0
movss  %xmm0,-0x8(%rbp)
jmp    13a4 <sine+0x2a4>
movss  -0x8(%rbp),%xmm0
movss  -0x8(%rbp),%xmm2
movss  -0x8(%rbp),%xmm1
movd   %xmm1,%eax
xor    $0x80000000,%eax
movd   %eax,%xmm1
mulss  %xmm2,%xmm0
addss  %xmm1,%xmm0
cvtss2sd %xmm0,%xmm0
movss  -0x8(%rbp),%xmm1
cvtss2sd %xmm1,%xmm1
movsd  0xc95(%rip),%xmm2
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
cvtsd2ss %xmm0,%xmm0
movss  %xmm0,-0x8(%rbp)
jmp    13a9 <sine+0x2a9>
movss  -0x8(%rbp),%xmm0
pop    %rbp
ret

x86 assembly (clang, -O2):
<sine>:
cvtss2sd %xmm0,%xmm1
movsd  0xef4(%rip),%xmm2
ucomisd %xmm1,%xmm2
jbe    111c <sine+0x1c>
addsd  0xefe(%rip),%xmm1
jmp    112e <sine+0x2e>
ucomisd 0xee4(%rip),%xmm1
jbe    1135 <sine+0x35>
addsd  0xee2(%rip),%xmm1
xorps  %xmm0,%xmm0
cvtsd2ss %xmm1,%xmm0
xorps  %xmm1,%xmm1
ucomiss %xmm0,%xmm1
cvtss2sd %xmm0,%xmm0
jbe    114b <sine+0x4b>
movsd  0xee7(%rip),%xmm2
jmp    1153 <sine+0x53>
movsd  0xecd(%rip),%xmm2
mulsd  %xmm0,%xmm2
mulsd  %xmm0,%xmm2
mulsd  0xec5(%rip),%xmm0
addsd  %xmm2,%xmm0
cvtsd2ss %xmm0,%xmm0
ucomiss %xmm0,%xmm1
movaps 0xecb(%rip),%xmm2
xorps  %xmm0,%xmm2
movaps %xmm0,%xmm1
jbe    1183 <sine+0x83>
mulss  %xmm2,%xmm1
jmp    1187 <sine+0x87>
mulss  %xmm0,%xmm1
addss  %xmm2,%xmm1
cvtss2sd %xmm1,%xmm1
mulsd  0xea1(%rip),%xmm1
cvtss2sd %xmm0,%xmm0
addsd  %xmm0,%xmm1
xorps  %xmm0,%xmm0
cvtsd2ss %xmm1,%xmm0
ret

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

LLVM IR (-O2):
define float @sine(float %0) {
%2 = fpext float %0 to double
%3 = fcmp olt double %2, 0xC00921FB53C8D4F1
br i1 %3, label %4, label %7
4: ; preds = %1
%5 = fadd double %2, 0x401921FB5474A168
%6 = fptrunc double %5 to float
br label %12
7: ; preds = %1
%8 = fcmp ogt double %2, 0x400921FB53C8D4F1
br i1 %8, label %9, label %12
9: ; preds = %7
%10 = fadd double %2, 0xC01921FB5474A168
%11 = fptrunc double %10 to float
br label %12
12: ; preds = %7, %9, %4
%13 = phi float [ %6, %4 ], [ %11, %9 ], [ %0, %7 ]
%14 = fcmp olt float %13, 0.000000e+00
%15 = fpext float %13 to double
br i1 %14, label %16, label %27
16: ; preds = %12
%17 = fmul double %15, 0x3FD9F02F62992759
%18 = fmul double %17, %15
%19 = tail call double @llvm.fmuladd.f64(double %15, double 0x3FF45F306C8462A6, double %18)
%20 = fptrunc double %19 to float
%21 = fcmp olt float %20, 0.000000e+00
%22 = fneg float %20
br i1 %21, label %23, label %25
23: ; preds = %16
%24 = tail call float @llvm.fmuladd.f32(float %20, float %22, float %22)
br label %38
25: ; preds = %16
%26 = tail call float @llvm.fmuladd.f32(float %20, float %20, float %22)
br label %38
27: ; preds = %12
%28 = fmul double %15, 0xBFD9F02F62992759
%29 = fmul double %28, %15
%30 = tail call double @llvm.fmuladd.f64(double %15, double 0x3FF45F306C8462A6, double %29)
%31 = fptrunc double %30 to float
%32 = fcmp olt float %31, 0.000000e+00
%33 = fneg float %31
br i1 %32, label %34, label %36
34: ; preds = %27
%35 = tail call float @llvm.fmuladd.f32(float %31, float %33, float %33)
br label %38
36: ; preds = %27
%37 = tail call float @llvm.fmuladd.f32(float %31, float %31, float %33)
br label %38
38: ; preds = %34, %36, %23, %25
%39 = phi float [ %35, %34 ], [ %37, %36 ], [ %24, %23 ], [ %26, %25 ]
%40 = phi float [ %31, %34 ], [ %31, %36 ], [ %20, %23 ], [ %20, %25 ]
%41 = fpext float %39 to double
%42 = fpext float %40 to double
%43 = tail call double @llvm.fmuladd.f64(double %41, double 2.250000e-01, double %42)
%44 = fptrunc double %43 to float
ret float %44
}