#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 */
double M_PI;
float atan(int);
int fabs(float);
float arctan(float x1, float y1, float x2, float y2) {
  if (x2 == x1) {
    if (y2 == y1)
      return 9.0;
    else if (y2 > y1)
      return M_PI / 2.0;
    return 3.0 * M_PI / 2.0;
  }
  if ((y2 == y1) && (x2 < x1))
    return M_PI;
  float a = atan(fabs(y2 - y1) / fabs(x2 - x1));
  if ((x2 < x1) && (y2 > y1))
    return a + M_PI / 2.0;
  if ((x2 < x1) && (y2 < y1))
    return a + M_PI;
  if ((x2 > x1) && (y2 < y1))
    return a + 3.0 * M_PI / 2.0;
  return a;
}


x86 assembly (clang, -O0):
<arctan>:
push   %rbp
mov    %rsp,%rbp
sub    $0x20,%rsp
movss  %xmm0,-0x8(%rbp)
movss  %xmm1,-0xc(%rbp)
movss  %xmm2,-0x10(%rbp)
movss  %xmm3,-0x14(%rbp)
movss  -0x10(%rbp),%xmm0
ucomiss -0x8(%rbp),%xmm0
jne    11de <arctan+0xbe>
jp     11de <arctan+0xbe>
movss  -0x14(%rbp),%xmm0
ucomiss -0xc(%rbp),%xmm0
jne    1178 <arctan+0x58>
jp     1178 <arctan+0x58>
movss  0xea2(%rip),%xmm0
movss  %xmm0,-0x4(%rbp)
jmp    1356 <arctan+0x236>
movss  -0x14(%rbp),%xmm0
ucomiss -0xc(%rbp),%xmm0
jbe    11ac <arctan+0x8c>
mov    0x2e5a(%rip),%rax
movsd  (%rax),%xmm0
movsd  0xe66(%rip),%xmm1
divsd  %xmm1,%xmm0
cvtsd2ss %xmm0,%xmm0
movss  %xmm0,-0x4(%rbp)
jmp    1356 <arctan+0x236>
jmp    11b1 <arctan+0x91>
movsd  0xe4f(%rip),%xmm0
mov    0x2e28(%rip),%rax
mulsd  (%rax),%xmm0
movsd  0xe34(%rip),%xmm1
divsd  %xmm1,%xmm0
cvtsd2ss %xmm0,%xmm0
movss  %xmm0,-0x4(%rbp)
jmp    1356 <arctan+0x236>
movss  -0x14(%rbp),%xmm0
ucomiss -0xc(%rbp),%xmm0
jne    121f <arctan+0xff>
jp     121f <arctan+0xff>
movss  -0x10(%rbp),%xmm1
movss  -0x8(%rbp),%xmm0
ucomiss %xmm1,%xmm0
jbe    121f <arctan+0xff>
mov    0x2ddb(%rip),%rax
movsd  (%rax),%xmm0
cvtsd2ss %xmm0,%xmm0
movss  %xmm0,-0x4(%rbp)
jmp    1356 <arctan+0x236>
movss  -0x14(%rbp),%xmm0
subss  -0xc(%rbp),%xmm0
call   1030 <fabs@plt>
mov    %eax,-0x1c(%rbp)
movss  -0x10(%rbp),%xmm0
subss  -0x8(%rbp),%xmm0
call   1030 <fabs@plt>
mov    %eax,%ecx
mov    -0x1c(%rbp),%eax
cltd
idiv   %ecx
mov    %eax,%edi
call   1040 <atan@plt>
movss  %xmm0,-0x18(%rbp)
movss  -0x10(%rbp),%xmm1
movss  -0x8(%rbp),%xmm0
ucomiss %xmm1,%xmm0
jbe    12a8 <arctan+0x188>
movss  -0x14(%rbp),%xmm0
ucomiss -0xc(%rbp),%xmm0
jbe    12a8 <arctan+0x188>
movss  -0x18(%rbp),%xmm0
cvtss2sd %xmm0,%xmm0
mov    0x2d62(%rip),%rax
movsd  (%rax),%xmm1
movsd  0xd6e(%rip),%xmm2
divsd  %xmm2,%xmm1
addsd  %xmm1,%xmm0
cvtsd2ss %xmm0,%xmm0
movss  %xmm0,-0x4(%rbp)
jmp    1356 <arctan+0x236>
movss  -0x10(%rbp),%xmm1
movss  -0x8(%rbp),%xmm0
ucomiss %xmm1,%xmm0
jbe    12f0 <arctan+0x1d0>
movss  -0x14(%rbp),%xmm1
movss  -0xc(%rbp),%xmm0
ucomiss %xmm1,%xmm0
jbe    12f0 <arctan+0x1d0>
movss  -0x18(%rbp),%xmm0
cvtss2sd %xmm0,%xmm0
mov    0x2d0a(%rip),%rax
addsd  (%rax),%xmm0
cvtsd2ss %xmm0,%xmm0
movss  %xmm0,-0x4(%rbp)
jmp    1356 <arctan+0x236>
movss  -0x10(%rbp),%xmm0
ucomiss -0x8(%rbp),%xmm0
jbe    134c <arctan+0x22c>
movss  -0x14(%rbp),%xmm1
movss  -0xc(%rbp),%xmm0
ucomiss %xmm1,%xmm0
jbe    134c <arctan+0x22c>
movss  -0x18(%rbp),%xmm0
cvtss2sd %xmm0,%xmm0
movsd  0xce5(%rip),%xmm1
mov    0x2cbe(%rip),%rax
mulsd  (%rax),%xmm1
movsd  0xcca(%rip),%xmm2
divsd  %xmm2,%xmm1
addsd  %xmm1,%xmm0
cvtsd2ss %xmm0,%xmm0
movss  %xmm0,-0x4(%rbp)
jmp    1356 <arctan+0x236>
movss  -0x18(%rbp),%xmm0
movss  %xmm0,-0x4(%rbp)
movss  -0x4(%rbp),%xmm0
add    $0x20,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<arctan>:
push   %rbx
sub    $0x10,%rsp
ucomiss %xmm0,%xmm2
jne    1140 <arctan+0x20>
jp     1140 <arctan+0x20>
ucomiss %xmm1,%xmm3
jne    1163 <arctan+0x43>
jp     1163 <arctan+0x43>
movss  0xed5(%rip),%xmm0
jmp    124d <arctan+0x12d>
movaps %xmm0,%xmm4
ucomiss %xmm2,%xmm0
jbe    1189 <arctan+0x69>
ucomiss %xmm1,%xmm3
jne    1189 <arctan+0x69>
jp     1189 <arctan+0x69>
mov    0x2e92(%rip),%rax
movsd  (%rax),%xmm0
cvtsd2ss %xmm0,%xmm0
jmp    124d <arctan+0x12d>
mov    0x2e7e(%rip),%rax
movsd  (%rax),%xmm0
ja     1178 <arctan+0x58>
mulsd  0xe88(%rip),%xmm0
mulsd  0xe88(%rip),%xmm0
cvtsd2ss %xmm0,%xmm0
jmp    124d <arctan+0x12d>
movaps %xmm3,%xmm0
subss  %xmm1,%xmm0
movss  %xmm3,0xc(%rsp)
movss  %xmm1,0x8(%rsp)
movss  %xmm2,0x4(%rsp)
movss  %xmm4,(%rsp)
call   1030 <fabs@plt>
mov    %eax,%ebx
movss  0x4(%rsp),%xmm0
subss  (%rsp),%xmm0
call   1030 <fabs@plt>
mov    %eax,%ecx
mov    %ebx,%eax
cltd
idiv   %ecx
mov    %eax,%edi
call   1040 <atan@plt>
movss  (%rsp),%xmm4
movss  0x4(%rsp),%xmm3
movss  0x8(%rsp),%xmm2
movss  0xc(%rsp),%xmm1
ucomiss %xmm3,%xmm4
jbe    11fa <arctan+0xda>
ucomiss %xmm2,%xmm1
jbe    11fa <arctan+0xda>
mov    0x2df4(%rip),%rax
movsd  (%rax),%xmm1
jmp    1236 <arctan+0x116>
ucomiss %xmm3,%xmm4
jbe    1219 <arctan+0xf9>
ucomiss %xmm1,%xmm2
jbe    1219 <arctan+0xf9>
cvtss2sd %xmm0,%xmm0
mov    0x2dd9(%rip),%rax
addsd  (%rax),%xmm0
cvtsd2ss %xmm0,%xmm0
jmp    124d <arctan+0x12d>
ucomiss %xmm4,%xmm3
jbe    124d <arctan+0x12d>
ucomiss %xmm1,%xmm2
jbe    124d <arctan+0x12d>
mov    0x2dbe(%rip),%rax
movsd  (%rax),%xmm1
mulsd  0xdca(%rip),%xmm1
mulsd  0xdca(%rip),%xmm1
cvtss2sd %xmm0,%xmm0
addsd  %xmm0,%xmm1
xorps  %xmm0,%xmm0
cvtsd2ss %xmm1,%xmm0
add    $0x10,%rsp
pop    %rbx
ret

LLVM IR (-O0):
@M_PI = global double 0.000000e+00
define float @arctan(float %0, float %1, float %2, float %3) {
%5 = alloca float
%6 = alloca float
%7 = alloca float
%8 = alloca float
%9 = alloca float
%10 = alloca float
store float %0, float* %6
store float %1, float* %7
store float %2, float* %8
store float %3, float* %9
%11 = load float, float* %8
%12 = load float, float* %6
%13 = fcmp oeq float %11, %12
br i1 %13, label %14, label %33
14: ; preds = %4
%15 = load float, float* %9
%16 = load float, float* %7
%17 = fcmp oeq float %15, %16
br i1 %17, label %18, label %19
18: ; preds = %14
store float 9.000000e+00, float* %5
br label %101
19: ; preds = %14
%20 = load float, float* %9
%21 = load float, float* %7
%22 = fcmp ogt float %20, %21
br i1 %22, label %23, label %27
23: ; preds = %19
%24 = load double, double* @M_PI
%25 = fdiv double %24, 2.000000e+00
%26 = fptrunc double %25 to float
store float %26, float* %5
br label %101
27: ; preds = %19
br label %28
28: ; preds = %27
%29 = load double, double* @M_PI
%30 = fmul double 3.000000e+00, %29
%31 = fdiv double %30, 2.000000e+00
%32 = fptrunc double %31 to float
store float %32, float* %5
br label %101
33: ; preds = %4
%34 = load float, float* %9
%35 = load float, float* %7
%36 = fcmp oeq float %34, %35
br i1 %36, label %37, label %44
37: ; preds = %33
%38 = load float, float* %8
%39 = load float, float* %6
%40 = fcmp olt float %38, %39
br i1 %40, label %41, label %44
41: ; preds = %37
%42 = load double, double* @M_PI
%43 = fptrunc double %42 to float
store float %43, float* %5
br label %101
44: ; preds = %37, %33
%45 = load float, float* %9
%46 = load float, float* %7
%47 = fsub float %45, %46
%48 = call i32 @fabs(float %47)
%49 = load float, float* %8
%50 = load float, float* %6
%51 = fsub float %49, %50
%52 = call i32 @fabs(float %51)
%53 = sdiv i32 %48, %52
%54 = call float @atan(i32 %53)
store float %54, float* %10
%55 = load float, float* %8
%56 = load float, float* %6
%57 = fcmp olt float %55, %56
br i1 %57, label %58, label %69
58: ; preds = %44
%59 = load float, float* %9
%60 = load float, float* %7
%61 = fcmp ogt float %59, %60
br i1 %61, label %62, label %69
62: ; preds = %58
%63 = load float, float* %10
%64 = fpext float %63 to double
%65 = load double, double* @M_PI
%66 = fdiv double %65, 2.000000e+00
%67 = fadd double %64, %66
%68 = fptrunc double %67 to float
store float %68, float* %5
br label %101
69: ; preds = %58, %44
%70 = load float, float* %8
%71 = load float, float* %6
%72 = fcmp olt float %70, %71
br i1 %72, label %73, label %83
73: ; preds = %69
%74 = load float, float* %9
%75 = load float, float* %7
%76 = fcmp olt float %74, %75
br i1 %76, label %77, label %83
77: ; preds = %73
%78 = load float, float* %10
%79 = fpext float %78 to double
%80 = load double, double* @M_PI
%81 = fadd double %79, %80
%82 = fptrunc double %81 to float
store float %82, float* %5
br label %101
83: ; preds = %73, %69
%84 = load float, float* %8
%85 = load float, float* %6
%86 = fcmp ogt float %84, %85
br i1 %86, label %87, label %99
87: ; preds = %83
%88 = load float, float* %9
%89 = load float, float* %7
%90 = fcmp olt float %88, %89
br i1 %90, label %91, label %99
91: ; preds = %87
%92 = load float, float* %10
%93 = fpext float %92 to double
%94 = load double, double* @M_PI
%95 = fmul double 3.000000e+00, %94
%96 = fdiv double %95, 2.000000e+00
%97 = fadd double %93, %96
%98 = fptrunc double %97 to float
store float %98, float* %5
br label %101
99: ; preds = %87, %83
%100 = load float, float* %10
store float %100, float* %5
br label %101
101: ; preds = %99, %91, %77, %62, %41, %28, %23, %18
%102 = load float, float* %5
ret float %102
}

LLVM IR (-O2):
@M_PI = global double 0.000000e+00
define float @arctan(float %0, float %1, float %2, float %3) {
%5 = fcmp oeq float %2, %0
%6 = fcmp oeq float %3, %1
br i1 %5, label %7, label %18
7: ; preds = %4
br i1 %6, label %57, label %8
8: ; preds = %7
%9 = fcmp ogt float %3, %1
%10 = load double, double* @M_PI
br i1 %9, label %11, label %14
11: ; preds = %8
%12 = fmul double %10, 5.000000e-01
%13 = fptrunc double %12 to float
br label %57
14: ; preds = %8
%15 = fmul double %10, 3.000000e+00
%16 = fmul double %15, 5.000000e-01
%17 = fptrunc double %16 to float
br label %57
18: ; preds = %4
%19 = fcmp olt float %2, %0
%20 = and i1 %19, %6
br i1 %20, label %21, label %24
21: ; preds = %18
%22 = load double, double* @M_PI
%23 = fptrunc double %22 to float
br label %57
24: ; preds = %18
%25 = fsub float %3, %1
%26 = tail call i32 @fabs(float %25)
%27 = fsub float %2, %0
%28 = tail call i32 @fabs(float %27)
%29 = sdiv i32 %26, %28
%30 = tail call float @atan(i32 %29)
%31 = fcmp ogt float %3, %1
%32 = and i1 %19, %31
br i1 %32, label %33, label %39
33: ; preds = %24
%34 = fpext float %30 to double
%35 = load double, double* @M_PI
%36 = fmul double %35, 5.000000e-01
%37 = fadd double %36, %34
%38 = fptrunc double %37 to float
br label %57
39: ; preds = %24
%40 = fcmp olt float %3, %1
%41 = and i1 %19, %40
br i1 %41, label %42, label %47
42: ; preds = %39
%43 = fpext float %30 to double
%44 = load double, double* @M_PI
%45 = fadd double %44, %43
%46 = fptrunc double %45 to float
br label %57
47: ; preds = %39
%48 = fcmp ogt float %2, %0
%49 = and i1 %48, %40
br i1 %49, label %50, label %57
50: ; preds = %47
%51 = fpext float %30 to double
%52 = load double, double* @M_PI
%53 = fmul double %52, 3.000000e+00
%54 = fmul double %53, 5.000000e-01
%55 = fadd double %54, %51
%56 = fptrunc double %55 to float
br label %57
57: ; preds = %33, %42, %50, %47, %7, %21, %14, %11
%58 = phi float [ %13, %11 ], [ %17, %14 ], [ %23, %21 ], [ 9.000000e+00, %7 ], [ %38, %33 ], [ %46, %42 ], [ %56, %50 ], [ %30, %47 ]
ret float %58
}