double gregorian_to_jd(int year, int month, int day, int hour, int min,
                       double sec) {
  double frac =
      ((double)hour / 24.0) + ((double)min / 1440.0) + (sec / 86400.0);
  double gyr = (double)year + (0.01 * (double)month) + (0.0001 * (double)day) +
               (0.0001 * frac) + 1.0e-9;
  long iy0, im0;
  if (month <= 2) {
    iy0 = year - 1L;
    im0 = month + 12;
  } else {
    iy0 = year;
    im0 = month;
  }
  long ia = iy0 / 100L;
  long ib = 2L - ia + (ia >> 2);
  long jd;
  if (year <= 0)
    jd = (long)((365.25 * (double)iy0) - 0.75) + (long)(30.6001 * (im0 + 1L)) +
         (long)day + 1720994L;
  else
    jd = (long)(365.25 * (double)iy0) + (long)(30.6001 * (double)(im0 + 1L)) +
         (long)day + 1720994L;
  if (gyr >= 1582.1015)
    jd += ib;
  return (double)jd + frac + 0.5;
}


x86 assembly (clang, -O0):
<gregorian_to_jd>:
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)
cvtsi2sdl -0x10(%rbp),%xmm0
movsd  0xf02(%rip),%xmm1
divsd  %xmm1,%xmm0
cvtsi2sdl -0x14(%rbp),%xmm1
movsd  0xee9(%rip),%xmm2
divsd  %xmm2,%xmm1
addsd  %xmm1,%xmm0
movsd  -0x20(%rbp),%xmm1
movsd  0xecc(%rip),%xmm2
divsd  %xmm2,%xmm1
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x28(%rbp)
cvtsi2sdl -0x4(%rbp),%xmm1
cvtsi2sdl -0x8(%rbp),%xmm0
movsd  0xea5(%rip),%xmm2
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
cvtsi2sdl -0xc(%rbp),%xmm1
movsd  0xe88(%rip),%xmm2
mulsd  %xmm2,%xmm1
addsd  %xmm0,%xmm1
movsd  -0x28(%rbp),%xmm0
movsd  0xe73(%rip),%xmm2
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  0xe5b(%rip),%xmm1
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x30(%rbp)
cmpl   $0x2,-0x8(%rbp)
jg     11d5 <gregorian_to_jd+0xd5>
movslq -0x4(%rbp),%rax
sub    $0x1,%rax
mov    %rax,-0x38(%rbp)
mov    -0x8(%rbp),%eax
add    $0xc,%eax
cltq
mov    %rax,-0x40(%rbp)
jmp    11e5 <gregorian_to_jd+0xe5>
movslq -0x4(%rbp),%rax
mov    %rax,-0x38(%rbp)
movslq -0x8(%rbp),%rax
mov    %rax,-0x40(%rbp)
mov    -0x38(%rbp),%rax
mov    $0x64,%ecx
cqto
idiv   %rcx
mov    %rax,-0x48(%rbp)
mov    $0x2,%eax
sub    -0x48(%rbp),%rax
mov    -0x48(%rbp),%rcx
sar    $0x2,%rcx
add    %rcx,%rax
mov    %rax,-0x50(%rbp)
cmpl   $0x0,-0x4(%rbp)
jg     1273 <gregorian_to_jd+0x173>
cvtsi2sdq -0x38(%rbp),%xmm0
movsd  0xe11(%rip),%xmm1
mulsd  %xmm1,%xmm0
movsd  0xe0d(%rip),%xmm1
addsd  %xmm1,%xmm0
cvttsd2si %xmm0,%rax
mov    -0x40(%rbp),%rcx
add    $0x1,%rcx
cvtsi2sd %rcx,%xmm1
movsd  0xddf(%rip),%xmm0
mulsd  %xmm1,%xmm0
cvttsd2si %xmm0,%rcx
add    %rcx,%rax
movslq -0xc(%rbp),%rcx
add    %rcx,%rax
add    $0x1a42a2,%rax
mov    %rax,-0x58(%rbp)
jmp    12bc <gregorian_to_jd+0x1bc>
cvtsi2sdq -0x38(%rbp),%xmm1
movsd  0xdb7(%rip),%xmm0
mulsd  %xmm1,%xmm0
cvttsd2si %xmm0,%rax
mov    -0x40(%rbp),%rcx
add    $0x1,%rcx
cvtsi2sd %rcx,%xmm1
movsd  0xd91(%rip),%xmm0
mulsd  %xmm1,%xmm0
cvttsd2si %xmm0,%rcx
add    %rcx,%rax
movslq -0xc(%rbp),%rcx
add    %rcx,%rax
add    $0x1a42a2,%rax
mov    %rax,-0x58(%rbp)
movsd  -0x30(%rbp),%xmm0
movsd  0xd7f(%rip),%xmm1
ucomisd %xmm1,%xmm0
jb     12df <gregorian_to_jd+0x1df>
mov    -0x50(%rbp),%rax
add    -0x58(%rbp),%rax
mov    %rax,-0x58(%rbp)
cvtsi2sdq -0x58(%rbp),%xmm0
addsd  -0x28(%rbp),%xmm0
movsd  0xd5e(%rip),%xmm1
addsd  %xmm1,%xmm0
pop    %rbp
ret

x86 assembly (clang, -O2):
<gregorian_to_jd>:
cvtsi2sd %ecx,%xmm1
cvtsi2sd %r8d,%xmm2
divsd  0xeef(%rip),%xmm2
mov    %edx,%r8d
unpcklpd %xmm1,%xmm0
divpd  0xf30(%rip),%xmm0
movapd %xmm0,%xmm1
unpckhpd %xmm0,%xmm1
addsd  %xmm2,%xmm1
addsd  %xmm0,%xmm1
lea    0xc(%rsi),%eax
xor    %edx,%edx
cmp    $0x3,%esi
setl   %dl
movslq %edi,%r10
cmovge %esi,%eax
mov    %r10,%rcx
sub    %rdx,%rcx
movslq %eax,%r9
movabs $0xa3d70a3d70a3d70b,%rdx
0a d7 a3
mov    %rcx,%rax
imul   %rdx
add    %rcx,%rdx
mov    %rdx,%rax
shr    $0x3f,%rax
sar    $0x6,%rdx
xorps  %xmm0,%xmm0
cvtsi2sd %rcx,%xmm0
add    %rax,%rdx
mulsd  0xe8d(%rip),%xmm0
test   %r10d,%r10d
jg     1188 <gregorian_to_jd+0x88>
addsd  0xe88(%rip),%xmm0
cvttsd2si %xmm0,%rax
add    $0x1,%r9
xorps  %xmm0,%xmm0
cvtsi2sd %r9,%xmm0
mulsd  0xe77(%rip),%xmm0
cvttsd2si %xmm0,%r9
movslq %r8d,%r8
add    %r8,%rax
add    %r9,%rax
mov    %rdx,%rcx
sar    $0x2,%rcx
sub    %rdx,%rcx
xorps  %xmm0,%xmm0
cvtsi2sd %r8d,%xmm0
xorps  %xmm2,%xmm2
cvtsi2sd %esi,%xmm2
cvtsi2sd %edi,%xmm3
mulsd  0xe4c(%rip),%xmm2
addsd  %xmm3,%xmm2
movsd  0xe48(%rip),%xmm3
mulsd  %xmm3,%xmm0
addsd  %xmm2,%xmm0
mulsd  %xmm1,%xmm3
addsd  %xmm0,%xmm3
addsd  0xe38(%rip),%xmm3
add    $0x1a42a4,%rcx
ucomisd 0xe31(%rip),%xmm3
mov    $0x1a42a2,%edx
cmovae %rcx,%rdx
add    %rax,%rdx
xorps  %xmm0,%xmm0
cvtsi2sd %rdx,%xmm0
addsd  %xmm1,%xmm0
addsd  0xe19(%rip),%xmm0
ret

LLVM IR (-O0):
define double @gregorian_to_jd(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 double
%14 = alloca double
%15 = alloca i64
%16 = alloca i64
%17 = alloca i64
%18 = alloca i64
%19 = alloca i64
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* %10
%21 = sitofp i32 %20 to double
%22 = fdiv double %21, 2.400000e+01
%23 = load i32, i32* %11
%24 = sitofp i32 %23 to double
%25 = fdiv double %24, 1.440000e+03
%26 = fadd double %22, %25
%27 = load double, double* %12
%28 = fdiv double %27, 8.640000e+04
%29 = fadd double %26, %28
store double %29, double* %13
%30 = load i32, i32* %7
%31 = sitofp i32 %30 to double
%32 = load i32, i32* %8
%33 = sitofp i32 %32 to double
%34 = call double @llvm.fmuladd.f64(double 1.000000e-02, double %33, double %31)
%35 = load i32, i32* %9
%36 = sitofp i32 %35 to double
%37 = call double @llvm.fmuladd.f64(double 1.000000e-04, double %36, double %34)
%38 = load double, double* %13
%39 = call double @llvm.fmuladd.f64(double 1.000000e-04, double %38, double %37)
%40 = fadd double %39, 1.000000e-09
store double %40, double* %14
%41 = load i32, i32* %8
%42 = icmp sle i32 %41, 2
br i1 %42, label %43, label %50
43: ; preds = %6
%44 = load i32, i32* %7
%45 = sext i32 %44 to i64
%46 = sub nsw i64 %45, 1
store i64 %46, i64* %15
%47 = load i32, i32* %8
%48 = add nsw i32 %47, 12
%49 = sext i32 %48 to i64
store i64 %49, i64* %16
br label %55
50: ; preds = %6
%51 = load i32, i32* %7
%52 = sext i32 %51 to i64
store i64 %52, i64* %15
%53 = load i32, i32* %8
%54 = sext i32 %53 to i64
store i64 %54, i64* %16
br label %55
55: ; preds = %50, %43
%56 = load i64, i64* %15
%57 = sdiv i64 %56, 100
store i64 %57, i64* %17
%58 = load i64, i64* %17
%59 = sub nsw i64 2, %58
%60 = load i64, i64* %17
%61 = ashr i64 %60, 2
%62 = add nsw i64 %59, %61
store i64 %62, i64* %18
%63 = load i32, i32* %7
%64 = icmp sle i32 %63, 0
br i1 %64, label %65, label %80
65: ; preds = %55
%66 = load i64, i64* %15
%67 = sitofp i64 %66 to double
%68 = call double @llvm.fmuladd.f64(double 3.652500e+02, double %67, double -7.500000e-01)
%69 = fptosi double %68 to i64
%70 = load i64, i64* %16
%71 = add nsw i64 %70, 1
%72 = sitofp i64 %71 to double
%73 = fmul double 3.060010e+01, %72
%74 = fptosi double %73 to i64
%75 = add nsw i64 %69, %74
%76 = load i32, i32* %9
%77 = sext i32 %76 to i64
%78 = add nsw i64 %75, %77
%79 = add nsw i64 %78, 1720994
store i64 %79, i64* %19
br label %95
80: ; preds = %55
%81 = load i64, i64* %15
%82 = sitofp i64 %81 to double
%83 = fmul double 3.652500e+02, %82
%84 = fptosi double %83 to i64
%85 = load i64, i64* %16
%86 = add nsw i64 %85, 1
%87 = sitofp i64 %86 to double
%88 = fmul double 3.060010e+01, %87
%89 = fptosi double %88 to i64
%90 = add nsw i64 %84, %89
%91 = load i32, i32* %9
%92 = sext i32 %91 to i64
%93 = add nsw i64 %90, %92
%94 = add nsw i64 %93, 1720994
store i64 %94, i64* %19
br label %95
95: ; preds = %80, %65
%96 = load double, double* %14
%97 = fcmp oge double %96, 0x4098B867EF9DB22D
br i1 %97, label %98, label %102
98: ; preds = %95
%99 = load i64, i64* %18
%100 = load i64, i64* %19
%101 = add nsw i64 %100, %99
store i64 %101, i64* %19
br label %102
102: ; preds = %98, %95
%103 = load i64, i64* %19
%104 = sitofp i64 %103 to double
%105 = load double, double* %13
%106 = fadd double %104, %105
%107 = fadd double %106, 5.000000e-01
ret double %107
}

LLVM IR (-O2):
define double @gregorian_to_jd(i32 %0, i32 %1, i32 %2, i32 %3, i32 %4, double %5) {
%7 = sitofp i32 %3 to double
%8 = sitofp i32 %4 to double
%9 = fdiv double %8, 1.440000e+03
%10 = insertelement <2 x double> poison, double %5, i64 0
%11 = insertelement <2 x double> %10, double %7, i64 1
%12 = fdiv <2 x double> %11, <double 8.640000e+04, double 2.400000e+01>
%13 = extractelement <2 x double> %12, i64 1
%14 = fadd double %13, %9
%15 = extractelement <2 x double> %12, i64 0
%16 = fadd double %15, %14
%17 = icmp slt i32 %1, 3
%18 = sext i32 %0 to i64
%19 = add nsw i32 %1, 12
%20 = select i1 %17, i32 %19, i32 %1
%21 = sext i1 %17 to i64
%22 = add nsw i64 %21, %18
%23 = sext i32 %20 to i64
%24 = sdiv i64 %22, 100
%25 = icmp slt i32 %0, 1
%26 = sitofp i64 %22 to double
%27 = fmul double %26, 3.652500e+02
%28 = tail call double @llvm.fmuladd.f64(double %26, double 3.652500e+02, double -7.500000e-01)
%29 = select i1 %25, double %28, double %27
%30 = fptosi double %29 to i64
%31 = add nsw i64 %23, 1
%32 = sitofp i64 %31 to double
%33 = fmul double %32, 3.060010e+01
%34 = fptosi double %33 to i64
%35 = sext i32 %2 to i64
%36 = add i64 %30, %35
%37 = add i64 %36, %34
%38 = sub nsw i64 2, %24
%39 = ashr i64 %24, 2
%40 = add nsw i64 %38, %39
%41 = sitofp i32 %2 to double
%42 = sitofp i32 %1 to double
%43 = sitofp i32 %0 to double
%44 = tail call double @llvm.fmuladd.f64(double %42, double 1.000000e-02, double %43)
%45 = tail call double @llvm.fmuladd.f64(double %41, double 1.000000e-04, double %44)
%46 = tail call double @llvm.fmuladd.f64(double %16, double 1.000000e-04, double %45)
%47 = fadd double %46, 1.000000e-09
%48 = fcmp ult double %47, 0x4098B867EF9DB22D
%49 = add nsw i64 %40, 1720994
%50 = select i1 %48, i64 1720994, i64 %49
%51 = add i64 %50, %37
%52 = sitofp i64 %51 to double
%53 = fadd double %16, %52
%54 = fadd double %53, 5.000000e-01
ret double %54
}