float atan2f(float arg1, float arg2) {
  float satan(float);
  if ((arg1 + arg2) == arg1) {
    if (arg1 >= 0.) {
      return (1.57079632679489e0);
    } else {
      return (-1.57079632679489e0);
    }
  } else if (arg2 < 0.) {
    if (arg1 >= 0.) {
      return (1.57079632679489e0 + 1.57079632679489e0 - satan(-arg1 / arg2));
    } else {
      return (-1.57079632679489e0 - 1.57079632679489e0 + satan(arg1 / arg2));
    }
  } else if (arg1 > 0) {
    return (satan(arg1 / arg2));
  } else {
    return (-satan(-arg1 / arg2));
  }
}


x86 assembly (clang, -O0):
<atan2f>:
push   %rbp
mov    %rsp,%rbp
sub    $0x10,%rsp
movss  %xmm0,-0x8(%rbp)
movss  %xmm1,-0xc(%rbp)
movss  -0x8(%rbp),%xmm0
addss  -0xc(%rbp),%xmm0
ucomiss -0x8(%rbp),%xmm0
jne    1176 <atan2f+0x66>
jp     1176 <atan2f+0x66>
movss  -0x8(%rbp),%xmm0
cvtss2sd %xmm0,%xmm0
xorps  %xmm1,%xmm1
ucomisd %xmm1,%xmm0
jb     1164 <atan2f+0x54>
movss  0xeba(%rip),%xmm0
movss  %xmm0,-0x4(%rbp)
jmp    1261 <atan2f+0x151>
movss  0xea4(%rip),%xmm0
movss  %xmm0,-0x4(%rbp)
jmp    1261 <atan2f+0x151>
movss  -0xc(%rbp),%xmm0
cvtss2sd %xmm0,%xmm1
xorps  %xmm0,%xmm0
ucomisd %xmm1,%xmm0
jbe    1209 <atan2f+0xf9>
movss  -0x8(%rbp),%xmm0
cvtss2sd %xmm0,%xmm0
xorps  %xmm1,%xmm1
ucomisd %xmm1,%xmm0
jb     11dc <atan2f+0xcc>
movss  -0x8(%rbp),%xmm0
movd   %xmm0,%eax
xor    $0x80000000,%eax
movd   %eax,%xmm0
divss  -0xc(%rbp),%xmm0
call   1030 <satan@plt>
cvtss2sd %xmm0,%xmm1
movsd  0xe3e(%rip),%xmm0
subsd  %xmm1,%xmm0
cvtsd2ss %xmm0,%xmm0
movss  %xmm0,-0x4(%rbp)
jmp    1261 <atan2f+0x151>
movss  -0x8(%rbp),%xmm0
divss  -0xc(%rbp),%xmm0
call   1030 <satan@plt>
cvtss2sd %xmm0,%xmm1
movsd  0xe09(%rip),%xmm0
addsd  %xmm1,%xmm0
cvtsd2ss %xmm0,%xmm0
movss  %xmm0,-0x4(%rbp)
jmp    1261 <atan2f+0x151>
movss  -0x8(%rbp),%xmm0
xorps  %xmm1,%xmm1
ucomiss %xmm1,%xmm0
jbe    1233 <atan2f+0x123>
movss  -0x8(%rbp),%xmm0
divss  -0xc(%rbp),%xmm0
call   1030 <satan@plt>
movss  %xmm0,-0x4(%rbp)
jmp    1261 <atan2f+0x151>
movss  -0x8(%rbp),%xmm0
movd   %xmm0,%eax
xor    $0x80000000,%eax
movd   %eax,%xmm0
divss  -0xc(%rbp),%xmm0
call   1030 <satan@plt>
movd   %xmm0,%eax
xor    $0x80000000,%eax
movd   %eax,%xmm0
movss  %xmm0,-0x4(%rbp)
movss  -0x4(%rbp),%xmm0
add    $0x10,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<atan2f>:
push   %rax
movaps %xmm0,%xmm2
addss  %xmm1,%xmm2
ucomiss %xmm0,%xmm2
jne    1138 <atan2f+0x28>
jp     1138 <atan2f+0x28>
xorps  %xmm1,%xmm1
xor    %eax,%eax
ucomiss %xmm1,%xmm0
setb   %al
lea    0xeef(%rip),%rcx
movss  (%rcx,%rax,4),%xmm0
pop    %rax
ret
xorps  %xmm2,%xmm2
ucomiss %xmm1,%xmm2
jbe    1160 <atan2f+0x50>
ucomiss %xmm2,%xmm0
jae    116f <atan2f+0x5f>
divss  %xmm1,%xmm0
call   1030 <satan@plt>
cvtss2sd %xmm0,%xmm0
addsd  0xebe(%rip),%xmm0
cvtsd2ss %xmm0,%xmm0
pop    %rax
ret
ucomiss %xmm2,%xmm0
jbe    1198 <atan2f+0x88>
divss  %xmm1,%xmm0
pop    %rax
jmp    1030 <satan@plt>
xorps  0xe8a(%rip),%xmm0
divss  %xmm1,%xmm0
call   1030 <satan@plt>
cvtss2sd %xmm0,%xmm0
movsd  0xe85(%rip),%xmm1
subsd  %xmm0,%xmm1
xorps  %xmm0,%xmm0
cvtsd2ss %xmm1,%xmm0
pop    %rax
ret
xorps  0xe61(%rip),%xmm0
divss  %xmm1,%xmm0
call   1030 <satan@plt>
xorps  0xe51(%rip),%xmm0
pop    %rax
ret

LLVM IR (-O0):
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* %4
%7 = load float, float* %5
%8 = fadd float %6, %7
%9 = load float, float* %4
%10 = fcmp oeq float %8, %9
br i1 %10, label %11, label %17
11: ; preds = %2
%12 = load float, float* %4
%13 = fpext float %12 to double
%14 = fcmp oge double %13, 0.000000e+00
br i1 %14, label %15, label %16
15: ; preds = %11
store float 0x3FF921FB60000000, float* %3
br label %57
16: ; preds = %11
store float 0xBFF921FB60000000, float* %3
br label %57
17: ; preds = %2
%18 = load float, float* %5
%19 = fpext float %18 to double
%20 = fcmp olt double %19, 0.000000e+00
br i1 %20, label %21, label %42
21: ; preds = %17
%22 = load float, float* %4
%23 = fpext float %22 to double
%24 = fcmp oge double %23, 0.000000e+00
br i1 %24, label %25, label %34
25: ; preds = %21
%26 = load float, float* %4
%27 = fneg float %26
%28 = load float, float* %5
%29 = fdiv float %27, %28
%30 = call float @satan(float %29)
%31 = fpext float %30 to double
%32 = fsub double 0x400921FB54442CFA, %31
%33 = fptrunc double %32 to float
store float %33, float* %3
br label %57
34: ; preds = %21
%35 = load float, float* %4
%36 = load float, float* %5
%37 = fdiv float %35, %36
%38 = call float @satan(float %37)
%39 = fpext float %38 to double
%40 = fadd double 0xC00921FB54442CFA, %39
%41 = fptrunc double %40 to float
store float %41, float* %3
br label %57
42: ; preds = %17
%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* %4
%47 = load float, float* %5
%48 = fdiv float %46, %47
%49 = call float @satan(float %48)
store float %49, float* %3
br label %57
50: ; preds = %42
%51 = load float, float* %4
%52 = fneg float %51
%53 = load float, float* %5
%54 = fdiv float %52, %53
%55 = call float @satan(float %54)
%56 = fneg float %55
store float %56, float* %3
br label %57
57: ; preds = %50, %45, %34, %25, %16, %15
%58 = load float, float* %3
ret float %58
}

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