double coordinates_to_deg(short hour, short min, short sec, short msec,
                          char hrs) {
  double tmp = (hour > 0 ? hour : (hour * -1)) + ((double)min) / 60 +
               ((double)sec + (double)msec / 1000) / 3600;
  if (hrs) {
    tmp *= 15;
  }
  return (hour > 0 ? tmp : (tmp * -1));
}


x86 assembly (clang, -O0):
<coordinates_to_deg>:
push   %rbp
mov    %rsp,%rbp
mov    %r8b,%al
mov    %di,-0x2(%rbp)
mov    %si,-0x4(%rbp)
mov    %dx,-0x6(%rbp)
mov    %cx,-0x8(%rbp)
mov    %al,-0x9(%rbp)
movswl -0x2(%rbp),%eax
cmp    $0x0,%eax
jle    1133 <coordinates_to_deg+0x33>
movswl -0x2(%rbp),%eax
mov    %eax,-0x1c(%rbp)
jmp    113d <coordinates_to_deg+0x3d>
movswl -0x2(%rbp),%eax
imul   $0xffffffff,%eax,%eax
mov    %eax,-0x1c(%rbp)
mov    -0x1c(%rbp),%eax
cvtsi2sd %eax,%xmm0
movswl -0x4(%rbp),%eax
cvtsi2sd %eax,%xmm1
movsd  0xebc(%rip),%xmm2
divsd  %xmm2,%xmm1
addsd  %xmm1,%xmm0
movswl -0x6(%rbp),%eax
cvtsi2sd %eax,%xmm1
movswl -0x8(%rbp),%eax
cvtsi2sd %eax,%xmm2
movsd  0xe94(%rip),%xmm3
divsd  %xmm3,%xmm2
addsd  %xmm2,%xmm1
movsd  0xe7c(%rip),%xmm2
divsd  %xmm2,%xmm1
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x18(%rbp)
cmpb   $0x0,-0x9(%rbp)
je     11ad <coordinates_to_deg+0xad>
movsd  0xe75(%rip),%xmm0
mulsd  -0x18(%rbp),%xmm0
movsd  %xmm0,-0x18(%rbp)
movswl -0x2(%rbp),%eax
cmp    $0x0,%eax
jle    11c9 <coordinates_to_deg+0xc9>
movsd  -0x18(%rbp),%xmm0
movsd  %xmm0,-0x28(%rbp)
jmp    11db <coordinates_to_deg+0xdb>
movsd  0xe4f(%rip),%xmm0
mulsd  -0x18(%rbp),%xmm0
movsd  %xmm0,-0x28(%rbp)
movsd  -0x28(%rbp),%xmm0
pop    %rbp
ret

x86 assembly (clang, -O2):
<coordinates_to_deg>:
mov    %edi,%eax
neg    %eax
cmovs  %edi,%eax
cvtsi2sd %eax,%xmm0
cvtsi2sd %edx,%xmm1
pxor   %xmm2,%xmm2
pinsrw $0x1,%esi,%xmm2
pinsrw $0x3,%ecx,%xmm2
unpcklpd %xmm1,%xmm0
psrad  $0x10,%xmm2
cvtdq2pd %xmm2,%xmm1
divpd  0xece(%rip),%xmm1
addpd  %xmm0,%xmm1
movapd %xmm1,%xmm0
unpckhpd %xmm1,%xmm0
divsd  0xeda(%rip),%xmm0
addsd  %xmm1,%xmm0
test   %r8b,%r8b
jne    1155 <coordinates_to_deg+0x55>
test   %di,%di
jle    1162 <coordinates_to_deg+0x62>
ret
mulsd  0xecb(%rip),%xmm0
test   %di,%di
jg     1154 <coordinates_to_deg+0x54>
xorpd  0xea6(%rip),%xmm0
ret

LLVM IR (-O0):
define double @coordinates_to_deg(i16 signext %0, i16 signext %1, i16 signext %2, i16 signext %3, i8 signext %4) {
%6 = alloca i16
%7 = alloca i16
%8 = alloca i16
%9 = alloca i16
%10 = alloca i8
%11 = alloca double
store i16 %0, i16* %6
store i16 %1, i16* %7
store i16 %2, i16* %8
store i16 %3, i16* %9
store i8 %4, i8* %10
%12 = load i16, i16* %6
%13 = sext i16 %12 to i32
%14 = icmp sgt i32 %13, 0
br i1 %14, label %15, label %18
15: ; preds = %5
%16 = load i16, i16* %6
%17 = sext i16 %16 to i32
br label %22
18: ; preds = %5
%19 = load i16, i16* %6
%20 = sext i16 %19 to i32
%21 = mul nsw i32 %20, -1
br label %22
22: ; preds = %18, %15
%23 = phi i32 [ %17, %15 ], [ %21, %18 ]
%24 = sitofp i32 %23 to double
%25 = load i16, i16* %7
%26 = sitofp i16 %25 to double
%27 = fdiv double %26, 6.000000e+01
%28 = fadd double %24, %27
%29 = load i16, i16* %8
%30 = sitofp i16 %29 to double
%31 = load i16, i16* %9
%32 = sitofp i16 %31 to double
%33 = fdiv double %32, 1.000000e+03
%34 = fadd double %30, %33
%35 = fdiv double %34, 3.600000e+03
%36 = fadd double %28, %35
store double %36, double* %11
%37 = load i8, i8* %10
%38 = icmp ne i8 %37, 0
br i1 %38, label %39, label %42
39: ; preds = %22
%40 = load double, double* %11
%41 = fmul double %40, 1.500000e+01
store double %41, double* %11
br label %42
42: ; preds = %39, %22
%43 = load i16, i16* %6
%44 = sext i16 %43 to i32
%45 = icmp sgt i32 %44, 0
br i1 %45, label %46, label %48
46: ; preds = %42
%47 = load double, double* %11
br label %51
48: ; preds = %42
%49 = load double, double* %11
%50 = fmul double %49, -1.000000e+00
br label %51
51: ; preds = %48, %46
%52 = phi double [ %47, %46 ], [ %50, %48 ]
ret double %52
}

LLVM IR (-O2):
define double @coordinates_to_deg(i16 signext %0, i16 signext %1, i16 signext %2, i16 signext %3, i8 signext %4) {
%6 = sext i16 %0 to i32
%7 = icmp sgt i16 %0, 0
%8 = sub nsw i32 0, %6
%9 = select i1 %7, i32 %6, i32 %8
%10 = sitofp i32 %9 to double
%11 = sitofp i16 %2 to double
%12 = insertelement <2 x i16> poison, i16 %1, i64 0
%13 = insertelement <2 x i16> %12, i16 %3, i64 1
%14 = sitofp <2 x i16> %13 to <2 x double>
%15 = fdiv <2 x double> %14, <double 6.000000e+01, double 1.000000e+03>
%16 = insertelement <2 x double> poison, double %10, i64 0
%17 = insertelement <2 x double> %16, double %11, i64 1
%18 = fadd <2 x double> %15, %17
%19 = extractelement <2 x double> %18, i64 1
%20 = fdiv double %19, 3.600000e+03
%21 = extractelement <2 x double> %18, i64 0
%22 = fadd double %21, %20
%23 = icmp eq i8 %4, 0
%24 = fmul double %22, 1.500000e+01
%25 = select i1 %23, double %22, double %24
%26 = fneg double %25
%27 = select i1 %7, double %25, double %26
ret double %27
}