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


x86 assembly (clang, -O0):
<FastAtan2>:
push   %rbp
mov    %rsp,%rbp
movss  %xmm0,-0x8(%rbp)
movss  %xmm1,-0xc(%rbp)
movss  -0xc(%rbp),%xmm0
xorps  %xmm1,%xmm1
ucomiss %xmm1,%xmm0
jne    11b8 <FastAtan2+0xb8>
jp     11b8 <FastAtan2+0xb8>
movss  -0x8(%rbp),%xmm0
xorps  %xmm1,%xmm1
ucomiss %xmm1,%xmm0
jne    1153 <FastAtan2+0x53>
jp     1153 <FastAtan2+0x53>
xorps  %xmm0,%xmm0
movss  %xmm0,-0x20(%rbp)
movss  -0x20(%rbp),%xmm0
movss  %xmm0,-0x4(%rbp)
jmp    1424 <FastAtan2+0x324>
movss  0xea5(%rip),%xmm0
movss  %xmm0,-0x20(%rbp)
movss  -0x8(%rbp),%xmm0
xorps  %xmm1,%xmm1
ucomiss %xmm1,%xmm0
jbe    1180 <FastAtan2+0x80>
movss  -0x20(%rbp),%xmm0
movss  %xmm0,-0x4(%rbp)
jmp    1424 <FastAtan2+0x324>
xorps  %xmm0,%xmm0
ucomiss -0x8(%rbp),%xmm0
jbe    11b3 <FastAtan2+0xb3>
movss  -0x20(%rbp),%xmm0
movd   %xmm0,%eax
xor    $0x80000000,%eax
movd   %eax,%xmm0
movss  %xmm0,-0x20(%rbp)
movss  -0x20(%rbp),%xmm0
movss  %xmm0,-0x4(%rbp)
jmp    1424 <FastAtan2+0x324>
jmp    11b8 <FastAtan2+0xb8>
movl   $0x0,-0x24(%rbp)
movss  -0x8(%rbp),%xmm0
movss  %xmm0,-0x18(%rbp)
movss  -0xc(%rbp),%xmm0
movss  %xmm0,-0x1c(%rbp)
xorps  %xmm0,%xmm0
ucomiss -0x18(%rbp),%xmm0
jbe    11f7 <FastAtan2+0xf7>
movss  -0x18(%rbp),%xmm0
movd   %xmm0,%eax
xor    $0x80000000,%eax
movd   %eax,%xmm0
movss  %xmm0,-0x18(%rbp)
xorps  %xmm0,%xmm0
ucomiss -0x1c(%rbp),%xmm0
jbe    121b <FastAtan2+0x11b>
movss  -0x1c(%rbp),%xmm0
movd   %xmm0,%eax
xor    $0x80000000,%eax
movd   %eax,%xmm0
movss  %xmm0,-0x1c(%rbp)
movss  -0x18(%rbp),%xmm0
ucomiss -0x1c(%rbp),%xmm0
jbe    124f <FastAtan2+0x14f>
movss  -0x1c(%rbp),%xmm0
movss  %xmm0,-0x10(%rbp)
movss  -0x18(%rbp),%xmm0
movss  %xmm0,-0x1c(%rbp)
movss  -0x10(%rbp),%xmm0
movss  %xmm0,-0x18(%rbp)
movl   $0x2,-0x24(%rbp)
movss  -0x18(%rbp),%xmm0
divss  -0x1c(%rbp),%xmm0
movss  %xmm0,-0x10(%rbp)
movss  -0x10(%rbp),%xmm0
movss  0xd99(%rip),%xmm1
ucomiss %xmm1,%xmm0
jbe    12c5 <FastAtan2+0x1c5>
movss  -0x10(%rbp),%xmm0
movss  0xd8b(%rip),%xmm1
mulss  %xmm1,%xmm0
movss  0xd83(%rip),%xmm1
addss  %xmm1,%xmm0
addss  -0x10(%rbp),%xmm0
movss  %xmm0,-0x18(%rbp)
movss  0xd65(%rip),%xmm0
addss  -0x10(%rbp),%xmm0
movss  %xmm0,-0x1c(%rbp)
movss  -0x18(%rbp),%xmm0
divss  -0x1c(%rbp),%xmm0
movss  %xmm0,-0x10(%rbp)
mov    -0x24(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x24(%rbp)
movss  -0x10(%rbp),%xmm0
movss  %xmm0,-0x14(%rbp)
xorps  %xmm0,%xmm0
ucomiss -0x14(%rbp),%xmm0
jbe    12f3 <FastAtan2+0x1f3>
movss  -0x14(%rbp),%xmm0
movd   %xmm0,%eax
xor    $0x80000000,%eax
movd   %eax,%xmm0
movss  %xmm0,-0x14(%rbp)
movss  0xd19(%rip),%xmm0
ucomiss -0x14(%rbp),%xmm0
jbe    1314 <FastAtan2+0x214>
movss  -0x10(%rbp),%xmm0
movss  %xmm0,-0x20(%rbp)
jmp    139c <FastAtan2+0x29c>
movss  -0x10(%rbp),%xmm0
mulss  -0x10(%rbp),%xmm0
movss  %xmm0,-0x14(%rbp)
movss  -0x14(%rbp),%xmm0
movss  0xcf0(%rip),%xmm1
mulss  %xmm1,%xmm0
movss  0xce8(%rip),%xmm1
addss  %xmm1,%xmm0
mulss  -0x14(%rbp),%xmm0
movss  %xmm0,-0x18(%rbp)
movss  0xcca(%rip),%xmm0
addss  -0x14(%rbp),%xmm0
movss  -0x14(%rbp),%xmm1
mulss  %xmm1,%xmm0
movss  0xcb0(%rip),%xmm1
addss  %xmm1,%xmm0
movss  %xmm0,-0x1c(%rbp)
movss  -0x18(%rbp),%xmm0
divss  -0x1c(%rbp),%xmm0
movss  %xmm0,-0x20(%rbp)
movss  -0x20(%rbp),%xmm0
movss  -0x10(%rbp),%xmm2
movss  -0x10(%rbp),%xmm1
mulss  %xmm2,%xmm0
addss  %xmm1,%xmm0
movss  %xmm0,-0x20(%rbp)
cmpl   $0x1,-0x24(%rbp)
jle    13bd <FastAtan2+0x2bd>
movss  -0x20(%rbp),%xmm0
movd   %xmm0,%eax
xor    $0x80000000,%eax
movd   %eax,%xmm0
movss  %xmm0,-0x20(%rbp)
movss  -0x20(%rbp),%xmm0
movslq -0x24(%rbp),%rcx
lea    0xc63(%rip),%rax
addss  (%rax,%rcx,4),%xmm0
movss  %xmm0,-0x20(%rbp)
xorps  %xmm0,%xmm0
ucomiss -0xc(%rbp),%xmm0
jbe    13f6 <FastAtan2+0x2f6>
movss  0xc3c(%rip),%xmm0
subss  -0x20(%rbp),%xmm0
movss  %xmm0,-0x20(%rbp)
xorps  %xmm0,%xmm0
ucomiss -0x8(%rbp),%xmm0
jbe    141a <FastAtan2+0x31a>
movss  -0x20(%rbp),%xmm0
movd   %xmm0,%eax
xor    $0x80000000,%eax
movd   %eax,%xmm0
movss  %xmm0,-0x20(%rbp)
movss  -0x20(%rbp),%xmm0
movss  %xmm0,-0x4(%rbp)
movss  -0x4(%rbp),%xmm0
pop    %rbp
ret

x86 assembly (clang, -O2):
<FastAtan2>:
xorps  %xmm2,%xmm2
ucomiss %xmm2,%xmm1
jne    1134 <FastAtan2+0x34>
jp     1134 <FastAtan2+0x34>
ucomiss %xmm2,%xmm0
jne    1115 <FastAtan2+0x15>
jp     1115 <FastAtan2+0x15>
movaps %xmm2,%xmm0
ret
xorps  %xmm3,%xmm3
ucomiss %xmm3,%xmm0
jbe    1126 <FastAtan2+0x26>
movss  0xedb(%rip),%xmm0
ret
ucomiss %xmm0,%xmm3
jbe    1134 <FastAtan2+0x34>
movss  0xed1(%rip),%xmm0
ret
movaps 0xef5(%rip),%xmm3
movaps %xmm0,%xmm4
xorps  %xmm3,%xmm4
movaps %xmm0,%xmm5
cmpltss %xmm2,%xmm5
andps  %xmm5,%xmm4
andnps %xmm0,%xmm5
orps   %xmm4,%xmm5
xorps  %xmm1,%xmm3
movaps %xmm1,%xmm4
cmpltss %xmm2,%xmm4
andps  %xmm4,%xmm3
andnps %xmm1,%xmm4
orps   %xmm3,%xmm4
xor    %eax,%eax
ucomiss %xmm4,%xmm5
seta   %al
movaps %xmm4,%xmm2
minss  %xmm5,%xmm2
maxss  %xmm4,%xmm5
divss  %xmm5,%xmm2
add    %eax,%eax
ucomiss 0xe82(%rip),%xmm2
jbe    11b2 <FastAtan2+0xb2>
movss  0xe7c(%rip),%xmm3
mulss  %xmm2,%xmm3
addss  0xe74(%rip),%xmm3
addss  %xmm2,%xmm3
addss  0xe6c(%rip),%xmm2
divss  %xmm2,%xmm3
or     $0x1,%eax
movaps %xmm3,%xmm2
movaps 0xe77(%rip),%xmm3
xorps  %xmm2,%xmm3
xorps  %xmm4,%xmm4
movaps %xmm2,%xmm5
cmpltss %xmm4,%xmm5
movaps %xmm5,%xmm4
andps  %xmm3,%xmm4
andnps %xmm2,%xmm5
orps   %xmm4,%xmm5
movss  0xe3d(%rip),%xmm4
ucomiss %xmm5,%xmm4
ja     122d <FastAtan2+0x12d>
movaps %xmm2,%xmm3
mulss  %xmm2,%xmm3
movss  0xe2d(%rip),%xmm4
mulss  %xmm3,%xmm4
addss  0xe25(%rip),%xmm4
mulss  %xmm3,%xmm4
movss  0xe1d(%rip),%xmm5
addss  %xmm3,%xmm5
mulss  %xmm3,%xmm5
addss  0xe11(%rip),%xmm5
divss  %xmm5,%xmm4
mulss  %xmm2,%xmm4
addss  %xmm4,%xmm2
movaps 0xe06(%rip),%xmm3
xorps  %xmm2,%xmm3
cmp    $0x2,%eax
jge    1235 <FastAtan2+0x135>
movaps %xmm2,%xmm3
mov    %eax,%eax
lea    0xe02(%rip),%rcx
addss  (%rcx,%rax,4),%xmm3
movss  0xde1(%rip),%xmm2
subss  %xmm3,%xmm2
xorps  %xmm4,%xmm4
cmpltss %xmm4,%xmm1
movaps %xmm1,%xmm5
andnps %xmm3,%xmm5
andps  %xmm2,%xmm1
orps   %xmm5,%xmm1
movaps 0xdc6(%rip),%xmm2
xorps  %xmm1,%xmm2
cmpltss %xmm4,%xmm0
movaps %xmm0,%xmm3
andnps %xmm1,%xmm3
andps  %xmm2,%xmm0
orps   %xmm3,%xmm0
movaps %xmm0,%xmm2
movaps %xmm2,%xmm0
ret

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

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