float fastAtan2(float y, float x) {
  double a, x2 = (double)x * x, y2 = (double)y * y;
  if (y2 <= x2) {
    a = (180. / 3.141592653) * x * y / (x2 + 0.28 * y2 + 1e-6);
    return (float)(x < 0 ? a + 180 : y >= 0 ? a : 360 + a);
  }
  a = (180. / 3.141592653) * x * y / (y2 + 0.28 * x2 + 1e-6);
  return (float)(y >= 0 ? 90 - a : 270 - a);
}


x86 assembly (clang, -O0):
<fastAtan2>:
push   %rbp
mov    %rsp,%rbp
movss  %xmm0,-0x8(%rbp)
movss  %xmm1,-0xc(%rbp)
movss  -0xc(%rbp),%xmm0
cvtss2sd %xmm0,%xmm0
movss  -0xc(%rbp),%xmm1
cvtss2sd %xmm1,%xmm1
mulsd  %xmm1,%xmm0
movsd  %xmm0,-0x20(%rbp)
movss  -0x8(%rbp),%xmm0
cvtss2sd %xmm0,%xmm0
movss  -0x8(%rbp),%xmm1
cvtss2sd %xmm1,%xmm1
mulsd  %xmm1,%xmm0
movsd  %xmm0,-0x28(%rbp)
movsd  -0x28(%rbp),%xmm1
movsd  -0x20(%rbp),%xmm0
ucomisd %xmm1,%xmm0
jb     121c <fastAtan2+0x11c>
movss  -0xc(%rbp),%xmm0
cvtss2sd %xmm0,%xmm1
movsd  0xea7(%rip),%xmm0
mulsd  %xmm1,%xmm0
movss  -0x8(%rbp),%xmm1
cvtss2sd %xmm1,%xmm1
mulsd  %xmm1,%xmm0
movsd  -0x20(%rbp),%xmm2
movsd  -0x28(%rbp),%xmm1
movsd  0xe7c(%rip),%xmm3
mulsd  %xmm3,%xmm1
addsd  %xmm2,%xmm1
movsd  0xe64(%rip),%xmm2
addsd  %xmm2,%xmm1
divsd  %xmm1,%xmm0
movsd  %xmm0,-0x18(%rbp)
xorps  %xmm0,%xmm0
ucomiss -0xc(%rbp),%xmm0
jbe    11cd <fastAtan2+0xcd>
movsd  0xe72(%rip),%xmm0
addsd  -0x18(%rbp),%xmm0
movsd  %xmm0,-0x30(%rbp)
jmp    1209 <fastAtan2+0x109>
movss  -0x8(%rbp),%xmm0
xorps  %xmm1,%xmm1
ucomiss %xmm1,%xmm0
jb     11ed <fastAtan2+0xed>
movsd  -0x18(%rbp),%xmm0
movsd  %xmm0,-0x38(%rbp)
jmp    11ff <fastAtan2+0xff>
movsd  0xe33(%rip),%xmm0
addsd  -0x18(%rbp),%xmm0
movsd  %xmm0,-0x38(%rbp)
movsd  -0x38(%rbp),%xmm0
movsd  %xmm0,-0x30(%rbp)
movsd  -0x30(%rbp),%xmm0
cvtsd2ss %xmm0,%xmm0
movss  %xmm0,-0x4(%rbp)
jmp    12b5 <fastAtan2+0x1b5>
movss  -0xc(%rbp),%xmm0
cvtss2sd %xmm0,%xmm1
movsd  0xde3(%rip),%xmm0
mulsd  %xmm1,%xmm0
movss  -0x8(%rbp),%xmm1
cvtss2sd %xmm1,%xmm1
mulsd  %xmm1,%xmm0
movsd  -0x28(%rbp),%xmm2
movsd  -0x20(%rbp),%xmm1
movsd  0xdb8(%rip),%xmm3
mulsd  %xmm3,%xmm1
addsd  %xmm2,%xmm1
movsd  0xda0(%rip),%xmm2
addsd  %xmm2,%xmm1
divsd  %xmm1,%xmm0
movsd  %xmm0,-0x18(%rbp)
movss  -0x8(%rbp),%xmm0
xorps  %xmm1,%xmm1
ucomiss %xmm1,%xmm0
jb     1295 <fastAtan2+0x195>
movsd  0xd9a(%rip),%xmm0
subsd  -0x18(%rbp),%xmm0
movsd  %xmm0,-0x40(%rbp)
jmp    12a7 <fastAtan2+0x1a7>
movsd  0xd7b(%rip),%xmm0
subsd  -0x18(%rbp),%xmm0
movsd  %xmm0,-0x40(%rbp)
movsd  -0x40(%rbp),%xmm0
cvtsd2ss %xmm0,%xmm0
movss  %xmm0,-0x4(%rbp)
movss  -0x4(%rbp),%xmm0
pop    %rbp
ret

x86 assembly (clang, -O2):
<fastAtan2>:
cvtss2sd %xmm1,%xmm2
movaps %xmm2,%xmm3
mulsd  %xmm2,%xmm3
cvtss2sd %xmm0,%xmm4
mulsd  0xee9(%rip),%xmm2
mulsd  %xmm4,%xmm2
mulsd  %xmm4,%xmm4
ucomisd %xmm4,%xmm3
jae    115a <fastAtan2+0x5a>
mulsd  0xedb(%rip),%xmm3
addsd  %xmm4,%xmm3
addsd  0xed7(%rip),%xmm3
divsd  %xmm3,%xmm2
xorps  %xmm1,%xmm1
xor    %eax,%eax
ucomiss %xmm1,%xmm0
setae  %al
lea    0xed9(%rip),%rcx
movsd  (%rcx,%rax,8),%xmm0
subsd  %xmm2,%xmm0
jmp    1190 <fastAtan2+0x90>
mulsd  0xea6(%rip),%xmm4
addsd  %xmm3,%xmm4
addsd  0xea2(%rip),%xmm4
divsd  %xmm4,%xmm2
xorpd  %xmm3,%xmm3
ucomiss %xmm3,%xmm0
movapd %xmm2,%xmm0
jae    118b <fastAtan2+0x8b>
movsd  0xe91(%rip),%xmm0
addsd  %xmm2,%xmm0
ucomiss %xmm1,%xmm3
ja     1195 <fastAtan2+0x95>
cvtsd2ss %xmm0,%xmm0
ret
addsd  0xe83(%rip),%xmm2
xorps  %xmm0,%xmm0
cvtsd2ss %xmm2,%xmm0
ret

LLVM IR (-O0):
define float @fastAtan2(float %0, float %1) {
%3 = alloca float
%4 = alloca float
%5 = alloca float
%6 = alloca double
%7 = alloca double
%8 = alloca double
store float %0, float* %4
store float %1, float* %5
%9 = load float, float* %5
%10 = fpext float %9 to double
%11 = load float, float* %5
%12 = fpext float %11 to double
%13 = fmul double %10, %12
store double %13, double* %7
%14 = load float, float* %4
%15 = fpext float %14 to double
%16 = load float, float* %4
%17 = fpext float %16 to double
%18 = fmul double %15, %17
store double %18, double* %8
%19 = load double, double* %8
%20 = load double, double* %7
%21 = fcmp ole double %19, %20
br i1 %21, label %22, label %52
22: ; preds = %2
%23 = load float, float* %5
%24 = fpext float %23 to double
%25 = fmul double 0x404CA5DC1A7ADB70, %24
%26 = load float, float* %4
%27 = fpext float %26 to double
%28 = fmul double %25, %27
%29 = load double, double* %7
%30 = load double, double* %8
%31 = call double @llvm.fmuladd.f64(double 2.800000e-01, double %30, double %29)
%32 = fadd double %31, 0x3EB0C6F7A0B5ED8D
%33 = fdiv double %28, %32
store double %33, double* %6
%34 = load float, float* %5
%35 = fcmp olt float %34, 0.000000e+00
br i1 %35, label %36, label %39
36: ; preds = %22
%37 = load double, double* %6
%38 = fadd double %37, 1.800000e+02
br label %49
39: ; preds = %22
%40 = load float, float* %4
%41 = fcmp oge float %40, 0.000000e+00
br i1 %41, label %42, label %44
42: ; preds = %39
%43 = load double, double* %6
br label %47
44: ; preds = %39
%45 = load double, double* %6
%46 = fadd double 3.600000e+02, %45
br label %47
47: ; preds = %44, %42
%48 = phi double [ %43, %42 ], [ %46, %44 ]
br label %49
49: ; preds = %47, %36
%50 = phi double [ %38, %36 ], [ %48, %47 ]
%51 = fptrunc double %50 to float
store float %51, float* %3
br label %75
52: ; preds = %2
%53 = load float, float* %5
%54 = fpext float %53 to double
%55 = fmul double 0x404CA5DC1A7ADB70, %54
%56 = load float, float* %4
%57 = fpext float %56 to double
%58 = fmul double %55, %57
%59 = load double, double* %8
%60 = load double, double* %7
%61 = call double @llvm.fmuladd.f64(double 2.800000e-01, double %60, double %59)
%62 = fadd double %61, 0x3EB0C6F7A0B5ED8D
%63 = fdiv double %58, %62
store double %63, double* %6
%64 = load float, float* %4
%65 = fcmp oge float %64, 0.000000e+00
br i1 %65, label %66, label %69
66: ; preds = %52
%67 = load double, double* %6
%68 = fsub double 9.000000e+01, %67
br label %72
69: ; preds = %52
%70 = load double, double* %6
%71 = fsub double 2.700000e+02, %70
br label %72
72: ; preds = %69, %66
%73 = phi double [ %68, %66 ], [ %71, %69 ]
%74 = fptrunc double %73 to float
store float %74, float* %3
br label %75
75: ; preds = %72, %49
%76 = load float, float* %3
ret float %76
}

LLVM IR (-O2):
define float @fastAtan2(float %0, float %1) {
%3 = fpext float %1 to double
%4 = fmul double %3, %3
%5 = fpext float %0 to double
%6 = fmul double %5, %5
%7 = fcmp ugt double %6, %4
%8 = fmul double %3, 0x404CA5DC1A7ADB70
%9 = fmul double %8, %5
br i1 %7, label %20, label %10
10: ; preds = %2
%11 = tail call double @llvm.fmuladd.f64(double %6, double 2.800000e-01, double %4)
%12 = fadd double %11, 0x3EB0C6F7A0B5ED8D
%13 = fdiv double %9, %12
%14 = fcmp olt float %1, 0.000000e+00
%15 = fadd double %13, 1.800000e+02
%16 = fcmp oge float %0, 0.000000e+00
%17 = fadd double %13, 3.600000e+02
%18 = select i1 %16, double %13, double %17
%19 = select i1 %14, double %15, double %18
br label %27
20: ; preds = %2
%21 = tail call double @llvm.fmuladd.f64(double %4, double 2.800000e-01, double %6)
%22 = fadd double %21, 0x3EB0C6F7A0B5ED8D
%23 = fdiv double %9, %22
%24 = fcmp oge float %0, 0.000000e+00
%25 = select i1 %24, double 9.000000e+01, double 2.700000e+02
%26 = fsub double %25, %23
br label %27
27: ; preds = %20, %10
%28 = phi double [ %19, %10 ], [ %26, %20 ]
%29 = fptrunc double %28 to float
ret float %29
}