float cose(float x) {
  x += 1.57079632;
  if (x > 3.14159265)
    x -= 6.28318531;
  float result = 0.0;
  if (x < 0) {
    result = 1.27323954 * x + 0.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):
<cose>:
push   %rbp
mov    %rsp,%rbp
movss  %xmm0,-0x4(%rbp)
movss  -0x4(%rbp),%xmm0
cvtss2sd %xmm0,%xmm0
movsd  0xeee(%rip),%xmm1
addsd  %xmm1,%xmm0
cvtsd2ss %xmm0,%xmm0
movss  %xmm0,-0x4(%rbp)
movss  -0x4(%rbp),%xmm0
cvtss2sd %xmm0,%xmm0
movsd  0xec8(%rip),%xmm1
ucomisd %xmm1,%xmm0
jbe    1160 <cose+0x60>
movss  -0x4(%rbp),%xmm0
cvtss2sd %xmm0,%xmm0
movsd  0xebd(%rip),%xmm1
subsd  %xmm1,%xmm0
cvtsd2ss %xmm0,%xmm0
movss  %xmm0,-0x4(%rbp)
xorps  %xmm0,%xmm0
movss  %xmm0,-0x8(%rbp)
xorps  %xmm0,%xmm0
ucomiss -0x4(%rbp),%xmm0
jbe    1271 <cose+0x171>
movss  -0x4(%rbp),%xmm0
cvtss2sd %xmm0,%xmm0
movss  -0x4(%rbp),%xmm1
cvtss2sd %xmm1,%xmm2
movsd  0xe91(%rip),%xmm1
mulsd  %xmm2,%xmm1
movss  -0x4(%rbp),%xmm2
cvtss2sd %xmm2,%xmm2
mulsd  %xmm2,%xmm1
movsd  0xe70(%rip),%xmm2
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
cvtsd2ss %xmm0,%xmm0
movss  %xmm0,-0x8(%rbp)
xorps  %xmm0,%xmm0
ucomiss -0x8(%rbp),%xmm0
jbe    1222 <cose+0x122>
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  0xe1c(%rip),%xmm2
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
cvtsd2ss %xmm0,%xmm0
movss  %xmm0,-0x8(%rbp)
jmp    126c <cose+0x16c>
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  0xdcd(%rip),%xmm2
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
cvtsd2ss %xmm0,%xmm0
movss  %xmm0,-0x8(%rbp)
jmp    1384 <cose+0x284>
movss  -0x4(%rbp),%xmm0
cvtss2sd %xmm0,%xmm0
movss  -0x4(%rbp),%xmm1
cvtss2sd %xmm1,%xmm2
movsd  0xd95(%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  0xd5d(%rip),%xmm2
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
cvtsd2ss %xmm0,%xmm0
movss  %xmm0,-0x8(%rbp)
xorps  %xmm0,%xmm0
ucomiss -0x8(%rbp),%xmm0
jbe    1335 <cose+0x235>
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  0xd09(%rip),%xmm2
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
cvtsd2ss %xmm0,%xmm0
movss  %xmm0,-0x8(%rbp)
jmp    137f <cose+0x27f>
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  0xcba(%rip),%xmm2
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
cvtsd2ss %xmm0,%xmm0
movss  %xmm0,-0x8(%rbp)
jmp    1384 <cose+0x284>
movss  -0x8(%rbp),%xmm0
pop    %rbp
ret

x86 assembly (clang, -O2):
<cose>:
cvtss2sd %xmm0,%xmm0
addsd  0xef4(%rip),%xmm0
cvtsd2ss %xmm0,%xmm0
cvtss2sd %xmm0,%xmm1
ucomisd 0xeec(%rip),%xmm1
jbe    112d <cose+0x2d>
addsd  0xeea(%rip),%xmm1
xorps  %xmm0,%xmm0
cvtsd2ss %xmm1,%xmm0
xorps  %xmm1,%xmm1
ucomiss %xmm0,%xmm1
cvtss2sd %xmm0,%xmm0
jbe    1143 <cose+0x43>
movsd  0xee7(%rip),%xmm2
jmp    114b <cose+0x4b>
movsd  0xecd(%rip),%xmm2
mulsd  %xmm0,%xmm2
mulsd  %xmm0,%xmm2
mulsd  0xec5(%rip),%xmm0
addsd  %xmm2,%xmm0
cvtsd2ss %xmm0,%xmm0
ucomiss %xmm0,%xmm1
movaps 0xed3(%rip),%xmm2
xorps  %xmm0,%xmm2
movaps %xmm0,%xmm1
jbe    117b <cose+0x7b>
mulss  %xmm2,%xmm1
jmp    117f <cose+0x7f>
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 @cose(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 = fadd double %5, 0x3FF921FB52713C02
%7 = fptrunc double %6 to float
store float %7, float* %2
%8 = load float, float* %2
%9 = fpext float %8 to double
%10 = fcmp ogt double %9, 0x400921FB53C8D4F1
br i1 %10, label %11, label %16
11: ; preds = %1
%12 = load float, float* %2
%13 = fpext float %12 to double
%14 = fsub double %13, 0x401921FB5474A168
%15 = fptrunc double %14 to float
store float %15, float* %2
br label %16
16: ; preds = %11, %1
store float 0.000000e+00, float* %3
%17 = load float, float* %2
%18 = fcmp olt float %17, 0.000000e+00
br i1 %18, label %19, label %56
19: ; preds = %16
%20 = load float, float* %2
%21 = fpext float %20 to double
%22 = load float, float* %2
%23 = fpext float %22 to double
%24 = fmul double 0x3FD9F02F62992759, %23
%25 = load float, float* %2
%26 = fpext float %25 to double
%27 = fmul double %24, %26
%28 = call double @llvm.fmuladd.f64(double 0x3FF45F306C8462A6, double %21, double %27)
%29 = fptrunc double %28 to float
store float %29, float* %3
%30 = load float, float* %3
%31 = fcmp olt float %30, 0.000000e+00
br i1 %31, label %32, label %44
32: ; preds = %19
%33 = load float, float* %3
%34 = load float, float* %3
%35 = fneg float %34
%36 = load float, float* %3
%37 = fneg float %36
%38 = call float @llvm.fmuladd.f32(float %33, float %35, float %37)
%39 = fpext float %38 to double
%40 = load float, float* %3
%41 = fpext float %40 to double
%42 = call double @llvm.fmuladd.f64(double 2.250000e-01, double %39, double %41)
%43 = fptrunc double %42 to float
store float %43, float* %3
br label %55
44: ; preds = %19
%45 = load float, float* %3
%46 = load float, float* %3
%47 = load float, float* %3
%48 = fneg float %47
%49 = call float @llvm.fmuladd.f32(float %45, float %46, float %48)
%50 = fpext float %49 to double
%51 = load float, float* %3
%52 = fpext float %51 to double
%53 = call double @llvm.fmuladd.f64(double 2.250000e-01, double %50, double %52)
%54 = fptrunc double %53 to float
store float %54, float* %3
br label %55
55: ; preds = %44, %32
br label %94
56: ; preds = %16
%57 = load float, float* %2
%58 = fpext float %57 to double
%59 = load float, float* %2
%60 = fpext float %59 to double
%61 = fmul double 0x3FD9F02F62992759, %60
%62 = load float, float* %2
%63 = fpext float %62 to double
%64 = fmul double %61, %63
%65 = fneg double %64
%66 = call double @llvm.fmuladd.f64(double 0x3FF45F306C8462A6, double %58, double %65)
%67 = fptrunc double %66 to float
store float %67, float* %3
%68 = load float, float* %3
%69 = fcmp olt float %68, 0.000000e+00
br i1 %69, label %70, label %82
70: ; preds = %56
%71 = load float, float* %3
%72 = load float, float* %3
%73 = fneg float %72
%74 = load float, float* %3
%75 = fneg float %74
%76 = call float @llvm.fmuladd.f32(float %71, float %73, float %75)
%77 = fpext float %76 to double
%78 = load float, float* %3
%79 = fpext float %78 to double
%80 = call double @llvm.fmuladd.f64(double 2.250000e-01, double %77, double %79)
%81 = fptrunc double %80 to float
store float %81, float* %3
br label %93
82: ; preds = %56
%83 = load float, float* %3
%84 = load float, float* %3
%85 = load float, float* %3
%86 = fneg float %85
%87 = call float @llvm.fmuladd.f32(float %83, float %84, float %86)
%88 = fpext float %87 to double
%89 = load float, float* %3
%90 = fpext float %89 to double
%91 = call double @llvm.fmuladd.f64(double 2.250000e-01, double %88, double %90)
%92 = fptrunc double %91 to float
store float %92, float* %3
br label %93
93: ; preds = %82, %70
br label %94
94: ; preds = %93, %55
%95 = load float, float* %3
ret float %95
}

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