#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 sine(float x) {
  if (x < -M_PI) {
    x += 6.28318531;
  } else if (x > M_PI) {
    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),%xmm1
mov    0x2ed3(%rip),%rax
movss  (%rax),%xmm0
movd   %xmm0,%eax
xor    $0x80000000,%eax
movd   %eax,%xmm0
ucomiss %xmm1,%xmm0
jbe    1152 <sine+0x52>
movss  -0x4(%rbp),%xmm0
cvtss2sd %xmm0,%xmm0
movsd  0xec0(%rip),%xmm1
addsd  %xmm1,%xmm0
cvtsd2ss %xmm0,%xmm0
movss  %xmm0,-0x4(%rbp)
jmp    118a <sine+0x8a>
movss  -0x4(%rbp),%xmm0
mov    0x2e8a(%rip),%rax
ucomiss (%rax),%xmm0
jbe    1185 <sine+0x85>
movss  -0x4(%rbp),%xmm0
cvtss2sd %xmm0,%xmm0
movsd  0xe88(%rip),%xmm1
subsd  %xmm1,%xmm0
cvtsd2ss %xmm0,%xmm0
movss  %xmm0,-0x4(%rbp)
jmp    118a <sine+0x8a>
xorps  %xmm0,%xmm0
movss  %xmm0,-0x8(%rbp)
xorps  %xmm0,%xmm0
ucomiss -0x4(%rbp),%xmm0
jbe    129b <sine+0x19b>
movss  -0x4(%rbp),%xmm0
cvtss2sd %xmm0,%xmm0
movss  -0x4(%rbp),%xmm1
cvtss2sd %xmm1,%xmm2
movsd  0xe57(%rip),%xmm1
mulsd  %xmm2,%xmm1
movss  -0x4(%rbp),%xmm2
cvtss2sd %xmm2,%xmm2
mulsd  %xmm2,%xmm1
movsd  0xe36(%rip),%xmm2
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
cvtsd2ss %xmm0,%xmm0
movss  %xmm0,-0x8(%rbp)
xorps  %xmm0,%xmm0
ucomiss -0x8(%rbp),%xmm0
jbe    124c <sine+0x14c>
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  0xde2(%rip),%xmm2
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
cvtsd2ss %xmm0,%xmm0
movss  %xmm0,-0x8(%rbp)
jmp    1296 <sine+0x196>
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  0xd93(%rip),%xmm2
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
cvtsd2ss %xmm0,%xmm0
movss  %xmm0,-0x8(%rbp)
jmp    13ae <sine+0x2ae>
movss  -0x4(%rbp),%xmm0
cvtss2sd %xmm0,%xmm0
movss  -0x4(%rbp),%xmm1
cvtss2sd %xmm1,%xmm2
movsd  0xd5b(%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  0xd23(%rip),%xmm2
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
cvtsd2ss %xmm0,%xmm0
movss  %xmm0,-0x8(%rbp)
xorps  %xmm0,%xmm0
ucomiss -0x8(%rbp),%xmm0
jbe    135f <sine+0x25f>
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  0xccf(%rip),%xmm2
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
cvtsd2ss %xmm0,%xmm0
movss  %xmm0,-0x8(%rbp)
jmp    13a9 <sine+0x2a9>
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  0xc80(%rip),%xmm2
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
cvtsd2ss %xmm0,%xmm0
movss  %xmm0,-0x8(%rbp)
jmp    13ae <sine+0x2ae>
movss  -0x8(%rbp),%xmm0
pop    %rbp
ret

x86 assembly (clang, -O2):
<sine>:
mov    0x2ee1(%rip),%rax
movss  (%rax),%xmm1
movaps 0xeee(%rip),%xmm2
xorps  %xmm1,%xmm2
ucomiss %xmm0,%xmm2
jbe    1128 <sine+0x28>
cvtss2sd %xmm0,%xmm0
addsd  0xef2(%rip),%xmm0
jmp    1139 <sine+0x39>
ucomiss %xmm1,%xmm0
jbe    113d <sine+0x3d>
cvtss2sd %xmm0,%xmm0
addsd  0xed7(%rip),%xmm0
cvtsd2ss %xmm0,%xmm0
xorps  %xmm1,%xmm1
ucomiss %xmm0,%xmm1
cvtss2sd %xmm0,%xmm0
jbe    1153 <sine+0x53>
movsd  0xedf(%rip),%xmm2
jmp    115b <sine+0x5b>
movsd  0xec5(%rip),%xmm2
mulsd  %xmm0,%xmm2
mulsd  %xmm0,%xmm2
mulsd  0xebd(%rip),%xmm0
addsd  %xmm2,%xmm0
cvtsd2ss %xmm0,%xmm0
ucomiss %xmm0,%xmm1
movaps 0xe83(%rip),%xmm2
xorps  %xmm0,%xmm2
movaps %xmm0,%xmm1
jbe    118b <sine+0x8b>
mulss  %xmm2,%xmm1
jmp    118f <sine+0x8f>
mulss  %xmm0,%xmm1
addss  %xmm2,%xmm1
cvtss2sd %xmm1,%xmm1
mulsd  0xe99(%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 @sine(float %0) {
%2 = alloca float
%3 = alloca float
store float %0, float* %2
%4 = load float, float* %2
%5 = load float, float* @M_PI
%6 = fneg float %5
%7 = fcmp olt float %4, %6
br i1 %7, label %8, label %13
8: ; preds = %1
%9 = load float, float* %2
%10 = fpext float %9 to double
%11 = fadd double %10, 0x401921FB5474A168
%12 = fptrunc double %11 to float
store float %12, float* %2
br label %23
13: ; preds = %1
%14 = load float, float* %2
%15 = load float, float* @M_PI
%16 = fcmp ogt float %14, %15
br i1 %16, label %17, label %22
17: ; preds = %13
%18 = load float, float* %2
%19 = fpext float %18 to double
%20 = fsub double %19, 0x401921FB5474A168
%21 = fptrunc double %20 to float
store float %21, float* %2
br label %22
22: ; preds = %17, %13
br label %23
23: ; preds = %22, %8
store float 0.000000e+00, float* %3
%24 = load float, float* %2
%25 = fcmp olt float %24, 0.000000e+00
br i1 %25, label %26, label %63
26: ; preds = %23
%27 = load float, float* %2
%28 = fpext float %27 to double
%29 = load float, float* %2
%30 = fpext float %29 to double
%31 = fmul double 0x3FD9F02F62992759, %30
%32 = load float, float* %2
%33 = fpext float %32 to double
%34 = fmul double %31, %33
%35 = call double @llvm.fmuladd.f64(double 0x3FF45F306C8462A6, double %28, double %34)
%36 = fptrunc double %35 to float
store float %36, float* %3
%37 = load float, float* %3
%38 = fcmp olt float %37, 0.000000e+00
br i1 %38, label %39, label %51
39: ; preds = %26
%40 = load float, float* %3
%41 = load float, float* %3
%42 = fneg float %41
%43 = load float, float* %3
%44 = fneg float %43
%45 = call float @llvm.fmuladd.f32(float %40, float %42, float %44)
%46 = fpext float %45 to double
%47 = load float, float* %3
%48 = fpext float %47 to double
%49 = call double @llvm.fmuladd.f64(double 2.250000e-01, double %46, double %48)
%50 = fptrunc double %49 to float
store float %50, float* %3
br label %62
51: ; preds = %26
%52 = load float, float* %3
%53 = load float, float* %3
%54 = load float, float* %3
%55 = fneg float %54
%56 = call float @llvm.fmuladd.f32(float %52, float %53, float %55)
%57 = fpext float %56 to double
%58 = load float, float* %3
%59 = fpext float %58 to double
%60 = call double @llvm.fmuladd.f64(double 2.250000e-01, double %57, double %59)
%61 = fptrunc double %60 to float
store float %61, float* %3
br label %62
62: ; preds = %51, %39
br label %101
63: ; preds = %23
%64 = load float, float* %2
%65 = fpext float %64 to double
%66 = load float, float* %2
%67 = fpext float %66 to double
%68 = fmul double 0x3FD9F02F62992759, %67
%69 = load float, float* %2
%70 = fpext float %69 to double
%71 = fmul double %68, %70
%72 = fneg double %71
%73 = call double @llvm.fmuladd.f64(double 0x3FF45F306C8462A6, double %65, double %72)
%74 = fptrunc double %73 to float
store float %74, float* %3
%75 = load float, float* %3
%76 = fcmp olt float %75, 0.000000e+00
br i1 %76, label %77, label %89
77: ; preds = %63
%78 = load float, float* %3
%79 = load float, float* %3
%80 = fneg float %79
%81 = load float, float* %3
%82 = fneg float %81
%83 = call float @llvm.fmuladd.f32(float %78, float %80, float %82)
%84 = fpext float %83 to double
%85 = load float, float* %3
%86 = fpext float %85 to double
%87 = call double @llvm.fmuladd.f64(double 2.250000e-01, double %84, double %86)
%88 = fptrunc double %87 to float
store float %88, float* %3
br label %100
89: ; preds = %63
%90 = load float, float* %3
%91 = load float, float* %3
%92 = load float, float* %3
%93 = fneg float %92
%94 = call float @llvm.fmuladd.f32(float %90, float %91, float %93)
%95 = fpext float %94 to double
%96 = load float, float* %3
%97 = fpext float %96 to double
%98 = call double @llvm.fmuladd.f64(double 2.250000e-01, double %95, double %97)
%99 = fptrunc double %98 to float
store float %99, float* %3
br label %100
100: ; preds = %89, %77
br label %101
101: ; preds = %100, %62
%102 = load float, float* %3
ret float %102
}

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