#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 fabs(double);
double degrees_to_decimal(int degrees, int minutes, int seconds) {
  double deg;
  double min;
  double sec;
  double decimal;
  deg = degrees;
  min = minutes / 60.0;
  sec = seconds / 3600.0;
  decimal = fabs(sec) + fabs(min) + fabs(deg);
  if (deg < 0) {
    decimal = -decimal;
  } else if (deg == 0) {
    if (min < 0) {
      decimal = -decimal;
    } else if (min == 0) {
      if (sec < 0) {
        decimal = -decimal;
      }
    }
  }
  return (decimal);
}


x86 assembly (clang, -O0):
<degrees_to_decimal>:
push   %rbp
mov    %rsp,%rbp
mov    %edi,-0x4(%rbp)
mov    %esi,-0x8(%rbp)
mov    %edx,-0xc(%rbp)
cvtsi2sdl -0x4(%rbp),%xmm0
movsd  %xmm0,-0x18(%rbp)
cvtsi2sdl -0x8(%rbp),%xmm0
movsd  0xef4(%rip),%xmm1
divsd  %xmm1,%xmm0
movsd  %xmm0,-0x20(%rbp)
cvtsi2sdl -0xc(%rbp),%xmm0
movsd  0xed6(%rip),%xmm1
divsd  %xmm1,%xmm0
movsd  %xmm0,-0x28(%rbp)
movsd  -0x28(%rbp),%xmm0
movaps 0xeb1(%rip),%xmm1
pand   %xmm1,%xmm0
movsd  -0x20(%rbp),%xmm1
movaps 0xea1(%rip),%xmm2
pand   %xmm2,%xmm1
addsd  %xmm1,%xmm0
movsd  -0x18(%rbp),%xmm1
movaps 0xe8d(%rip),%xmm2
pand   %xmm2,%xmm1
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x30(%rbp)
xorps  %xmm0,%xmm0
ucomisd -0x18(%rbp),%xmm0
jbe    11b4 <degrees_to_decimal+0xb4>
movsd  -0x30(%rbp),%xmm0
movq   %xmm0,%rax
movabs $0x8000000000000000,%rcx
xor    %rcx,%rax
movq   %rax,%xmm0
movsd  %xmm0,-0x30(%rbp)
jmp    125b <degrees_to_decimal+0x15b>
movsd  -0x18(%rbp),%xmm0
xorps  %xmm1,%xmm1
ucomisd %xmm1,%xmm0
jne    1256 <degrees_to_decimal+0x156>
jp     1256 <degrees_to_decimal+0x156>
xorps  %xmm0,%xmm0
ucomisd -0x20(%rbp),%xmm0
jbe    1200 <degrees_to_decimal+0x100>
movsd  -0x30(%rbp),%xmm0
movq   %xmm0,%rax
movabs $0x8000000000000000,%rcx
xor    %rcx,%rax
movq   %rax,%xmm0
movsd  %xmm0,-0x30(%rbp)
jmp    1251 <degrees_to_decimal+0x151>
movsd  -0x20(%rbp),%xmm0
xorps  %xmm1,%xmm1
ucomisd %xmm1,%xmm0
jne    124c <degrees_to_decimal+0x14c>
jp     124c <degrees_to_decimal+0x14c>
xorps  %xmm0,%xmm0
ucomisd -0x28(%rbp),%xmm0
jbe    1247 <degrees_to_decimal+0x147>
movsd  -0x30(%rbp),%xmm0
movq   %xmm0,%rax
movabs $0x8000000000000000,%rcx
xor    %rcx,%rax
movq   %rax,%xmm0
movsd  %xmm0,-0x30(%rbp)
jmp    124c <degrees_to_decimal+0x14c>
jmp    1251 <degrees_to_decimal+0x151>
jmp    1256 <degrees_to_decimal+0x156>
jmp    125b <degrees_to_decimal+0x15b>
movsd  -0x30(%rbp),%xmm0
pop    %rbp
ret

x86 assembly (clang, -O2):
<degrees_to_decimal>:
cvtsi2sd %edi,%xmm0
cvtsi2sd %esi,%xmm1
divsd  0xef0(%rip),%xmm1
cvtsi2sd %edx,%xmm2
divsd  0xeec(%rip),%xmm2
movapd 0xeec(%rip),%xmm3
movapd %xmm2,%xmm4
andpd  %xmm3,%xmm4
movapd %xmm1,%xmm5
andpd  %xmm3,%xmm5
addsd  %xmm4,%xmm5
andpd  %xmm3,%xmm0
addsd  %xmm5,%xmm0
test   %edi,%edi
js     1151 <degrees_to_decimal+0x51>
je     1147 <degrees_to_decimal+0x47>
ret
xorpd  %xmm3,%xmm3
ucomisd %xmm1,%xmm3
jbe    115a <degrees_to_decimal+0x5a>
xorpd  0xec7(%rip),%xmm0
ret
movapd 0xebe(%rip),%xmm4
xorpd  %xmm0,%xmm4
cmpltsd %xmm3,%xmm2
andpd  %xmm2,%xmm4
andnpd %xmm0,%xmm2
orpd   %xmm4,%xmm2
cmpeqsd %xmm3,%xmm1
andpd  %xmm1,%xmm2
andnpd %xmm0,%xmm1
orpd   %xmm2,%xmm1
movapd %xmm1,%xmm0
ret

LLVM IR (-O0):
define double @degrees_to_decimal(i32 %0, i32 %1, i32 %2) {
%4 = alloca i32
%5 = alloca i32
%6 = alloca i32
%7 = alloca double
%8 = alloca double
%9 = alloca double
%10 = alloca double
store i32 %0, i32* %4
store i32 %1, i32* %5
store i32 %2, i32* %6
%11 = load i32, i32* %4
%12 = sitofp i32 %11 to double
store double %12, double* %7
%13 = load i32, i32* %5
%14 = sitofp i32 %13 to double
%15 = fdiv double %14, 6.000000e+01
store double %15, double* %8
%16 = load i32, i32* %6
%17 = sitofp i32 %16 to double
%18 = fdiv double %17, 3.600000e+03
store double %18, double* %9
%19 = load double, double* %9
%20 = call double @llvm.fabs.f64(double %19)
%21 = load double, double* %8
%22 = call double @llvm.fabs.f64(double %21)
%23 = fadd double %20, %22
%24 = load double, double* %7
%25 = call double @llvm.fabs.f64(double %24)
%26 = fadd double %23, %25
store double %26, double* %10
%27 = load double, double* %7
%28 = fcmp olt double %27, 0.000000e+00
br i1 %28, label %29, label %32
29: ; preds = %3
%30 = load double, double* %10
%31 = fneg double %30
store double %31, double* %10
br label %54
32: ; preds = %3
%33 = load double, double* %7
%34 = fcmp oeq double %33, 0.000000e+00
br i1 %34, label %35, label %53
35: ; preds = %32
%36 = load double, double* %8
%37 = fcmp olt double %36, 0.000000e+00
br i1 %37, label %38, label %41
38: ; preds = %35
%39 = load double, double* %10
%40 = fneg double %39
store double %40, double* %10
br label %52
41: ; preds = %35
%42 = load double, double* %8
%43 = fcmp oeq double %42, 0.000000e+00
br i1 %43, label %44, label %51
44: ; preds = %41
%45 = load double, double* %9
%46 = fcmp olt double %45, 0.000000e+00
br i1 %46, label %47, label %50
47: ; preds = %44
%48 = load double, double* %10
%49 = fneg double %48
store double %49, double* %10
br label %50
50: ; preds = %47, %44
br label %51
51: ; preds = %50, %41
br label %52
52: ; preds = %51, %38
br label %53
53: ; preds = %52, %32
br label %54
54: ; preds = %53, %29
%55 = load double, double* %10
ret double %55
}

LLVM IR (-O2):
define double @degrees_to_decimal(i32 %0, i32 %1, i32 %2) {
%4 = sitofp i32 %0 to double
%5 = sitofp i32 %1 to double
%6 = fdiv double %5, 6.000000e+01
%7 = sitofp i32 %2 to double
%8 = fdiv double %7, 3.600000e+03
%9 = tail call double @llvm.fabs.f64(double %8)
%10 = tail call double @llvm.fabs.f64(double %6)
%11 = fadd double %10, %9
%12 = tail call double @llvm.fabs.f64(double %4)
%13 = fadd double %12, %11
%14 = icmp slt i32 %0, 0
br i1 %14, label %15, label %17
15: ; preds = %3
%16 = fneg double %13
br label %29
17: ; preds = %3
%18 = icmp eq i32 %0, 0
br i1 %18, label %19, label %29
19: ; preds = %17
%20 = fcmp olt double %6, 0.000000e+00
br i1 %20, label %21, label %23
21: ; preds = %19
%22 = fneg double %13
br label %29
23: ; preds = %19
%24 = fcmp oeq double %6, 0.000000e+00
%25 = fcmp olt double %8, 0.000000e+00
%26 = and i1 %24, %25
%27 = fneg double %13
%28 = select i1 %26, double %27, double %13
br label %29
29: ; preds = %23, %17, %21, %15
%30 = phi double [ %16, %15 ], [ %22, %21 ], [ %13, %17 ], [ %28, %23 ]
ret double %30
}