double g2jd(int year, int month, double day) {
  if (month <= 2) {
    year -= 1;
    month += 12;
  }
  int a, b, isjulian;
  double jd;
  a = (int)(year / 100);
  isjulian = 0;
  if (year < 1582) {
    isjulian = 1;
  } else if (year == 1582) {
    if (month < 10)
      isjulian = 1;
    if (month == 10 && day <= 5.0)
      isjulian = 1;
    if (month == 10 && day > 5.0 && day < 15.0)
      return 2299160.5;
  }
  if (isjulian)
    b = 0;
  else
    b = 2 - a + (int)(a / 4);
  jd = (int)(365.25 * (year + 4716)) + (int)(30.6001 * (month + 1)) + day + b -
       1524.5;
  return jd;
}


x86 assembly (clang, -O0):
<g2jd>:
push   %rbp
mov    %rsp,%rbp
mov    %edi,-0xc(%rbp)
mov    %esi,-0x10(%rbp)
movsd  %xmm0,-0x18(%rbp)
cmpl   $0x2,-0x10(%rbp)
jg     112b <g2jd+0x2b>
mov    -0xc(%rbp),%eax
sub    $0x1,%eax
mov    %eax,-0xc(%rbp)
mov    -0x10(%rbp),%eax
add    $0xc,%eax
mov    %eax,-0x10(%rbp)
mov    -0xc(%rbp),%eax
mov    $0x64,%ecx
cltd
idiv   %ecx
mov    %eax,-0x1c(%rbp)
movl   $0x0,-0x24(%rbp)
cmpl   $0x62e,-0xc(%rbp)
jge    1159 <g2jd+0x59>
movl   $0x1,-0x24(%rbp)
jmp    11eb <g2jd+0xeb>
cmpl   $0x62e,-0xc(%rbp)
jne    11e6 <g2jd+0xe6>
cmpl   $0xa,-0x10(%rbp)
jge    1177 <g2jd+0x77>
movl   $0x1,-0x24(%rbp)
cmpl   $0xa,-0x10(%rbp)
jne    119b <g2jd+0x9b>
movsd  0xe77(%rip),%xmm0
ucomisd -0x18(%rbp),%xmm0
jb     119b <g2jd+0x9b>
movl   $0x1,-0x24(%rbp)
cmpl   $0xa,-0x10(%rbp)
jne    11e1 <g2jd+0xe1>
movsd  -0x18(%rbp),%xmm0
movsd  0xe4e(%rip),%xmm1
ucomisd %xmm1,%xmm0
jbe    11e1 <g2jd+0xe1>
movsd  0xe44(%rip),%xmm0
ucomisd -0x18(%rbp),%xmm0
jbe    11e1 <g2jd+0xe1>
movsd  0xe39(%rip),%xmm0
movsd  %xmm0,-0x8(%rbp)
jmp    1286 <g2jd+0x186>
jmp    11e6 <g2jd+0xe6>
jmp    11eb <g2jd+0xeb>
cmpl   $0x0,-0x24(%rbp)
je     1201 <g2jd+0x101>
movl   $0x0,-0x20(%rbp)
jmp    1221 <g2jd+0x121>
mov    $0x2,%eax
sub    -0x1c(%rbp),%eax
mov    %eax,-0x34(%rbp)
mov    -0x1c(%rbp),%eax
mov    $0x4,%ecx
cltd
idiv   %ecx
mov    %eax,%ecx
mov    -0x34(%rbp),%eax
add    %ecx,%eax
mov    %eax,-0x20(%rbp)
mov    -0xc(%rbp),%eax
add    $0x126c,%eax
cvtsi2sd %eax,%xmm1
movsd  0xdf3(%rip),%xmm0
mulsd  %xmm1,%xmm0
cvttsd2si %xmm0,%eax
mov    -0x10(%rbp),%ecx
add    $0x1,%ecx
cvtsi2sd %ecx,%xmm1
movsd  0xdd1(%rip),%xmm0
mulsd  %xmm1,%xmm0
cvttsd2si %xmm0,%ecx
add    %ecx,%eax
cvtsi2sd %eax,%xmm0
addsd  -0x18(%rbp),%xmm0
cvtsi2sdl -0x20(%rbp),%xmm1
addsd  %xmm1,%xmm0
movsd  0xda5(%rip),%xmm1
subsd  %xmm1,%xmm0
movsd  %xmm0,-0x30(%rbp)
movsd  -0x30(%rbp),%xmm0
movsd  %xmm0,-0x8(%rbp)
movsd  -0x8(%rbp),%xmm0
pop    %rbp
ret

x86 assembly (clang, -O2):
<g2jd>:
lea    0xc(%rsi),%eax
xor    %ecx,%ecx
cmp    $0x3,%esi
setl   %cl
cmovge %esi,%eax
sub    %ecx,%edi
movslq %edi,%rdx
imul   $0xffffffffae147ae1,%rdx,%rcx
mov    %rcx,%rsi
shr    $0x3f,%rsi
sar    $0x25,%rcx
add    %esi,%ecx
xorpd  %xmm2,%xmm2
cmp    $0x62e,%edx
jl     1194 <g2jd+0x94>
jne    117b <g2jd+0x7b>
movsd  0xec3(%rip),%xmm1
ucomisd %xmm0,%xmm1
jbe    115b <g2jd+0x5b>
ucomisd 0xec5(%rip),%xmm0
jbe    115b <g2jd+0x5b>
cmp    $0xa,%eax
jne    115b <g2jd+0x5b>
movsd  0xeae(%rip),%xmm0
ret
cmp    $0xa,%eax
sete   %sil
movsd  0xea6(%rip),%xmm1
ucomisd %xmm0,%xmm1
setae  %dl
cmp    $0xa,%eax
jl     1194 <g2jd+0x94>
and    %sil,%dl
jne    1194 <g2jd+0x94>
mov    %edi,%edx
imul   $0x51eb851f,%rdx,%rdx
shr    $0x27,%rdx
add    %edx,%ecx
add    $0x2,%ecx
xorps  %xmm2,%xmm2
cvtsi2sd %ecx,%xmm2
movd   %eax,%xmm1
movd   %edi,%xmm3
punpckldq %xmm1,%xmm3
paddd  0xe78(%rip),%xmm3
cvtdq2pd %xmm3,%xmm1
mulpd  0xe7c(%rip),%xmm1
cvttpd2dq %xmm1,%xmm1
pshufd $0x55,%xmm1,%xmm3
paddd  %xmm1,%xmm3
movd   %xmm3,%eax
xorps  %xmm1,%xmm1
cvtsi2sd %eax,%xmm1
addsd  %xmm0,%xmm1
addsd  %xmm2,%xmm1
addsd  0xe3c(%rip),%xmm1
movapd %xmm1,%xmm0
ret

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

LLVM IR (-O2):
define double @g2jd(i32 %0, i32 %1, double %2) {
%4 = icmp slt i32 %1, 3
%5 = add nsw i32 %1, 12
%6 = select i1 %4, i32 %5, i32 %1
%7 = sext i1 %4 to i32
%8 = add nsw i32 %7, %0
%9 = sdiv i32 %8, -100
%10 = icmp slt i32 %8, 1582
br i1 %10, label %29, label %11
11: ; preds = %3
%12 = icmp eq i32 %8, 1582
br i1 %12, label %13, label %24
13: ; preds = %11
%14 = icmp eq i32 %6, 10
%15 = fcmp ogt double %2, 5.000000e+00
%16 = and i1 %15, %14
%17 = fcmp olt double %2, 1.500000e+01
%18 = and i1 %17, %16
br i1 %18, label %44, label %19
19: ; preds = %13
%20 = fcmp ole double %2, 5.000000e+00
%21 = and i1 %20, %14
%22 = icmp slt i32 %6, 10
%23 = or i1 %22, %21
br i1 %23, label %29, label %24
24: ; preds = %11, %19
%25 = add nsw i32 %9, 2
%26 = udiv i32 %8, 400
%27 = add nsw i32 %25, %26
%28 = sitofp i32 %27 to double
br label %29
29: ; preds = %3, %19, %24
%30 = phi double [ %28, %24 ], [ 0.000000e+00, %19 ], [ 0.000000e+00, %3 ]
%31 = insertelement <2 x i32> poison, i32 %8, i64 0
%32 = insertelement <2 x i32> %31, i32 %6, i64 1
%33 = add nsw <2 x i32> %32, <i32 4716, i32 1>
%34 = sitofp <2 x i32> %33 to <2 x double>
%35 = fmul <2 x double> %34, <double 3.652500e+02, double 3.060010e+01>
%36 = fptosi <2 x double> %35 to <2 x i32>
%37 = shufflevector <2 x i32> %36, <2 x i32> poison, <2 x i32> <i32 1, i32 undef>
%38 = add nsw <2 x i32> %37, %36
%39 = extractelement <2 x i32> %38, i64 0
%40 = sitofp i32 %39 to double
%41 = fadd double %40, %2
%42 = fadd double %41, %30
%43 = fadd double %42, -1.524500e+03
br label %44
44: ; preds = %13, %29
%45 = phi double [ %43, %29 ], [ 0x41418A8C40000000, %13 ]
ret double %45
}