#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 M_PI_2;
float atanf(float);
float atan2f(float y, float x) {
  if (x > 0) {
    return atanf(y / x);
  } else if (y >= 0 && x < 0) {
    return atanf(y / x) + M_PI;
  } else if (y < 0) {
    if (x == 0) {
      return -M_PI_2;
    } else {
      return atanf(y / x) - M_PI;
    }
  } else if (y > 0 && x == 0) {
    return M_PI_2;
  } else {
    return 0;
  }
}


x86 assembly (clang, -O0):
<atan2f>:
push   %rbp
mov    %rsp,%rbp
sub    $0x10,%rsp
movss  %xmm0,-0x8(%rbp)
movss  %xmm1,-0xc(%rbp)
movss  -0xc(%rbp),%xmm0
xorps  %xmm1,%xmm1
ucomiss %xmm1,%xmm0
jbe    114c <atan2f+0x3c>
movss  -0x8(%rbp),%xmm0
divss  -0xc(%rbp),%xmm0
call   1030 <atanf@plt>
movss  %xmm0,-0x4(%rbp)
jmp    123d <atan2f+0x12d>
movss  -0x8(%rbp),%xmm0
xorps  %xmm1,%xmm1
ucomiss %xmm1,%xmm0
jb     118e <atan2f+0x7e>
xorps  %xmm0,%xmm0
ucomiss -0xc(%rbp),%xmm0
jbe    118e <atan2f+0x7e>
movss  -0x8(%rbp),%xmm0
divss  -0xc(%rbp),%xmm0
call   1030 <atanf@plt>
mov    0x2e68(%rip),%rax
addss  (%rax),%xmm0
movss  %xmm0,-0x4(%rbp)
jmp    123d <atan2f+0x12d>
xorps  %xmm0,%xmm0
ucomiss -0x8(%rbp),%xmm0
jbe    11f8 <atan2f+0xe8>
movss  -0xc(%rbp),%xmm0
xorps  %xmm1,%xmm1
ucomiss %xmm1,%xmm0
jne    11d4 <atan2f+0xc4>
jp     11d4 <atan2f+0xc4>
mov    0x2e27(%rip),%rax
movss  (%rax),%xmm0
movd   %xmm0,%eax
xor    $0x80000000,%eax
movd   %eax,%xmm0
movss  %xmm0,-0x4(%rbp)
jmp    123d <atan2f+0x12d>
movss  -0x8(%rbp),%xmm0
divss  -0xc(%rbp),%xmm0
call   1030 <atanf@plt>
mov    0x2dfe(%rip),%rax
subss  (%rax),%xmm0
movss  %xmm0,-0x4(%rbp)
jmp    123d <atan2f+0x12d>
movss  -0x8(%rbp),%xmm0
xorps  %xmm1,%xmm1
ucomiss %xmm1,%xmm0
jbe    1235 <atan2f+0x125>
movss  -0xc(%rbp),%xmm0
xorps  %xmm1,%xmm1
ucomiss %xmm1,%xmm0
jne    1235 <atan2f+0x125>
jp     1235 <atan2f+0x125>
mov    0x2db9(%rip),%rax
movss  (%rax),%xmm0
movss  %xmm0,-0x4(%rbp)
jmp    123d <atan2f+0x12d>
xorps  %xmm0,%xmm0
movss  %xmm0,-0x4(%rbp)
movss  -0x4(%rbp),%xmm0
add    $0x10,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<atan2f>:
xorps  %xmm2,%xmm2
ucomiss %xmm2,%xmm1
jbe    1121 <atan2f+0x11>
divss  %xmm1,%xmm0
jmp    1030 <atanf@plt>
push   %rax
ucomiss %xmm2,%xmm0
jb     1145 <atan2f+0x35>
xorps  %xmm2,%xmm2
ucomiss %xmm1,%xmm2
jbe    1145 <atan2f+0x35>
divss  %xmm1,%xmm0
call   1030 <atanf@plt>
mov    0x2ea9(%rip),%rax
addss  (%rax),%xmm0
pop    %rax
ret
xorps  %xmm2,%xmm2
ucomiss %xmm0,%xmm2
jbe    1168 <atan2f+0x58>
ucomiss %xmm2,%xmm1
jne    1185 <atan2f+0x75>
jp     1185 <atan2f+0x75>
mov    0x2e85(%rip),%rax
movss  (%rax),%xmm0
xorps  0xe9a(%rip),%xmm0
pop    %rax
ret
mov    0x2e71(%rip),%rax
cmpeqss %xmm2,%xmm1
cmpltss %xmm0,%xmm2
movss  (%rax),%xmm0
andps  %xmm1,%xmm0
andps  %xmm2,%xmm0
pop    %rax
ret
divss  %xmm1,%xmm0
call   1030 <atanf@plt>
mov    0x2e53(%rip),%rax
subss  (%rax),%xmm0
pop    %rax
ret

LLVM IR (-O0):
@M_PI = global float 0.000000e+00
@M_PI_2 = global float 0.000000e+00
define float @atan2f(float %0, float %1) {
%3 = alloca float
%4 = alloca float
%5 = alloca float
store float %0, float* %4
store float %1, float* %5
%6 = load float, float* %5
%7 = fcmp ogt float %6, 0.000000e+00
br i1 %7, label %8, label %13
8: ; preds = %2
%9 = load float, float* %4
%10 = load float, float* %5
%11 = fdiv float %9, %10
%12 = call float @atanf(float %11)
store float %12, float* %3
br label %51
13: ; preds = %2
%14 = load float, float* %4
%15 = fcmp oge float %14, 0.000000e+00
br i1 %15, label %16, label %26
16: ; preds = %13
%17 = load float, float* %5
%18 = fcmp olt float %17, 0.000000e+00
br i1 %18, label %19, label %26
19: ; preds = %16
%20 = load float, float* %4
%21 = load float, float* %5
%22 = fdiv float %20, %21
%23 = call float @atanf(float %22)
%24 = load float, float* @M_PI
%25 = fadd float %23, %24
store float %25, float* %3
br label %51
26: ; preds = %16, %13
%27 = load float, float* %4
%28 = fcmp olt float %27, 0.000000e+00
br i1 %28, label %29, label %42
29: ; preds = %26
%30 = load float, float* %5
%31 = fcmp oeq float %30, 0.000000e+00
br i1 %31, label %32, label %35
32: ; preds = %29
%33 = load float, float* @M_PI_2
%34 = fneg float %33
store float %34, float* %3
br label %51
35: ; preds = %29
%36 = load float, float* %4
%37 = load float, float* %5
%38 = fdiv float %36, %37
%39 = call float @atanf(float %38)
%40 = load float, float* @M_PI
%41 = fsub float %39, %40
store float %41, float* %3
br label %51
42: ; preds = %26
%43 = load float, float* %4
%44 = fcmp ogt float %43, 0.000000e+00
br i1 %44, label %45, label %50
45: ; preds = %42
%46 = load float, float* %5
%47 = fcmp oeq float %46, 0.000000e+00
br i1 %47, label %48, label %50
48: ; preds = %45
%49 = load float, float* @M_PI_2
store float %49, float* %3
br label %51
50: ; preds = %45, %42
store float 0.000000e+00, float* %3
br label %51
51: ; preds = %50, %48, %35, %32, %19, %8
%52 = load float, float* %3
ret float %52
}

LLVM IR (-O2):
@M_PI = global float 0.000000e+00
@M_PI_2 = global float 0.000000e+00
define float @atan2f(float %0, float %1) {
%3 = fcmp ogt float %1, 0.000000e+00
br i1 %3, label %4, label %7
4: ; preds = %2
%5 = fdiv float %0, %1
%6 = tail call float @atanf(float %5)
br label %34
7: ; preds = %2
%8 = fcmp oge float %0, 0.000000e+00
%9 = fcmp olt float %1, 0.000000e+00
%10 = and i1 %8, %9
br i1 %10, label %11, label %16
11: ; preds = %7
%12 = fdiv float %0, %1
%13 = tail call float @atanf(float %12)
%14 = load float, float* @M_PI
%15 = fadd float %13, %14
br label %34
16: ; preds = %7
%17 = fcmp olt float %0, 0.000000e+00
br i1 %17, label %18, label %28
18: ; preds = %16
%19 = fcmp oeq float %1, 0.000000e+00
br i1 %19, label %20, label %23
20: ; preds = %18
%21 = load float, float* @M_PI_2
%22 = fneg float %21
br label %34
23: ; preds = %18
%24 = fdiv float %0, %1
%25 = tail call float @atanf(float %24)
%26 = load float, float* @M_PI
%27 = fsub float %25, %26
br label %34
28: ; preds = %16
%29 = fcmp ogt float %0, 0.000000e+00
%30 = fcmp oeq float %1, 0.000000e+00
%31 = and i1 %29, %30
%32 = load float, float* @M_PI_2
%33 = select i1 %31, float %32, float 0.000000e+00
br label %34
34: ; preds = %28, %23, %20, %11, %4
%35 = phi float [ %6, %4 ], [ %15, %11 ], [ %22, %20 ], [ %27, %23 ], [ %33, %28 ]
ret float %35
}