double greg2jul(mon, day, year, h, mi, se)
int mon, day, year, h, mi;
double se;
{
  long m = mon, d = day, y = year;
  long c, ya, j;
  double seconds = h * 3600.0 + mi * 60 + se;
  if (m > 2)
    m -= 3;
  else {
    m += 9;
    --y;
  }
  c = y / 100L;
  ya = y - (100L * c);
  j = (146097L * c) / 4L + (1461L * ya) / 4L + (153L * m + 2L) / 5L + d +
      1721119L;
  if (seconds < 12 * 3600.0) {
    j--;
    seconds += 12.0 * 3600.0;
  } else {
    seconds = seconds - 12.0 * 3600.0;
  }
  return (j + (seconds / 3600.0) / 24.0);
}


x86 assembly (clang, -O0):
<greg2jul>:
push   %rbp
mov    %rsp,%rbp
mov    %edi,-0x4(%rbp)
mov    %esi,-0x8(%rbp)
mov    %edx,-0xc(%rbp)
mov    %ecx,-0x10(%rbp)
mov    %r8d,-0x14(%rbp)
movsd  %xmm0,-0x20(%rbp)
movslq -0x4(%rbp),%rax
mov    %rax,-0x28(%rbp)
movslq -0x8(%rbp),%rax
mov    %rax,-0x30(%rbp)
movslq -0xc(%rbp),%rax
mov    %rax,-0x38(%rbp)
cvtsi2sdl -0x10(%rbp),%xmm0
imul   $0x3c,-0x14(%rbp),%eax
cvtsi2sd %eax,%xmm1
movsd  0xeba(%rip),%xmm2
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
addsd  -0x20(%rbp),%xmm0
movsd  %xmm0,-0x58(%rbp)
cmpq   $0x2,-0x28(%rbp)
jle    1174 <greg2jul+0x74>
mov    -0x28(%rbp),%rax
sub    $0x3,%rax
mov    %rax,-0x28(%rbp)
jmp    118c <greg2jul+0x8c>
mov    -0x28(%rbp),%rax
add    $0x9,%rax
mov    %rax,-0x28(%rbp)
mov    -0x38(%rbp),%rax
add    $0xffffffffffffffff,%rax
mov    %rax,-0x38(%rbp)
mov    -0x38(%rbp),%rax
mov    $0x64,%ecx
cqto
idiv   %rcx
mov    %rax,-0x40(%rbp)
mov    -0x38(%rbp),%rax
imul   $0x64,-0x40(%rbp),%rcx
sub    %rcx,%rax
mov    %rax,-0x48(%rbp)
imul   $0x23ab1,-0x40(%rbp),%rax
mov    $0x4,%ecx
cqto
idiv   %rcx
mov    %rax,-0x68(%rbp)
imul   $0x5b5,-0x48(%rbp),%rax
mov    $0x4,%ecx
cqto
idiv   %rcx
mov    %rax,%rcx
mov    -0x68(%rbp),%rax
add    %rcx,%rax
mov    %rax,-0x60(%rbp)
imul   $0x99,-0x28(%rbp),%rax
add    $0x2,%rax
mov    $0x5,%ecx
cqto
idiv   %rcx
mov    %rax,%rcx
mov    -0x60(%rbp),%rax
add    %rcx,%rax
add    -0x30(%rbp),%rax
add    $0x1a431f,%rax
mov    %rax,-0x50(%rbp)
movsd  0xdee(%rip),%xmm0
ucomisd -0x58(%rbp),%xmm0
jbe    1248 <greg2jul+0x148>
mov    -0x50(%rbp),%rax
add    $0xffffffffffffffff,%rax
mov    %rax,-0x50(%rbp)
movsd  0xdcf(%rip),%xmm0
addsd  -0x58(%rbp),%xmm0
movsd  %xmm0,-0x58(%rbp)
jmp    125e <greg2jul+0x15e>
movsd  -0x58(%rbp),%xmm0
movsd  0xdb3(%rip),%xmm1
subsd  %xmm1,%xmm0
movsd  %xmm0,-0x58(%rbp)
cvtsi2sdq -0x50(%rbp),%xmm0
movsd  -0x58(%rbp),%xmm1
movsd  0xd8f(%rip),%xmm2
divsd  %xmm2,%xmm1
movsd  0xd93(%rip),%xmm2
divsd  %xmm2,%xmm1
addsd  %xmm1,%xmm0
pop    %rbp
ret

x86 assembly (clang, -O2):
<greg2jul>:
movslq %edi,%rax
movslq %esi,%r9
movslq %edx,%rsi
cvtsi2sd %ecx,%xmm2
imul   $0x3c,%r8d,%ecx
cvtsi2sd %ecx,%xmm3
movsd  0xee3(%rip),%xmm1
mulsd  %xmm1,%xmm2
lea    0x9(%rax),%rcx
lea    -0x3(%rax),%rdx
xor    %edi,%edi
cmp    $0x3,%eax
setl   %dil
cmovge %rdx,%rcx
sub    %rdi,%rsi
movabs $0xa3d70a3d70a3d70b,%rdx
0a d7 a3
mov    %rsi,%rax
imul   %rdx
addsd  %xmm3,%xmm2
add    %rsi,%rdx
mov    %rdx,%rax
shr    $0x3f,%rax
sar    $0x6,%rdx
add    %rax,%rdx
imul   $0xffffffffffffff9c,%rdx,%rax
add    %rsi,%rax
imul   $0x23ab1,%rdx,%rdx
lea    0x3(%rdx),%rsi
test   %rdx,%rdx
cmovns %rdx,%rsi
addsd  %xmm2,%xmm0
sar    $0x2,%rsi
imul   $0x5b5,%rax,%rax
lea    0x3(%rax),%rdi
test   %rax,%rax
cmovns %rax,%rdi
imul   $0x99,%rcx,%rax
add    $0x2,%rax
movabs $0x6666666666666667,%rcx
66 66 66
imul   %rcx
sar    $0x2,%rdi
mov    %rdx,%rax
shr    $0x3f,%rax
sar    %rdx
add    %rax,%rdx
movsd  0xe46(%rip),%xmm2
xor    %eax,%eax
ucomisd %xmm0,%xmm2
seta   %al
add    %r9,%rdx
add    %rsi,%rdx
add    %rdi,%rdx
sub    %rax,%rdx
add    $0x1a431f,%rdx
lea    0xe33(%rip),%rcx
addsd  (%rcx,%rax,8),%xmm0
xorps  %xmm2,%xmm2
cvtsi2sd %rdx,%xmm2
divsd  %xmm1,%xmm0
divsd  0xe12(%rip),%xmm0
addsd  %xmm2,%xmm0
ret

LLVM IR (-O0):
define double @greg2jul(i32 %0, i32 %1, i32 %2, i32 %3, i32 %4, double %5) {
%7 = alloca i32
%8 = alloca i32
%9 = alloca i32
%10 = alloca i32
%11 = alloca i32
%12 = alloca double
%13 = alloca i64
%14 = alloca i64
%15 = alloca i64
%16 = alloca i64
%17 = alloca i64
%18 = alloca i64
%19 = alloca double
store i32 %0, i32* %7
store i32 %1, i32* %8
store i32 %2, i32* %9
store i32 %3, i32* %10
store i32 %4, i32* %11
store double %5, double* %12
%20 = load i32, i32* %7
%21 = sext i32 %20 to i64
store i64 %21, i64* %13
%22 = load i32, i32* %8
%23 = sext i32 %22 to i64
store i64 %23, i64* %14
%24 = load i32, i32* %9
%25 = sext i32 %24 to i64
store i64 %25, i64* %15
%26 = load i32, i32* %10
%27 = sitofp i32 %26 to double
%28 = load i32, i32* %11
%29 = mul nsw i32 %28, 60
%30 = sitofp i32 %29 to double
%31 = call double @llvm.fmuladd.f64(double %27, double 3.600000e+03, double %30)
%32 = load double, double* %12
%33 = fadd double %31, %32
store double %33, double* %19
%34 = load i64, i64* %13
%35 = icmp sgt i64 %34, 2
br i1 %35, label %36, label %39
36: ; preds = %6
%37 = load i64, i64* %13
%38 = sub nsw i64 %37, 3
store i64 %38, i64* %13
br label %44
39: ; preds = %6
%40 = load i64, i64* %13
%41 = add nsw i64 %40, 9
store i64 %41, i64* %13
%42 = load i64, i64* %15
%43 = add nsw i64 %42, -1
store i64 %43, i64* %15
br label %44
44: ; preds = %39, %36
%45 = load i64, i64* %15
%46 = sdiv i64 %45, 100
store i64 %46, i64* %16
%47 = load i64, i64* %15
%48 = load i64, i64* %16
%49 = mul nsw i64 100, %48
%50 = sub nsw i64 %47, %49
store i64 %50, i64* %17
%51 = load i64, i64* %16
%52 = mul nsw i64 146097, %51
%53 = sdiv i64 %52, 4
%54 = load i64, i64* %17
%55 = mul nsw i64 1461, %54
%56 = sdiv i64 %55, 4
%57 = add nsw i64 %53, %56
%58 = load i64, i64* %13
%59 = mul nsw i64 153, %58
%60 = add nsw i64 %59, 2
%61 = sdiv i64 %60, 5
%62 = add nsw i64 %57, %61
%63 = load i64, i64* %14
%64 = add nsw i64 %62, %63
%65 = add nsw i64 %64, 1721119
store i64 %65, i64* %18
%66 = load double, double* %19
%67 = fcmp olt double %66, 4.320000e+04
br i1 %67, label %68, label %73
68: ; preds = %44
%69 = load i64, i64* %18
%70 = add nsw i64 %69, -1
store i64 %70, i64* %18
%71 = load double, double* %19
%72 = fadd double %71, 4.320000e+04
store double %72, double* %19
br label %76
73: ; preds = %44
%74 = load double, double* %19
%75 = fsub double %74, 4.320000e+04
store double %75, double* %19
br label %76
76: ; preds = %73, %68
%77 = load i64, i64* %18
%78 = sitofp i64 %77 to double
%79 = load double, double* %19
%80 = fdiv double %79, 3.600000e+03
%81 = fdiv double %80, 2.400000e+01
%82 = fadd double %78, %81
ret double %82
}

LLVM IR (-O2):
define double @greg2jul(i32 %0, i32 %1, i32 %2, i32 %3, i32 %4, double %5) {
%7 = sext i32 %0 to i64
%8 = sext i32 %1 to i64
%9 = sext i32 %2 to i64
%10 = sitofp i32 %3 to double
%11 = mul nsw i32 %4, 60
%12 = sitofp i32 %11 to double
%13 = tail call double @llvm.fmuladd.f64(double %10, double 3.600000e+03, double %12)
%14 = fadd double %13, %5
%15 = icmp sgt i32 %0, 2
%16 = xor i1 %15, true
%17 = sext i1 %16 to i64
%18 = add nsw i64 %9, %17
%19 = select i1 %15, i64 -3, i64 9
%20 = add nsw i64 %19, %7
%21 = sdiv i64 %18, 100
%22 = mul nsw i64 %21, -100
%23 = add nsw i64 %22, %18
%24 = mul nsw i64 %21, 146097
%25 = sdiv i64 %24, 4
%26 = mul nsw i64 %23, 1461
%27 = sdiv i64 %26, 4
%28 = mul nsw i64 %20, 153
%29 = add nsw i64 %28, 2
%30 = sdiv i64 %29, 5
%31 = fcmp olt double %14, 4.320000e+04
%32 = select i1 %31, i64 1721118, i64 1721119
%33 = add nsw i64 %30, %8
%34 = add nsw i64 %33, %25
%35 = add nsw i64 %34, %27
%36 = add nsw i64 %35, %32
%37 = select i1 %31, double 4.320000e+04, double -4.320000e+04
%38 = fadd double %14, %37
%39 = sitofp i64 %36 to double
%40 = fdiv double %38, 3.600000e+03
%41 = fdiv double %40, 2.400000e+01
%42 = fadd double %41, %39
ret double %42
}