int grib_datetime_to_julian(long year, long month, long day, long hour,
                            long minute, long second, double *jd) {
  double a, b, dday;
  long y, m;
  dday = (double)(hour * 3600 + minute * 60 + second) / 86400.0 + day;
  if (month < 3) {
    y = year - 1;
    m = month + 12;
  } else {
    y = year;
    m = month;
  }
  a = (long)(((double)y) / 100);
  if (y > 1582)
    b = 2 - a + (long)(a / 4);
  else if (y == 1582) {
    if (m > 10)
      b = 2 - a + (long)(a / 4);
    else if (m == 10) {
      if (day > 14)
        b = 2 - a + (long)(a / 4);
      else
        b = 0;
    } else
      b = 0;
  } else
    b = 0;
  *jd = (long)(365.25 * (y + 4716)) + (long)(30.6001 * (m + 1)) + dday + b -
        1524.5;
  return 0;
}


x86 assembly (clang, -O0):
<grib_datetime_to_julian>:
push   %rbp
mov    %rsp,%rbp
mov    0x10(%rbp),%rax
mov    %rdi,-0x8(%rbp)
mov    %rsi,-0x10(%rbp)
mov    %rdx,-0x18(%rbp)
mov    %rcx,-0x20(%rbp)
mov    %r8,-0x28(%rbp)
mov    %r9,-0x30(%rbp)
imul   $0xe10,-0x20(%rbp),%rax
imul   $0x3c,-0x28(%rbp),%rcx
add    %rcx,%rax
add    -0x30(%rbp),%rax
cvtsi2sd %rax,%xmm0
movsd  0xebf(%rip),%xmm1
divsd  %xmm1,%xmm0
cvtsi2sdq -0x18(%rbp),%xmm1
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x48(%rbp)
cmpq   $0x3,-0x10(%rbp)
jge    117c <grib_datetime_to_julian+0x7c>
mov    -0x8(%rbp),%rax
sub    $0x1,%rax
mov    %rax,-0x50(%rbp)
mov    -0x10(%rbp),%rax
add    $0xc,%rax
mov    %rax,-0x58(%rbp)
jmp    118c <grib_datetime_to_julian+0x8c>
mov    -0x8(%rbp),%rax
mov    %rax,-0x50(%rbp)
mov    -0x10(%rbp),%rax
mov    %rax,-0x58(%rbp)
cvtsi2sdq -0x50(%rbp),%xmm0
movsd  0xe6e(%rip),%xmm1
divsd  %xmm1,%xmm0
cvttsd2si %xmm0,%rax
cvtsi2sd %rax,%xmm0
movsd  %xmm0,-0x38(%rbp)
cmpq   $0x62e,-0x50(%rbp)
jle    11f1 <grib_datetime_to_julian+0xf1>
movsd  0xe55(%rip),%xmm0
subsd  -0x38(%rbp),%xmm0
movsd  -0x38(%rbp),%xmm1
movsd  0xe3b(%rip),%xmm2
divsd  %xmm2,%xmm1
cvttsd2si %xmm1,%rax
cvtsi2sd %rax,%xmm1
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x40(%rbp)
jmp    12b8 <grib_datetime_to_julian+0x1b8>
cmpq   $0x62e,-0x50(%rbp)
jne    12ab <grib_datetime_to_julian+0x1ab>
cmpq   $0xa,-0x58(%rbp)
jle    1240 <grib_datetime_to_julian+0x140>
movsd  0xe06(%rip),%xmm0
subsd  -0x38(%rbp),%xmm0
movsd  -0x38(%rbp),%xmm1
movsd  0xdec(%rip),%xmm2
divsd  %xmm2,%xmm1
cvttsd2si %xmm1,%rax
cvtsi2sd %rax,%xmm1
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x40(%rbp)
jmp    12a6 <grib_datetime_to_julian+0x1a6>
cmpq   $0xa,-0x58(%rbp)
jne    1299 <grib_datetime_to_julian+0x199>
cmpq   $0xe,-0x18(%rbp)
jle    128c <grib_datetime_to_julian+0x18c>
movsd  0xdba(%rip),%xmm0
subsd  -0x38(%rbp),%xmm0
movsd  -0x38(%rbp),%xmm1
movsd  0xda0(%rip),%xmm2
divsd  %xmm2,%xmm1
cvttsd2si %xmm1,%rax
cvtsi2sd %rax,%xmm1
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x40(%rbp)
jmp    1294 <grib_datetime_to_julian+0x194>
xorps  %xmm0,%xmm0
movsd  %xmm0,-0x40(%rbp)
jmp    12a1 <grib_datetime_to_julian+0x1a1>
xorps  %xmm0,%xmm0
movsd  %xmm0,-0x40(%rbp)
jmp    12a6 <grib_datetime_to_julian+0x1a6>
jmp    12b3 <grib_datetime_to_julian+0x1b3>
xorps  %xmm0,%xmm0
movsd  %xmm0,-0x40(%rbp)
jmp    12b8 <grib_datetime_to_julian+0x1b8>
mov    -0x50(%rbp),%rax
add    $0x126c,%rax
cvtsi2sd %rax,%xmm1
movsd  0xd61(%rip),%xmm0
mulsd  %xmm1,%xmm0
cvttsd2si %xmm0,%rax
mov    -0x58(%rbp),%rcx
add    $0x1,%rcx
cvtsi2sd %rcx,%xmm1
movsd  0xd3b(%rip),%xmm0
mulsd  %xmm1,%xmm0
cvttsd2si %xmm0,%rcx
add    %rcx,%rax
cvtsi2sd %rax,%xmm0
addsd  -0x48(%rbp),%xmm0
addsd  -0x40(%rbp),%xmm0
movsd  0xd10(%rip),%xmm1
subsd  %xmm1,%xmm0
mov    0x10(%rbp),%rax
movsd  %xmm0,(%rax)
xor    %eax,%eax
pop    %rbp
ret

x86 assembly (clang, -O2):
<grib_datetime_to_julian>:
lea    0xc(%rsi),%r10
xor    %eax,%eax
cmp    $0x3,%rsi
cmovge %rsi,%r10
setl   %al
sub    %rax,%rdi
cvtsi2sd %rdi,%xmm0
divsd  0xedf(%rip),%xmm0
cvttsd2si %xmm0,%rax
mov    0x8(%rsp),%rsi
cvtsi2sd %rax,%xmm1
cmp    $0x62f,%rdi
jl     1160 <grib_datetime_to_julian+0x60>
movsd  0xec7(%rip),%xmm2
subsd  %xmm1,%xmm2
mulsd  0xec3(%rip),%xmm1
cvttsd2si %xmm1,%rax
xorps  %xmm0,%xmm0
cvtsi2sd %rax,%xmm0
addsd  %xmm2,%xmm0
jmp    117f <grib_datetime_to_julian+0x7f>
xorpd  %xmm0,%xmm0
cmp    $0x62e,%rdi
jne    117f <grib_datetime_to_julian+0x7f>
cmp    $0xb,%r10
jge    1139 <grib_datetime_to_julian+0x39>
cmp    $0xf,%rdx
jl     117f <grib_datetime_to_julian+0x7f>
cmp    $0xa,%r10
je     1139 <grib_datetime_to_julian+0x39>
imul   $0xe10,%rcx,%rax
imul   $0x3c,%r8,%rcx
add    %rax,%rcx
add    %r9,%rcx
xorps  %xmm1,%xmm1
cvtsi2sd %rcx,%xmm1
divsd  0xe78(%rip),%xmm1
xorps  %xmm2,%xmm2
cvtsi2sd %rdx,%xmm2
add    $0x126c,%rdi
cvtsi2sd %rdi,%xmm3
mulsd  0xe64(%rip),%xmm3
cvttsd2si %xmm3,%rax
add    $0x1,%r10
xorps  %xmm3,%xmm3
cvtsi2sd %r10,%xmm3
mulsd  0xe53(%rip),%xmm3
addsd  %xmm1,%xmm2
cvttsd2si %xmm3,%rcx
add    %rax,%rcx
xorps  %xmm1,%xmm1
cvtsi2sd %rcx,%xmm1
addsd  %xmm2,%xmm1
addsd  %xmm0,%xmm1
addsd  0xe37(%rip),%xmm1
movsd  %xmm1,(%rsi)
xor    %eax,%eax
ret

LLVM IR (-O0):
define i32 @grib_datetime_to_julian(i64 %0, i64 %1, i64 %2, i64 %3, i64 %4, i64 %5, double* %6) {
%8 = alloca i64
%9 = alloca i64
%10 = alloca i64
%11 = alloca i64
%12 = alloca i64
%13 = alloca i64
%14 = alloca double*
%15 = alloca double
%16 = alloca double
%17 = alloca double
%18 = alloca i64
%19 = alloca i64
store i64 %0, i64* %8
store i64 %1, i64* %9
store i64 %2, i64* %10
store i64 %3, i64* %11
store i64 %4, i64* %12
store i64 %5, i64* %13
store double* %6, double** %14
%20 = load i64, i64* %11
%21 = mul nsw i64 %20, 3600
%22 = load i64, i64* %12
%23 = mul nsw i64 %22, 60
%24 = add nsw i64 %21, %23
%25 = load i64, i64* %13
%26 = add nsw i64 %24, %25
%27 = sitofp i64 %26 to double
%28 = fdiv double %27, 8.640000e+04
%29 = load i64, i64* %10
%30 = sitofp i64 %29 to double
%31 = fadd double %28, %30
store double %31, double* %17
%32 = load i64, i64* %9
%33 = icmp slt i64 %32, 3
br i1 %33, label %34, label %39
34: ; preds = %7
%35 = load i64, i64* %8
%36 = sub nsw i64 %35, 1
store i64 %36, i64* %18
%37 = load i64, i64* %9
%38 = add nsw i64 %37, 12
store i64 %38, i64* %19
br label %42
39: ; preds = %7
%40 = load i64, i64* %8
store i64 %40, i64* %18
%41 = load i64, i64* %9
store i64 %41, i64* %19
br label %42
42: ; preds = %39, %34
%43 = load i64, i64* %18
%44 = sitofp i64 %43 to double
%45 = fdiv double %44, 1.000000e+02
%46 = fptosi double %45 to i64
%47 = sitofp i64 %46 to double
store double %47, double* %15
%48 = load i64, i64* %18
%49 = icmp sgt i64 %48, 1582
br i1 %49, label %50, label %58
50: ; preds = %42
%51 = load double, double* %15
%52 = fsub double 2.000000e+00, %51
%53 = load double, double* %15
%54 = fdiv double %53, 4.000000e+00
%55 = fptosi double %54 to i64
%56 = sitofp i64 %55 to double
%57 = fadd double %52, %56
store double %57, double* %16
br label %93
58: ; preds = %42
%59 = load i64, i64* %18
%60 = icmp eq i64 %59, 1582
br i1 %60, label %61, label %91
61: ; preds = %58
%62 = load i64, i64* %19
%63 = icmp sgt i64 %62, 10
br i1 %63, label %64, label %72
64: ; preds = %61
%65 = load double, double* %15
%66 = fsub double 2.000000e+00, %65
%67 = load double, double* %15
%68 = fdiv double %67, 4.000000e+00
%69 = fptosi double %68 to i64
%70 = sitofp i64 %69 to double
%71 = fadd double %66, %70
store double %71, double* %16
br label %90
72: ; preds = %61
%73 = load i64, i64* %19
%74 = icmp eq i64 %73, 10
br i1 %74, label %75, label %88
75: ; preds = %72
%76 = load i64, i64* %10
%77 = icmp sgt i64 %76, 14
br i1 %77, label %78, label %86
78: ; preds = %75
%79 = load double, double* %15
%80 = fsub double 2.000000e+00, %79
%81 = load double, double* %15
%82 = fdiv double %81, 4.000000e+00
%83 = fptosi double %82 to i64
%84 = sitofp i64 %83 to double
%85 = fadd double %80, %84
store double %85, double* %16
br label %87
86: ; preds = %75
store double 0.000000e+00, double* %16
br label %87
87: ; preds = %86, %78
br label %89
88: ; preds = %72
store double 0.000000e+00, double* %16
br label %89
89: ; preds = %88, %87
br label %90
90: ; preds = %89, %64
br label %92
91: ; preds = %58
store double 0.000000e+00, double* %16
br label %92
92: ; preds = %91, %90
br label %93
93: ; preds = %92, %50
%94 = load i64, i64* %18
%95 = add nsw i64 %94, 4716
%96 = sitofp i64 %95 to double
%97 = fmul double 3.652500e+02, %96
%98 = fptosi double %97 to i64
%99 = load i64, i64* %19
%100 = add nsw i64 %99, 1
%101 = sitofp i64 %100 to double
%102 = fmul double 3.060010e+01, %101
%103 = fptosi double %102 to i64
%104 = add nsw i64 %98, %103
%105 = sitofp i64 %104 to double
%106 = load double, double* %17
%107 = fadd double %105, %106
%108 = load double, double* %16
%109 = fadd double %107, %108
%110 = fsub double %109, 1.524500e+03
%111 = load double*, double** %14
store double %110, double* %111
ret i32 0
}

LLVM IR (-O2):
define i32 @grib_datetime_to_julian(i64 %0, i64 %1, i64 %2, i64 %3, i64 %4, i64 %5, double* nocapture writeonly %6) {
%8 = icmp slt i64 %1, 3
%9 = add nsw i64 %1, 12
%10 = sext i1 %8 to i64
%11 = add nsw i64 %10, %0
%12 = select i1 %8, i64 %9, i64 %1
%13 = sitofp i64 %11 to double
%14 = fdiv double %13, 1.000000e+02
%15 = fptosi double %14 to i64
%16 = sitofp i64 %15 to double
%17 = icmp sgt i64 %11, 1582
br i1 %17, label %18, label %24
18: ; preds = %7
%19 = fsub double 2.000000e+00, %16
%20 = fmul double %16, 2.500000e-01
%21 = fptosi double %20 to i64
%22 = sitofp i64 %21 to double
%23 = fadd double %19, %22
br label %44
24: ; preds = %7
%25 = icmp eq i64 %11, 1582
br i1 %25, label %26, label %44
26: ; preds = %24
%27 = icmp sgt i64 %12, 10
br i1 %27, label %28, label %34
28: ; preds = %26
%29 = fsub double 2.000000e+00, %16
%30 = fmul double %16, 2.500000e-01
%31 = fptosi double %30 to i64
%32 = sitofp i64 %31 to double
%33 = fadd double %29, %32
br label %44
34: ; preds = %26
%35 = icmp eq i64 %12, 10
%36 = icmp sgt i64 %2, 14
%37 = and i1 %36, %35
br i1 %37, label %38, label %44
38: ; preds = %34
%39 = fsub double 2.000000e+00, %16
%40 = fmul double %16, 2.500000e-01
%41 = fptosi double %40 to i64
%42 = sitofp i64 %41 to double
%43 = fadd double %39, %42
br label %44
44: ; preds = %24, %34, %38, %28, %18
%45 = phi double [ %23, %18 ], [ %33, %28 ], [ %43, %38 ], [ 0.000000e+00, %34 ], [ 0.000000e+00, %24 ]
%46 = mul nsw i64 %3, 3600
%47 = mul nsw i64 %4, 60
%48 = add nsw i64 %47, %46
%49 = add nsw i64 %48, %5
%50 = sitofp i64 %49 to double
%51 = fdiv double %50, 8.640000e+04
%52 = sitofp i64 %2 to double
%53 = fadd double %51, %52
%54 = add nsw i64 %11, 4716
%55 = sitofp i64 %54 to double
%56 = fmul double %55, 3.652500e+02
%57 = fptosi double %56 to i64
%58 = add nsw i64 %12, 1
%59 = sitofp i64 %58 to double
%60 = fmul double %59, 3.060010e+01
%61 = fptosi double %60 to i64
%62 = add nsw i64 %57, %61
%63 = sitofp i64 %62 to double
%64 = fadd double %53, %63
%65 = fadd double %64, %45
%66 = fadd double %65, -1.524500e+03
store double %66, double* %6
ret i32 0
}