double JulianDayFromGregorian(int year, int month, float day) {
  char is_julian_calendar = 0;
  char is_gregorian_calendar = 0;
  int a, b;
  if (month == 1 || month == 2) {
    year--;
    month += 12;
  }
  if (year < 1582)
    is_julian_calendar = 1;
  else if (year > 1582)
    is_gregorian_calendar = 1;
  else if (year == 1582) {
    if (month < 10)
      is_julian_calendar = 1;
    else if (month > 10)
      is_gregorian_calendar = 1;
    else if (month == 10) {
      if (day < 15)
        is_julian_calendar = 1;
      else if (day >= 15)
        is_gregorian_calendar = 1;
    }
  }
  if (is_julian_calendar)
    b = 1;
  else if (is_gregorian_calendar)
    a = (int)(year / 100);
  b = 2 - a + (int)(a / 4);
  return ((int)(365.25 * (year + 4716)) + (int)(30.6001 * (month + 1)) + day +
          b - 1524.5);
}


x86 assembly (clang, -O0):
<JulianDayFromGregorian>:
push   %rbp
mov    %rsp,%rbp
mov    %edi,-0x4(%rbp)
mov    %esi,-0x8(%rbp)
movss  %xmm0,-0xc(%rbp)
movb   $0x0,-0xd(%rbp)
movb   $0x0,-0xe(%rbp)
cmpl   $0x1,-0x8(%rbp)
je     112b <JulianDayFromGregorian+0x2b>
cmpl   $0x2,-0x8(%rbp)
jne    113d <JulianDayFromGregorian+0x3d>
mov    -0x4(%rbp),%eax
add    $0xffffffff,%eax
mov    %eax,-0x4(%rbp)
mov    -0x8(%rbp),%eax
add    $0xc,%eax
mov    %eax,-0x8(%rbp)
cmpl   $0x62e,-0x4(%rbp)
jge    1153 <JulianDayFromGregorian+0x53>
movb   $0x1,-0xd(%rbp)
jmp    11fe <JulianDayFromGregorian+0xfe>
cmpl   $0x62e,-0x4(%rbp)
jle    1169 <JulianDayFromGregorian+0x69>
movb   $0x1,-0xe(%rbp)
jmp    11f9 <JulianDayFromGregorian+0xf9>
cmpl   $0x62e,-0x4(%rbp)
jne    11f4 <JulianDayFromGregorian+0xf4>
cmpl   $0xa,-0x8(%rbp)
jge    1189 <JulianDayFromGregorian+0x89>
movb   $0x1,-0xd(%rbp)
jmp    11ef <JulianDayFromGregorian+0xef>
cmpl   $0xa,-0x8(%rbp)
jle    119c <JulianDayFromGregorian+0x9c>
movb   $0x1,-0xe(%rbp)
jmp    11ea <JulianDayFromGregorian+0xea>
cmpl   $0xa,-0x8(%rbp)
jne    11e5 <JulianDayFromGregorian+0xe5>
movss  0xe52(%rip),%xmm0
ucomiss -0xc(%rbp),%xmm0
jbe    11c1 <JulianDayFromGregorian+0xc1>
movb   $0x1,-0xd(%rbp)
jmp    11e0 <JulianDayFromGregorian+0xe0>
movss  -0xc(%rbp),%xmm0
movss  0xe32(%rip),%xmm1
ucomiss %xmm1,%xmm0
jb     11db <JulianDayFromGregorian+0xdb>
movb   $0x1,-0xe(%rbp)
jmp    11e0 <JulianDayFromGregorian+0xe0>
jmp    11e5 <JulianDayFromGregorian+0xe5>
jmp    11ea <JulianDayFromGregorian+0xea>
jmp    11ef <JulianDayFromGregorian+0xef>
jmp    11f4 <JulianDayFromGregorian+0xf4>
jmp    11f9 <JulianDayFromGregorian+0xf9>
jmp    11fe <JulianDayFromGregorian+0xfe>
cmpb   $0x0,-0xd(%rbp)
je     1214 <JulianDayFromGregorian+0x114>
movl   $0x1,-0x18(%rbp)
jmp    1231 <JulianDayFromGregorian+0x131>
cmpb   $0x0,-0xe(%rbp)
je     122c <JulianDayFromGregorian+0x12c>
mov    -0x4(%rbp),%eax
mov    $0x64,%ecx
cltd
idiv   %ecx
mov    %eax,-0x14(%rbp)
jmp    1231 <JulianDayFromGregorian+0x131>
mov    $0x2,%eax
sub    -0x14(%rbp),%eax
mov    %eax,-0x1c(%rbp)
mov    -0x14(%rbp),%eax
mov    $0x4,%ecx
cltd
idiv   %ecx
mov    %eax,%ecx
mov    -0x1c(%rbp),%eax
add    %ecx,%eax
mov    %eax,-0x18(%rbp)
mov    -0x4(%rbp),%eax
add    $0x126c,%eax
cvtsi2sd %eax,%xmm1
movsd  0xdb3(%rip),%xmm0
mulsd  %xmm1,%xmm0
cvttsd2si %xmm0,%eax
mov    -0x8(%rbp),%ecx
add    $0x1,%ecx
cvtsi2sd %ecx,%xmm1
movsd  0xd91(%rip),%xmm0
mulsd  %xmm1,%xmm0
cvttsd2si %xmm0,%ecx
add    %ecx,%eax
cvtsi2ss %eax,%xmm0
addss  -0xc(%rbp),%xmm0
cvtsi2ssl -0x18(%rbp),%xmm1
addss  %xmm1,%xmm0
cvtss2sd %xmm0,%xmm0
movsd  0xd61(%rip),%xmm1
subsd  %xmm1,%xmm0
pop    %rbp
ret

x86 assembly (clang, -O2):
<JulianDayFromGregorian>:
lea    -0x1(%rsi),%eax
lea    0xc(%rsi),%ecx
cmp    $0x2,%eax
cmovae %esi,%ecx
sbb    $0x0,%edi
movslq %edi,%rdx
imul   $0xffffffffae147ae1,%rdx,%rax
mov    %rax,%rsi
shr    $0x3f,%rsi
sar    $0x25,%rax
add    %esi,%eax
imul   $0x51eb851f,%rdx,%rsi
mov    %rsi,%rdi
shr    $0x3f,%rdi
sar    $0x27,%rsi
add    %edi,%esi
movd   %ecx,%xmm1
movd   %edx,%xmm2
punpckldq %xmm1,%xmm2
paddd  0xeb2(%rip),%xmm2
cvtdq2pd %xmm2,%xmm1
mulpd  0xeb6(%rip),%xmm1
cvttpd2dq %xmm1,%xmm1
lea    0x2(%rax,%rsi,1),%eax
pshufd $0x55,%xmm1,%xmm2
paddd  %xmm1,%xmm2
cvtdq2ps %xmm2,%xmm1
addss  %xmm0,%xmm1
xorps  %xmm0,%xmm0
cvtsi2ss %eax,%xmm0
addss  %xmm1,%xmm0
cvtss2sd %xmm0,%xmm0
addsd  0xe97(%rip),%xmm0
ret

LLVM IR (-O0):
define double @JulianDayFromGregorian(i32 %0, i32 %1, float %2) {
%4 = alloca i32
%5 = alloca i32
%6 = alloca float
%7 = alloca i8
%8 = alloca i8
%9 = alloca i32
%10 = alloca i32
store i32 %0, i32* %4
store i32 %1, i32* %5
store float %2, float* %6
store i8 0, i8* %7
store i8 0, i8* %8
%11 = load i32, i32* %5
%12 = icmp eq i32 %11, 1
br i1 %12, label %16, label %13
13: ; preds = %3
%14 = load i32, i32* %5
%15 = icmp eq i32 %14, 2
br i1 %15, label %16, label %21
16: ; preds = %13, %3
%17 = load i32, i32* %4
%18 = add nsw i32 %17, -1
store i32 %18, i32* %4
%19 = load i32, i32* %5
%20 = add nsw i32 %19, 12
store i32 %20, i32* %5
br label %21
21: ; preds = %16, %13
%22 = load i32, i32* %4
%23 = icmp slt i32 %22, 1582
br i1 %23, label %24, label %25
24: ; preds = %21
store i8 1, i8* %7
br label %58
25: ; preds = %21
%26 = load i32, i32* %4
%27 = icmp sgt i32 %26, 1582
br i1 %27, label %28, label %29
28: ; preds = %25
store i8 1, i8* %8
br label %57
29: ; preds = %25
%30 = load i32, i32* %4
%31 = icmp eq i32 %30, 1582
br i1 %31, label %32, label %56
32: ; preds = %29
%33 = load i32, i32* %5
%34 = icmp slt i32 %33, 10
br i1 %34, label %35, label %36
35: ; preds = %32
store i8 1, i8* %7
br label %55
36: ; preds = %32
%37 = load i32, i32* %5
%38 = icmp sgt i32 %37, 10
br i1 %38, label %39, label %40
39: ; preds = %36
store i8 1, i8* %8
br label %54
40: ; preds = %36
%41 = load i32, i32* %5
%42 = icmp eq i32 %41, 10
br i1 %42, label %43, label %53
43: ; preds = %40
%44 = load float, float* %6
%45 = fcmp olt float %44, 1.500000e+01
br i1 %45, label %46, label %47
46: ; preds = %43
store i8 1, i8* %7
br label %52
47: ; preds = %43
%48 = load float, float* %6
%49 = fcmp oge float %48, 1.500000e+01
br i1 %49, label %50, label %51
50: ; preds = %47
store i8 1, i8* %8
br label %51
51: ; preds = %50, %47
br label %52
52: ; preds = %51, %46
br label %53
53: ; preds = %52, %40
br label %54
54: ; preds = %53, %39
br label %55
55: ; preds = %54, %35
br label %56
56: ; preds = %55, %29
br label %57
57: ; preds = %56, %28
br label %58
58: ; preds = %57, %24
%59 = load i8, i8* %7
%60 = icmp ne i8 %59, 0
br i1 %60, label %61, label %62
61: ; preds = %58
store i32 1, i32* %10
br label %69
62: ; preds = %58
%63 = load i8, i8* %8
%64 = icmp ne i8 %63, 0
br i1 %64, label %65, label %68
65: ; preds = %62
%66 = load i32, i32* %4
%67 = sdiv i32 %66, 100
store i32 %67, i32* %9
br label %68
68: ; preds = %65, %62
br label %69
69: ; preds = %68, %61
%70 = load i32, i32* %9
%71 = sub nsw i32 2, %70
%72 = load i32, i32* %9
%73 = sdiv i32 %72, 4
%74 = add nsw i32 %71, %73
store i32 %74, i32* %10
%75 = load i32, i32* %4
%76 = add nsw i32 %75, 4716
%77 = sitofp i32 %76 to double
%78 = fmul double 3.652500e+02, %77
%79 = fptosi double %78 to i32
%80 = load i32, i32* %5
%81 = add nsw i32 %80, 1
%82 = sitofp i32 %81 to double
%83 = fmul double 3.060010e+01, %82
%84 = fptosi double %83 to i32
%85 = add nsw i32 %79, %84
%86 = sitofp i32 %85 to float
%87 = load float, float* %6
%88 = fadd float %86, %87
%89 = load i32, i32* %10
%90 = sitofp i32 %89 to float
%91 = fadd float %88, %90
%92 = fpext float %91 to double
%93 = fsub double %92, 1.524500e+03
ret double %93
}

LLVM IR (-O2):
define double @JulianDayFromGregorian(i32 %0, i32 %1, float %2) {
%4 = add i32 %1, -1
%5 = icmp ult i32 %4, 2
%6 = add nsw i32 %1, 12
%7 = select i1 %5, i32 %6, i32 %1
%8 = sext i1 %5 to i32
%9 = add nsw i32 %8, %0
%10 = sdiv i32 %9, -100
%11 = add nsw i32 %10, 2
%12 = sdiv i32 %9, 400
%13 = add nsw i32 %11, %12
%14 = insertelement <2 x i32> poison, i32 %9, i64 0
%15 = insertelement <2 x i32> %14, i32 %7, i64 1
%16 = add nsw <2 x i32> %15, <i32 4716, i32 1>
%17 = sitofp <2 x i32> %16 to <2 x double>
%18 = fmul <2 x double> %17, <double 3.652500e+02, double 3.060010e+01>
%19 = fptosi <2 x double> %18 to <2 x i32>
%20 = shufflevector <2 x i32> %19, <2 x i32> poison, <2 x i32> <i32 1, i32 undef>
%21 = add nsw <2 x i32> %20, %19
%22 = extractelement <2 x i32> %21, i64 0
%23 = sitofp i32 %22 to float
%24 = fadd float %23, %2
%25 = sitofp i32 %13 to float
%26 = fadd float %24, %25
%27 = fpext float %26 to double
%28 = fadd double %27, -1.524500e+03
ret double %28
}