#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 */
double fabsf(float);
float sincosf(float x, int iscos) {
  float y, f, r, g, XN;
  int N;
  char sign;
  if (iscos) {
    y = fabsf(x) + 1.5707963268;
    sign = 0;
  } else {
    if (x < 0.0) {
      y = -x;
      sign = 1;
    } else {
      y = x;
      sign = 0;
    }
  }
  if (y > 12867.0) {
    return 0.0;
  }
  N = ((y * 0.3183098862) + 0.5);
  if (N & 1)
    sign = !sign;
  XN = N;
  if (iscos)
    XN -= 0.5;
  y = fabsf(x);
  r = (int)y;
  g = y - r;
  f = ((r - XN * 3.140625) + g) - XN * 9.676535897E-4;
  g = f * f;
  if (g > 59.6046E-9) {
    r = ((((0.2601903036E-5) * g + (-0.1980741872E-3)) * g +
          (0.8333025139E-2)) *
             g +
         (-0.1666665668E+0)) *
        g;
    f += f * r;
  }
  return (sign ? -f : f);
}


x86 assembly (clang, -O0):
<sincosf>:
push   %rbp
mov    %rsp,%rbp
sub    $0x30,%rsp
movss  %xmm0,-0x8(%rbp)
mov    %edi,-0xc(%rbp)
cmpl   $0x0,-0xc(%rbp)
je     1152 <sincosf+0x42>
movss  -0x8(%rbp),%xmm0
call   1030 <fabsf@plt>
movsd  0xec4(%rip),%xmm1
addsd  %xmm1,%xmm0
cvtsd2ss %xmm0,%xmm0
movss  %xmm0,-0x10(%rbp)
movb   $0x0,-0x25(%rbp)
jmp    119b <sincosf+0x8b>
movss  -0x8(%rbp),%xmm0
cvtss2sd %xmm0,%xmm1
xorps  %xmm0,%xmm0
ucomisd %xmm1,%xmm0
jbe    1188 <sincosf+0x78>
movss  -0x8(%rbp),%xmm0
movd   %xmm0,%eax
xor    $0x80000000,%eax
movd   %eax,%xmm0
movss  %xmm0,-0x10(%rbp)
movb   $0x1,-0x25(%rbp)
jmp    1196 <sincosf+0x86>
movss  -0x8(%rbp),%xmm0
movss  %xmm0,-0x10(%rbp)
movb   $0x0,-0x25(%rbp)
jmp    119b <sincosf+0x8b>
movss  -0x10(%rbp),%xmm0
cvtss2sd %xmm0,%xmm0
movsd  0xe5c(%rip),%xmm1
ucomisd %xmm1,%xmm0
jbe    11c3 <sincosf+0xb3>
xorps  %xmm0,%xmm0
movss  %xmm0,-0x4(%rbp)
jmp    13d8 <sincosf+0x2c8>
movss  -0x10(%rbp),%xmm0
cvtss2sd %xmm0,%xmm0
movsd  0xe3c(%rip),%xmm1
mulsd  %xmm1,%xmm0
movsd  0xe38(%rip),%xmm1
addsd  %xmm1,%xmm0
cvttsd2si %xmm0,%eax
mov    %eax,-0x24(%rbp)
mov    -0x24(%rbp),%eax
and    $0x1,%eax
cmp    $0x0,%eax
je     120b <sincosf+0xfb>
cmpb   $0x0,-0x25(%rbp)
setne  %al
xor    $0xff,%al
and    $0x1,%al
movzbl %al,%eax
mov    %al,-0x25(%rbp)
cvtsi2ssl -0x24(%rbp),%xmm0
movss  %xmm0,-0x20(%rbp)
cmpl   $0x0,-0xc(%rbp)
je     123d <sincosf+0x12d>
movss  -0x20(%rbp),%xmm0
cvtss2sd %xmm0,%xmm0
movsd  0xde8(%rip),%xmm1
subsd  %xmm1,%xmm0
cvtsd2ss %xmm0,%xmm0
movss  %xmm0,-0x20(%rbp)
movss  -0x8(%rbp),%xmm0
call   1030 <fabsf@plt>
cvtsd2ss %xmm0,%xmm0
movss  %xmm0,-0x10(%rbp)
cvttss2si -0x10(%rbp),%eax
cvtsi2ss %eax,%xmm0
movss  %xmm0,-0x18(%rbp)
movss  -0x10(%rbp),%xmm0
subss  -0x18(%rbp),%xmm0
movss  %xmm0,-0x1c(%rbp)
movss  -0x18(%rbp),%xmm0
cvtss2sd %xmm0,%xmm0
movss  -0x20(%rbp),%xmm1
cvtss2sd %xmm1,%xmm1
movq   %xmm1,%rax
movabs $0x8000000000000000,%rcx
xor    %rcx,%rax
movq   %rax,%xmm1
movsd  0xd92(%rip),%xmm2
mulsd  %xmm2,%xmm1
addsd  %xmm0,%xmm1
movss  -0x1c(%rbp),%xmm0
cvtss2sd %xmm0,%xmm0
addsd  %xmm0,%xmm1
movss  -0x20(%rbp),%xmm0
cvtss2sd %xmm0,%xmm0
movq   %xmm0,%rax
movabs $0x8000000000000000,%rcx
xor    %rcx,%rax
movq   %rax,%xmm0
movsd  0xd4d(%rip),%xmm2
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
cvtsd2ss %xmm0,%xmm0
movss  %xmm0,-0x14(%rbp)
movss  -0x14(%rbp),%xmm0
mulss  -0x14(%rbp),%xmm0
movss  %xmm0,-0x1c(%rbp)
movss  -0x1c(%rbp),%xmm0
cvtss2sd %xmm0,%xmm0
movsd  0xd14(%rip),%xmm1
ucomisd %xmm1,%xmm0
jbe    139b <sincosf+0x28b>
movss  -0x1c(%rbp),%xmm0
cvtss2sd %xmm0,%xmm0
movsd  0xd21(%rip),%xmm1
mulsd  %xmm1,%xmm0
movsd  0xd1d(%rip),%xmm1
addsd  %xmm1,%xmm0
movss  -0x1c(%rbp),%xmm1
cvtss2sd %xmm1,%xmm1
mulsd  %xmm1,%xmm0
movsd  0xcf4(%rip),%xmm1
addsd  %xmm1,%xmm0
movss  -0x1c(%rbp),%xmm1
cvtss2sd %xmm1,%xmm1
mulsd  %xmm1,%xmm0
movsd  0xcd3(%rip),%xmm1
addsd  %xmm1,%xmm0
movss  -0x1c(%rbp),%xmm1
cvtss2sd %xmm1,%xmm1
mulsd  %xmm1,%xmm0
cvtsd2ss %xmm0,%xmm0
movss  %xmm0,-0x18(%rbp)
movss  -0x14(%rbp),%xmm0
movss  -0x18(%rbp),%xmm2
movss  -0x14(%rbp),%xmm1
mulss  %xmm2,%xmm0
addss  %xmm1,%xmm0
movss  %xmm0,-0x14(%rbp)
movsbl -0x25(%rbp),%eax
cmp    $0x0,%eax
je     13c4 <sincosf+0x2b4>
movss  -0x14(%rbp),%xmm0
movd   %xmm0,%eax
xor    $0x80000000,%eax
movd   %eax,%xmm0
movss  %xmm0,-0x2c(%rbp)
jmp    13ce <sincosf+0x2be>
movss  -0x14(%rbp),%xmm0
movss  %xmm0,-0x2c(%rbp)
movss  -0x2c(%rbp),%xmm0
movss  %xmm0,-0x4(%rbp)
movss  -0x4(%rbp),%xmm0
add    $0x30,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<sincosf>:
push   %rbp
push   %rbx
sub    $0x28,%rsp
mov    %edi,%ebx
test   %edi,%edi
movapd %xmm0,0x10(%rsp)
je     1139 <sincosf+0x29>
call   1030 <fabsf@plt>
addsd  0xed1(%rip),%xmm0
cvtsd2ss %xmm0,%xmm1
mov    $0x1,%al
xor    %ecx,%ecx
jmp    1158 <sincosf+0x48>
xorps  %xmm1,%xmm1
ucomiss %xmm0,%xmm1
jbe    1151 <sincosf+0x41>
movaps 0xf08(%rip),%xmm1
xorps  %xmm0,%xmm1
mov    $0x1,%cl
xor    %eax,%eax
jmp    1158 <sincosf+0x48>
mov    $0x1,%al
xor    %ecx,%ecx
movaps %xmm0,%xmm1
xorps  %xmm0,%xmm0
ucomiss 0xefe(%rip),%xmm1
ja     1256 <sincosf+0x146>
xorps  %xmm0,%xmm0
cvtss2sd %xmm1,%xmm0
mulsd  0xe91(%rip),%xmm0
addsd  0xe91(%rip),%xmm0
cvttsd2si %xmm0,%edx
test   $0x1,%dl
movzbl %cl,%ecx
movzbl %al,%ebp
cmove  %ecx,%ebp
cvttpd2dq %xmm0,%xmm0
cvtdq2ps %xmm0,%xmm0
test   %ebx,%ebx
je     11a2 <sincosf+0x92>
addss  0xec2(%rip),%xmm0
movaps %xmm0,(%rsp)
movaps 0x10(%rsp),%xmm0
call   1030 <fabsf@plt>
cvtsd2ss %xmm0,%xmm0
cvttps2dq %xmm0,%xmm1
cvtdq2ps %xmm1,%xmm2
subss  %xmm2,%xmm0
cvtdq2pd %xmm1,%xmm1
movaps (%rsp),%xmm2
cvtss2sd %xmm2,%xmm2
movsd  0xe45(%rip),%xmm3
mulsd  %xmm2,%xmm3
addsd  %xmm1,%xmm3
cvtss2sd %xmm0,%xmm0
addsd  %xmm3,%xmm0
mulsd  0xe35(%rip),%xmm2
addsd  %xmm0,%xmm2
xorps  %xmm0,%xmm0
cvtsd2ss %xmm2,%xmm0
movaps %xmm0,%xmm1
mulss  %xmm0,%xmm1
cvtss2sd %xmm1,%xmm1
ucomisd 0xe1f(%rip),%xmm1
jbe    124a <sincosf+0x13a>
movsd  0xe1d(%rip),%xmm2
mulsd  %xmm1,%xmm2
addsd  0xe19(%rip),%xmm2
mulsd  %xmm1,%xmm2
addsd  0xe15(%rip),%xmm2
mulsd  %xmm1,%xmm2
addsd  0xe11(%rip),%xmm2
mulsd  %xmm1,%xmm2
xorps  %xmm1,%xmm1
cvtsd2ss %xmm2,%xmm1
mulss  %xmm0,%xmm1
addss  %xmm1,%xmm0
test   %bpl,%bpl
je     1256 <sincosf+0x146>
xorps  0xdfa(%rip),%xmm0
add    $0x28,%rsp
pop    %rbx
pop    %rbp
ret

LLVM IR (-O0):
define float @sincosf(float %0, i32 %1) {
%3 = alloca float
%4 = alloca float
%5 = alloca i32
%6 = alloca float
%7 = alloca float
%8 = alloca float
%9 = alloca float
%10 = alloca float
%11 = alloca i32
%12 = alloca i8
store float %0, float* %4
store i32 %1, i32* %5
%13 = load i32, i32* %5
%14 = icmp ne i32 %13, 0
br i1 %14, label %15, label %20
15: ; preds = %2
%16 = load float, float* %4
%17 = call double @fabsf(float %16)
%18 = fadd double %17, 0x3FF921FB544486E0
%19 = fptrunc double %18 to float
store float %19, float* %6
store i8 0, i8* %12
br label %30
20: ; preds = %2
%21 = load float, float* %4
%22 = fpext float %21 to double
%23 = fcmp olt double %22, 0.000000e+00
br i1 %23, label %24, label %27
24: ; preds = %20
%25 = load float, float* %4
%26 = fneg float %25
store float %26, float* %6
store i8 1, i8* %12
br label %29
27: ; preds = %20
%28 = load float, float* %4
store float %28, float* %6
store i8 0, i8* %12
br label %29
29: ; preds = %27, %24
br label %30
30: ; preds = %29, %15
%31 = load float, float* %6
%32 = fpext float %31 to double
%33 = fcmp ogt double %32, 1.286700e+04
br i1 %33, label %34, label %35
34: ; preds = %30
store float 0.000000e+00, float* %3
br label %118
35: ; preds = %30
%36 = load float, float* %6
%37 = fpext float %36 to double
%38 = call double @llvm.fmuladd.f64(double %37, double 0x3FD45F306DCE3D24, double 5.000000e-01)
%39 = fptosi double %38 to i32
store i32 %39, i32* %11
%40 = load i32, i32* %11
%41 = and i32 %40, 1
%42 = icmp ne i32 %41, 0
br i1 %42, label %43, label %49
43: ; preds = %35
%44 = load i8, i8* %12
%45 = icmp ne i8 %44, 0
%46 = xor i1 %45, true
%47 = zext i1 %46 to i32
%48 = trunc i32 %47 to i8
store i8 %48, i8* %12
br label %49
49: ; preds = %43, %35
%50 = load i32, i32* %11
%51 = sitofp i32 %50 to float
store float %51, float* %10
%52 = load i32, i32* %5
%53 = icmp ne i32 %52, 0
br i1 %53, label %54, label %59
54: ; preds = %49
%55 = load float, float* %10
%56 = fpext float %55 to double
%57 = fsub double %56, 5.000000e-01
%58 = fptrunc double %57 to float
store float %58, float* %10
br label %59
59: ; preds = %54, %49
%60 = load float, float* %4
%61 = call double @fabsf(float %60)
%62 = fptrunc double %61 to float
store float %62, float* %6
%63 = load float, float* %6
%64 = fptosi float %63 to i32
%65 = sitofp i32 %64 to float
store float %65, float* %8
%66 = load float, float* %6
%67 = load float, float* %8
%68 = fsub float %66, %67
store float %68, float* %9
%69 = load float, float* %8
%70 = fpext float %69 to double
%71 = load float, float* %10
%72 = fpext float %71 to double
%73 = fneg double %72
%74 = call double @llvm.fmuladd.f64(double %73, double 0x4009200000000000, double %70)
%75 = load float, float* %9
%76 = fpext float %75 to double
%77 = fadd double %74, %76
%78 = load float, float* %10
%79 = fpext float %78 to double
%80 = fneg double %79
%81 = call double @llvm.fmuladd.f64(double %80, double 0x3F4FB54442C46525, double %77)
%82 = fptrunc double %81 to float
store float %82, float* %7
%83 = load float, float* %7
%84 = load float, float* %7
%85 = fmul float %83, %84
store float %85, float* %9
%86 = load float, float* %9
%87 = fpext float %86 to double
%88 = fcmp ogt double %87, 5.960460e-08
br i1 %88, label %89, label %107
89: ; preds = %59
%90 = load float, float* %9
%91 = fpext float %90 to double
%92 = call double @llvm.fmuladd.f64(double 0x3EC5D38B523B11F2, double %91, double 0xBF29F6444FFA3449)
%93 = load float, float* %9
%94 = fpext float %93 to double
%95 = call double @llvm.fmuladd.f64(double %92, double %94, double 0x3F8110E7B3970AB0)
%96 = load float, float* %9
%97 = fpext float %96 to double
%98 = call double @llvm.fmuladd.f64(double %95, double %97, double 0xBFC555547EDF0D7F)
%99 = load float, float* %9
%100 = fpext float %99 to double
%101 = fmul double %98, %100
%102 = fptrunc double %101 to float
store float %102, float* %8
%103 = load float, float* %7
%104 = load float, float* %8
%105 = load float, float* %7
%106 = call float @llvm.fmuladd.f32(float %103, float %104, float %105)
store float %106, float* %7
br label %107
107: ; preds = %89, %59
%108 = load i8, i8* %12
%109 = sext i8 %108 to i32
%110 = icmp ne i32 %109, 0
br i1 %110, label %111, label %114
111: ; preds = %107
%112 = load float, float* %7
%113 = fneg float %112
br label %116
114: ; preds = %107
%115 = load float, float* %7
br label %116
116: ; preds = %114, %111
%117 = phi float [ %113, %111 ], [ %115, %114 ]
store float %117, float* %3
br label %118
118: ; preds = %116, %34
%119 = load float, float* %3
ret float %119
}

LLVM IR (-O2):
define float @sincosf(float %0, i32 %1) {
%3 = icmp eq i32 %1, 0
br i1 %3, label %8, label %4
4: ; preds = %2
%5 = tail call double @fabsf(float %0)
%6 = fadd double %5, 0x3FF921FB544486E0
%7 = fptrunc double %6 to float
br label %12
8: ; preds = %2
%9 = fcmp olt float %0, 0.000000e+00
br i1 %9, label %10, label %12
10: ; preds = %8
%11 = fneg float %0
br label %12
12: ; preds = %8, %10, %4
%13 = phi float [ %7, %4 ], [ %11, %10 ], [ %0, %8 ]
%14 = phi i8 [ 1, %4 ], [ 0, %10 ], [ 1, %8 ]
%15 = phi i8 [ 0, %4 ], [ 1, %10 ], [ 0, %8 ]
%16 = fcmp ogt float %13, 1.286700e+04
br i1 %16, label %55, label %17
17: ; preds = %12
%18 = fpext float %13 to double
%19 = tail call double @llvm.fmuladd.f64(double %18, double 0x3FD45F306DCE3D24, double 5.000000e-01)
%20 = fptosi double %19 to i32
%21 = and i32 %20, 1
%22 = icmp eq i32 %21, 0
%23 = select i1 %22, i8 %15, i8 %14
%24 = sitofp i32 %20 to float
%25 = fadd float %24, -5.000000e-01
%26 = select i1 %3, float %24, float %25
%27 = tail call double @fabsf(float %0)
%28 = fptrunc double %27 to float
%29 = fptosi float %28 to i32
%30 = sitofp i32 %29 to float
%31 = fsub float %28, %30
%32 = sitofp i32 %29 to double
%33 = fpext float %26 to double
%34 = fneg double %33
%35 = tail call double @llvm.fmuladd.f64(double %34, double 0x4009200000000000, double %32)
%36 = fpext float %31 to double
%37 = fadd double %35, %36
%38 = tail call double @llvm.fmuladd.f64(double %34, double 0x3F4FB54442C46525, double %37)
%39 = fptrunc double %38 to float
%40 = fmul float %39, %39
%41 = fpext float %40 to double
%42 = fcmp ogt double %41, 5.960460e-08
br i1 %42, label %43, label %50
43: ; preds = %17
%44 = tail call double @llvm.fmuladd.f64(double %41, double 0x3EC5D38B523B11F2, double 0xBF29F6444FFA3449)
%45 = tail call double @llvm.fmuladd.f64(double %44, double %41, double 0x3F8110E7B3970AB0)
%46 = tail call double @llvm.fmuladd.f64(double %45, double %41, double 0xBFC555547EDF0D7F)
%47 = fmul double %46, %41
%48 = fptrunc double %47 to float
%49 = tail call float @llvm.fmuladd.f32(float %39, float %48, float %39)
br label %50
50: ; preds = %43, %17
%51 = phi float [ %49, %43 ], [ %39, %17 ]
%52 = icmp eq i8 %23, 0
%53 = fneg float %51
%54 = select i1 %52, float %51, float %53
br label %55
55: ; preds = %12, %50
%56 = phi float [ %54, %50 ], [ 0.000000e+00, %12 ]
ret float %56
}