float _atanf(float x) {
  float f, g;
  float num, den;
  float result;
  static const float a[4] = {0, (float)(0.52359877559829887307710723054658L),
                             (float)(1.5707963267948966192313216916398L),
                             (float)(1.0471975511965977461542144610932L)};
  int n = 0;
  f = x;
  if (f < (float)0.0) {
    f = -f;
  }
  if (f > (float)1.0) {
    f = ((float)(1.0) / (float)(f));
    n = 2;
  }
  if (f > (float)(0.26794919243112270647255365849413L)) {
    num = ((float)((float)(0.73205080756887729352744634150587L)) * (float)(f));
    num = ((float)(num) - (float)(0.5));
    num = ((float)(num) - (float)(0.5));
    num = ((float)(num) + (float)(f));
    den = ((float)((float)(1.7320508075688772935274463415059L)) + (float)(f));
    f = ((float)(num) / (float)(den));
    n = n + 1;
  }
  g = f;
  if (g < (float)0.0) {
    g = -g;
  }
  if (g < (float)(+3.452669830012e-4F)) {
    result = f;
  } else {
    g = ((float)(f) * (float)(f));
    num = ((float)((-7.20026848898e-1F)) * (float)(g));
    num = ((float)(num) + (float)((-1.44008344874F)));
    num = ((float)(num) * (float)(g));
    den = ((float)(g) + (float)((+4.75222584599F)));
    den = ((float)(den) * (float)(g));
    den = ((float)(den) + (float)((+4.32025038919F)));
    result = ((float)(num) / (float)(den));
    result = ((float)(result) * (float)(f));
    result = ((float)(result) + (float)(f));
  }
  if (n > 1) {
    result = -result;
  }
  result = ((float)(a[n]) + (float)(result));
  if (x < (float)0.0) {
    result = -result;
  }
  return result;
}


x86 assembly (clang, -O0):
<_atanf>:
push   %rbp
mov    %rsp,%rbp
movss  %xmm0,-0x4(%rbp)
movl   $0x0,-0x1c(%rbp)
movss  -0x4(%rbp),%xmm0
movss  %xmm0,-0x8(%rbp)
xorps  %xmm0,%xmm0
ucomiss -0x8(%rbp),%xmm0
jbe    113e <_atanf+0x3e>
movss  -0x8(%rbp),%xmm0
movd   %xmm0,%eax
xor    $0x80000000,%eax
movd   %eax,%xmm0
movss  %xmm0,-0x8(%rbp)
movss  -0x8(%rbp),%xmm0
movss  0xeb5(%rip),%xmm1
ucomiss %xmm1,%xmm0
jbe    116d <_atanf+0x6d>
movss  0xea4(%rip),%xmm0
divss  -0x8(%rbp),%xmm0
movss  %xmm0,-0x8(%rbp)
movl   $0x2,-0x1c(%rbp)
movss  -0x8(%rbp),%xmm0
movss  0xe8a(%rip),%xmm1
ucomiss %xmm1,%xmm0
jbe    11fa <_atanf+0xfa>
movss  0xe85(%rip),%xmm0
mulss  -0x8(%rbp),%xmm0
movss  %xmm0,-0x10(%rbp)
movss  -0x10(%rbp),%xmm0
movss  0xe6a(%rip),%xmm1
subss  %xmm1,%xmm0
movss  %xmm0,-0x10(%rbp)
movss  -0x10(%rbp),%xmm0
movss  0xe54(%rip),%xmm1
subss  %xmm1,%xmm0
movss  %xmm0,-0x10(%rbp)
movss  -0x10(%rbp),%xmm0
addss  -0x8(%rbp),%xmm0
movss  %xmm0,-0x10(%rbp)
movss  0xe30(%rip),%xmm0
addss  -0x8(%rbp),%xmm0
movss  %xmm0,-0x14(%rbp)
movss  -0x10(%rbp),%xmm0
divss  -0x14(%rbp),%xmm0
movss  %xmm0,-0x8(%rbp)
mov    -0x1c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x1c(%rbp)
movss  -0x8(%rbp),%xmm0
movss  %xmm0,-0xc(%rbp)
xorps  %xmm0,%xmm0
ucomiss -0xc(%rbp),%xmm0
jbe    1228 <_atanf+0x128>
movss  -0xc(%rbp),%xmm0
movd   %xmm0,%eax
xor    $0x80000000,%eax
movd   %eax,%xmm0
movss  %xmm0,-0xc(%rbp)
movss  0xde4(%rip),%xmm0
ucomiss -0xc(%rbp),%xmm0
jbe    1249 <_atanf+0x149>
movss  -0x8(%rbp),%xmm0
movss  %xmm0,-0x18(%rbp)
jmp    12eb <_atanf+0x1eb>
movss  -0x8(%rbp),%xmm0
mulss  -0x8(%rbp),%xmm0
movss  %xmm0,-0xc(%rbp)
movss  0xdc4(%rip),%xmm0
mulss  -0xc(%rbp),%xmm0
movss  %xmm0,-0x10(%rbp)
movss  0xdae(%rip),%xmm0
addss  -0x10(%rbp),%xmm0
movss  %xmm0,-0x10(%rbp)
movss  -0x10(%rbp),%xmm0
mulss  -0xc(%rbp),%xmm0
movss  %xmm0,-0x10(%rbp)
movss  0xd89(%rip),%xmm0
addss  -0xc(%rbp),%xmm0
movss  %xmm0,-0x14(%rbp)
movss  -0x14(%rbp),%xmm0
mulss  -0xc(%rbp),%xmm0
movss  %xmm0,-0x14(%rbp)
movss  0xd64(%rip),%xmm0
addss  -0x14(%rbp),%xmm0
movss  %xmm0,-0x14(%rbp)
movss  -0x10(%rbp),%xmm0
divss  -0x14(%rbp),%xmm0
movss  %xmm0,-0x18(%rbp)
movss  -0x18(%rbp),%xmm0
mulss  -0x8(%rbp),%xmm0
movss  %xmm0,-0x18(%rbp)
movss  -0x18(%rbp),%xmm0
addss  -0x8(%rbp),%xmm0
movss  %xmm0,-0x18(%rbp)
cmpl   $0x1,-0x1c(%rbp)
jle    130c <_atanf+0x20c>
movss  -0x18(%rbp),%xmm0
movd   %xmm0,%eax
xor    $0x80000000,%eax
movd   %eax,%xmm0
movss  %xmm0,-0x18(%rbp)
movslq -0x1c(%rbp),%rcx
lea    0xd19(%rip),%rax
movss  (%rax,%rcx,4),%xmm0
addss  -0x18(%rbp),%xmm0
movss  %xmm0,-0x18(%rbp)
xorps  %xmm0,%xmm0
ucomiss -0x4(%rbp),%xmm0
jbe    134a <_atanf+0x24a>
movss  -0x18(%rbp),%xmm0
movd   %xmm0,%eax
xor    $0x80000000,%eax
movd   %eax,%xmm0
movss  %xmm0,-0x18(%rbp)
movss  -0x18(%rbp),%xmm0
pop    %rbp
ret

x86 assembly (clang, -O2):
<_atanf>:
movaps 0xef9(%rip),%xmm1
xorps  %xmm0,%xmm1
xorps  %xmm3,%xmm3
movaps %xmm0,%xmm2
cmpltss %xmm3,%xmm2
andps  %xmm2,%xmm1
andnps %xmm0,%xmm2
orps   %xmm1,%xmm2
movss  0xefa(%rip),%xmm1
xor    %eax,%eax
ucomiss %xmm1,%xmm2
seta   %cl
ja     1135 <_atanf+0x35>
movaps %xmm2,%xmm1
jmp    1139 <_atanf+0x39>
divss  %xmm2,%xmm1
mov    %cl,%al
add    %eax,%eax
ucomiss 0xee0(%rip),%xmm1
jbe    1178 <_atanf+0x78>
movss  0xeda(%rip),%xmm2
mulss  %xmm1,%xmm2
movss  0xed2(%rip),%xmm3
addss  %xmm3,%xmm2
addss  %xmm3,%xmm2
addss  %xmm1,%xmm2
addss  0xec2(%rip),%xmm1
divss  %xmm1,%xmm2
or     $0x1,%eax
movaps %xmm2,%xmm1
movaps 0xe81(%rip),%xmm2
xorps  %xmm1,%xmm2
xorps  %xmm3,%xmm3
movaps %xmm1,%xmm4
cmpltss %xmm3,%xmm4
movaps %xmm4,%xmm3
andps  %xmm2,%xmm3
andnps %xmm1,%xmm4
orps   %xmm3,%xmm4
movss  0xe93(%rip),%xmm3
ucomiss %xmm4,%xmm3
ja     11f3 <_atanf+0xf3>
movaps %xmm1,%xmm2
mulss  %xmm1,%xmm2
movss  0xe83(%rip),%xmm3
mulss  %xmm2,%xmm3
addss  0xe7b(%rip),%xmm3
mulss  %xmm2,%xmm3
movss  0xe73(%rip),%xmm4
addss  %xmm2,%xmm4
mulss  %xmm2,%xmm4
addss  0xe67(%rip),%xmm4
divss  %xmm4,%xmm3
mulss  %xmm1,%xmm3
addss  %xmm3,%xmm1
movaps 0xe10(%rip),%xmm2
xorps  %xmm1,%xmm2
cmp    $0x2,%eax
jge    11fb <_atanf+0xfb>
movaps %xmm1,%xmm2
mov    %eax,%eax
lea    0xe0c(%rip),%rcx
addss  (%rcx,%rax,4),%xmm2
movaps 0xdf0(%rip),%xmm1
xorps  %xmm2,%xmm1
xorps  %xmm3,%xmm3
cmpltss %xmm3,%xmm0
movaps %xmm0,%xmm3
andnps %xmm2,%xmm3
andps  %xmm1,%xmm0
orps   %xmm3,%xmm0
ret

LLVM IR (-O0):
@_atanf.a = internal constant [4 x float] [float 0.000000e+00, float 0x3FE0C15240000000, float 0x3FF921FB60000000, float 0x3FF0C15240000000]
define float @_atanf(float %0) {
%2 = alloca float
%3 = alloca float
%4 = alloca float
%5 = alloca float
%6 = alloca float
%7 = alloca float
%8 = alloca i32
store float %0, float* %2
store i32 0, i32* %8
%9 = load float, float* %2
store float %9, float* %3
%10 = load float, float* %3
%11 = fcmp olt float %10, 0.000000e+00
br i1 %11, label %12, label %15
12: ; preds = %1
%13 = load float, float* %3
%14 = fneg float %13
store float %14, float* %3
br label %15
15: ; preds = %12, %1
%16 = load float, float* %3
%17 = fcmp ogt float %16, 1.000000e+00
br i1 %17, label %18, label %21
18: ; preds = %15
%19 = load float, float* %3
%20 = fdiv float 1.000000e+00, %19
store float %20, float* %3
store i32 2, i32* %8
br label %21
21: ; preds = %18, %15
%22 = load float, float* %3
%23 = fcmp ogt float %22, 0x3FD1261460000000
br i1 %23, label %24, label %41
24: ; preds = %21
%25 = load float, float* %3
%26 = fmul float 0x3FE76CF5E0000000, %25
store float %26, float* %5
%27 = load float, float* %5
%28 = fsub float %27, 5.000000e-01
store float %28, float* %5
%29 = load float, float* %5
%30 = fsub float %29, 5.000000e-01
store float %30, float* %5
%31 = load float, float* %5
%32 = load float, float* %3
%33 = fadd float %31, %32
store float %33, float* %5
%34 = load float, float* %3
%35 = fadd float 0x3FFBB67AE0000000, %34
store float %35, float* %6
%36 = load float, float* %5
%37 = load float, float* %6
%38 = fdiv float %36, %37
store float %38, float* %3
%39 = load i32, i32* %8
%40 = add nsw i32 %39, 1
store i32 %40, i32* %8
br label %41
41: ; preds = %24, %21
%42 = load float, float* %3
store float %42, float* %4
%43 = load float, float* %4
%44 = fcmp olt float %43, 0.000000e+00
br i1 %44, label %45, label %48
45: ; preds = %41
%46 = load float, float* %4
%47 = fneg float %46
store float %47, float* %4
br label %48
48: ; preds = %45, %41
%49 = load float, float* %4
%50 = fcmp olt float %49, 0x3F36A09E60000000
br i1 %50, label %51, label %53
51: ; preds = %48
%52 = load float, float* %3
store float %52, float* %7
br label %80
53: ; preds = %48
%54 = load float, float* %3
%55 = load float, float* %3
%56 = fmul float %54, %55
store float %56, float* %4
%57 = load float, float* %4
%58 = fmul float 0xBFE70A75C0000000, %57
store float %58, float* %5
%59 = load float, float* %5
%60 = fadd float %59, 0xBFF70A9500000000
store float %60, float* %5
%61 = load float, float* %5
%62 = load float, float* %4
%63 = fmul float %61, %62
store float %63, float* %5
%64 = load float, float* %4
%65 = fadd float %64, 0x4013024780000000
store float %65, float* %6
%66 = load float, float* %6
%67 = load float, float* %4
%68 = fmul float %66, %67
store float %68, float* %6
%69 = load float, float* %6
%70 = fadd float %69, 0x401147EFC0000000
store float %70, float* %6
%71 = load float, float* %5
%72 = load float, float* %6
%73 = fdiv float %71, %72
store float %73, float* %7
%74 = load float, float* %7
%75 = load float, float* %3
%76 = fmul float %74, %75
store float %76, float* %7
%77 = load float, float* %7
%78 = load float, float* %3
%79 = fadd float %77, %78
store float %79, float* %7
br label %80
80: ; preds = %53, %51
%81 = load i32, i32* %8
%82 = icmp sgt i32 %81, 1
br i1 %82, label %83, label %86
83: ; preds = %80
%84 = load float, float* %7
%85 = fneg float %84
store float %85, float* %7
br label %86
86: ; preds = %83, %80
%87 = load i32, i32* %8
%88 = sext i32 %87 to i64
%89 = getelementptr inbounds [4 x float], [4 x float]* @_atanf.a, i64 0, i64 %88
%90 = load float, float* %89
%91 = load float, float* %7
%92 = fadd float %90, %91
store float %92, float* %7
%93 = load float, float* %2
%94 = fcmp olt float %93, 0.000000e+00
br i1 %94, label %95, label %98
95: ; preds = %86
%96 = load float, float* %7
%97 = fneg float %96
store float %97, float* %7
br label %98
98: ; preds = %95, %86
%99 = load float, float* %7
ret float %99
}

LLVM IR (-O2):
@_atanf.a = internal unnamed_addr constant [4 x float] [float 0.000000e+00, float 0x3FE0C15240000000, float 0x3FF921FB60000000, float 0x3FF0C15240000000]
define float @_atanf(float %0) {
%2 = fcmp olt float %0, 0.000000e+00
%3 = fneg float %0
%4 = select i1 %2, float %3, float %0
%5 = fcmp ogt float %4, 1.000000e+00
%6 = fdiv float 1.000000e+00, %4
%7 = select i1 %5, float %6, float %4
%8 = select i1 %5, i32 2, i32 0
%9 = fcmp ogt float %7, 0x3FD1261460000000
br i1 %9, label %10, label %18
10: ; preds = %1
%11 = fmul float %7, 0x3FE76CF5E0000000
%12 = fadd float %11, -5.000000e-01
%13 = fadd float %12, -5.000000e-01
%14 = fadd float %7, %13
%15 = fadd float %7, 0x3FFBB67AE0000000
%16 = fdiv float %14, %15
%17 = or i32 %8, 1
br label %18
18: ; preds = %10, %1
%19 = phi float [ %16, %10 ], [ %7, %1 ]
%20 = phi i32 [ %17, %10 ], [ %8, %1 ]
%21 = fcmp olt float %19, 0.000000e+00
%22 = fneg float %19
%23 = select i1 %21, float %22, float %19
%24 = fcmp olt float %23, 0x3F36A09E60000000
br i1 %24, label %37, label %25
25: ; preds = %18
%26 = fmul float %19, %19
%27 = fmul float %26, 0x3FE70A75C0000000
%28 = fsub float 0xBFF70A9500000000, %27
%29 = fmul float %26, %28
%30 = fadd float %26, 0x4013024780000000
%31 = fmul float %26, %30
%32 = fadd float %31, 0x401147EFC0000000
%33 = fdiv float %29, %32
%34 = fmul float %19, %33
%35 = fadd float %19, %34
%36 = fneg float %35
br label %37
37: ; preds = %18, %25
%38 = phi float [ %22, %18 ], [ %36, %25 ]
%39 = phi float [ %19, %18 ], [ %35, %25 ]
%40 = icmp sgt i32 %20, 1
%41 = select i1 %40, float %38, float %39
%42 = zext i32 %20 to i64
%43 = getelementptr inbounds [4 x float], [4 x float]* @_atanf.a, i64 0, i64 %42
%44 = load float, float* %43
%45 = fadd float %44, %41
%46 = fneg float %45
%47 = select i1 %2, float %46, float %45
ret float %47
}