#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 */

/* Variables and functions */
float M_PI;
float cose(float x) {
  x += 1.57079632;
  if (x > M_PI)
    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  0xee6(%rip),%xmm1
addsd  %xmm1,%xmm0
cvtsd2ss %xmm0,%xmm0
movss  %xmm0,-0x4(%rbp)
movss  -0x4(%rbp),%xmm0
mov    0x2eb5(%rip),%rax
ucomiss (%rax),%xmm0
jbe    115a <cose+0x5a>
movss  -0x4(%rbp),%xmm0
cvtss2sd %xmm0,%xmm0
movsd  0xebb(%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    126b <cose+0x16b>
movss  -0x4(%rbp),%xmm0
cvtss2sd %xmm0,%xmm0
movss  -0x4(%rbp),%xmm1
cvtss2sd %xmm1,%xmm2
movsd  0xe8f(%rip),%xmm1
mulsd  %xmm2,%xmm1
movss  -0x4(%rbp),%xmm2
cvtss2sd %xmm2,%xmm2
mulsd  %xmm2,%xmm1
movsd  0xe6e(%rip),%xmm2
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
cvtsd2ss %xmm0,%xmm0
movss  %xmm0,-0x8(%rbp)
xorps  %xmm0,%xmm0
ucomiss -0x8(%rbp),%xmm0
jbe    121c <cose+0x11c>
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  0xe1a(%rip),%xmm2
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
cvtsd2ss %xmm0,%xmm0
movss  %xmm0,-0x8(%rbp)
jmp    1266 <cose+0x166>
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  0xdcb(%rip),%xmm2
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
cvtsd2ss %xmm0,%xmm0
movss  %xmm0,-0x8(%rbp)
jmp    137e <cose+0x27e>
movss  -0x4(%rbp),%xmm0
cvtss2sd %xmm0,%xmm0
movss  -0x4(%rbp),%xmm1
cvtss2sd %xmm1,%xmm2
movsd  0xd93(%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  0xd5b(%rip),%xmm2
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
cvtsd2ss %xmm0,%xmm0
movss  %xmm0,-0x8(%rbp)
xorps  %xmm0,%xmm0
ucomiss -0x8(%rbp),%xmm0
jbe    132f <cose+0x22f>
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  0xd07(%rip),%xmm2
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
cvtsd2ss %xmm0,%xmm0
movss  %xmm0,-0x8(%rbp)
jmp    1379 <cose+0x279>
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  0xcb8(%rip),%xmm2
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
cvtsd2ss %xmm0,%xmm0
movss  %xmm0,-0x8(%rbp)
jmp    137e <cose+0x27e>
movss  -0x8(%rbp),%xmm0
pop    %rbp
ret

x86 assembly (clang, -O2):
<cose>:
cvtss2sd %xmm0,%xmm0
addsd  0xef4(%rip),%xmm0
cvtsd2ss %xmm0,%xmm0
mov    0x2ed1(%rip),%rax
movss  (%rax),%xmm2
cvtss2sd %xmm0,%xmm1
addsd  0xee1(%rip),%xmm1
cvtsd2ss %xmm1,%xmm1
cmpltss %xmm0,%xmm2
movaps %xmm2,%xmm3
andnps %xmm0,%xmm3
andps  %xmm1,%xmm2
orps   %xmm3,%xmm2
xorps  %xmm1,%xmm1
ucomiss %xmm2,%xmm1
xorps  %xmm0,%xmm0
cvtss2sd %xmm2,%xmm0
jbe    1155 <cose+0x55>
movsd  0xecd(%rip),%xmm2
jmp    115d <cose+0x5d>
movsd  0xeb3(%rip),%xmm2
mulsd  %xmm0,%xmm2
mulsd  %xmm0,%xmm2
mulsd  0xeab(%rip),%xmm0
addsd  %xmm2,%xmm0
cvtsd2ss %xmm0,%xmm0
ucomiss %xmm0,%xmm1
movaps 0xeb1(%rip),%xmm2
xorps  %xmm0,%xmm2
movaps %xmm0,%xmm1
jbe    118d <cose+0x8d>
mulss  %xmm2,%xmm1
jmp    1191 <cose+0x91>
mulss  %xmm0,%xmm1
addss  %xmm2,%xmm1
cvtss2sd %xmm1,%xmm1
mulsd  0xe87(%rip),%xmm1
cvtss2sd %xmm0,%xmm0
addsd  %xmm0,%xmm1
xorps  %xmm0,%xmm0
cvtsd2ss %xmm1,%xmm0
ret

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