double etstart(int yr, int mh, int dy, double ut, double tl) {
  int M[] = {0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334};
  float day;
  day = (float)(yr * 365 + M[mh - 1] + dy + yr / 4 - 730500) - 0.5 + ut / 24 +
        tl / 86400;
  if ((yr % 4) == 0 && mh <= 2) {
    day--;
  }
  return (day / 36525.0);
}


x86 assembly (clang, -O0):
<etstart>:
push   %rbp
mov    %rsp,%rbp
sub    $0x60,%rsp
mov    %edi,-0x4(%rbp)
mov    %esi,-0x8(%rbp)
mov    %edx,-0xc(%rbp)
movsd  %xmm0,-0x18(%rbp)
movsd  %xmm1,-0x20(%rbp)
lea    -0x50(%rbp),%rdi
lea    0xefa(%rip),%rsi
mov    $0x30,%edx
call   1030 <memcpy@plt>
imul   $0x16d,-0x4(%rbp),%eax
mov    -0x8(%rbp),%ecx
sub    $0x1,%ecx
movslq %ecx,%rcx
add    -0x50(%rbp,%rcx,4),%eax
add    -0xc(%rbp),%eax
mov    %eax,-0x58(%rbp)
mov    -0x4(%rbp),%eax
mov    $0x4,%ecx
cltd
idiv   %ecx
mov    %eax,%ecx
mov    -0x58(%rbp),%eax
add    %ecx,%eax
sub    $0xb2584,%eax
cvtsi2ss %eax,%xmm0
cvtss2sd %xmm0,%xmm0
movsd  0xe8f(%rip),%xmm1
subsd  %xmm1,%xmm0
movsd  -0x18(%rbp),%xmm1
movsd  0xe76(%rip),%xmm2
divsd  %xmm2,%xmm1
addsd  %xmm1,%xmm0
movsd  -0x20(%rbp),%xmm1
movsd  0xe59(%rip),%xmm2
divsd  %xmm2,%xmm1
addsd  %xmm1,%xmm0
cvtsd2ss %xmm0,%xmm0
movss  %xmm0,-0x54(%rbp)
mov    -0x4(%rbp),%eax
mov    $0x4,%ecx
cltd
idiv   %ecx
cmp    $0x0,%edx
jne    11e8 <etstart+0xd8>
cmpl   $0x2,-0x8(%rbp)
jg     11e8 <etstart+0xd8>
movss  0xe42(%rip),%xmm0
addss  -0x54(%rbp),%xmm0
movss  %xmm0,-0x54(%rbp)
movss  -0x54(%rbp),%xmm0
cvtss2sd %xmm0,%xmm0
movsd  0xe1f(%rip),%xmm1
divsd  %xmm1,%xmm0
add    $0x60,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<etstart>:
imul   $0x16d,%edi,%ecx
movslq %esi,%r9
lea    0xf20(%rip),%r8
lea    0x3(%rdi),%esi
test   %edi,%edi
cmovns %edi,%esi
mov    -0x4(%r8,%r9,4),%eax
sar    $0x2,%esi
add    %ecx,%esi
add    %edx,%esi
add    %esi,%eax
add    $0xfff4da7c,%eax
cvtsi2ss %eax,%xmm2
cvtss2sd %xmm2,%xmm2
addsd  0xec5(%rip),%xmm2
unpcklpd %xmm0,%xmm1
divpd  0xec9(%rip),%xmm1
movapd %xmm1,%xmm0
unpckhpd %xmm1,%xmm0
addsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
cvtsd2ss %xmm0,%xmm0
cmp    $0x3,%r9d
jl     116c <etstart+0x6c>
movaps %xmm0,%xmm1
test   $0x3,%dil
jne    117e <etstart+0x7e>
jmp    1181 <etstart+0x81>
movss  0xeac(%rip),%xmm1
addss  %xmm0,%xmm1
test   $0x3,%dil
je     1181 <etstart+0x81>
movaps %xmm0,%xmm1
xorps  %xmm0,%xmm0
cvtss2sd %xmm1,%xmm0
divsd  0xe78(%rip),%xmm0
ret

LLVM IR (-O0):
@__const.etstart.M = [12 x i32] [i32 0, i32 31, i32 59, i32 90, i32 120, i32 151, i32 181, i32 212, i32 243, i32 273, i32 304, i32 334]
define double @etstart(i32 %0, i32 %1, i32 %2, double %3, double %4) {
%6 = alloca i32
%7 = alloca i32
%8 = alloca i32
%9 = alloca double
%10 = alloca double
%11 = alloca [12 x i32]
%12 = alloca float
store i32 %0, i32* %6
store i32 %1, i32* %7
store i32 %2, i32* %8
store double %3, double* %9
store double %4, double* %10
%13 = bitcast [12 x i32]* %11 to i8*
%14 = load i32, i32* %6
%15 = mul nsw i32 %14, 365
%16 = load i32, i32* %7
%17 = sub nsw i32 %16, 1
%18 = sext i32 %17 to i64
%19 = getelementptr inbounds [12 x i32], [12 x i32]* %11, i64 0, i64 %18
%20 = load i32, i32* %19
%21 = add nsw i32 %15, %20
%22 = load i32, i32* %8
%23 = add nsw i32 %21, %22
%24 = load i32, i32* %6
%25 = sdiv i32 %24, 4
%26 = add nsw i32 %23, %25
%27 = sub nsw i32 %26, 730500
%28 = sitofp i32 %27 to float
%29 = fpext float %28 to double
%30 = fsub double %29, 5.000000e-01
%31 = load double, double* %9
%32 = fdiv double %31, 2.400000e+01
%33 = fadd double %30, %32
%34 = load double, double* %10
%35 = fdiv double %34, 8.640000e+04
%36 = fadd double %33, %35
%37 = fptrunc double %36 to float
store float %37, float* %12
%38 = load i32, i32* %6
%39 = srem i32 %38, 4
%40 = icmp eq i32 %39, 0
br i1 %40, label %41, label %47
41: ; preds = %5
%42 = load i32, i32* %7
%43 = icmp sle i32 %42, 2
br i1 %43, label %44, label %47
44: ; preds = %41
%45 = load float, float* %12
%46 = fadd float %45, -1.000000e+00
store float %46, float* %12
br label %47
47: ; preds = %44, %41, %5
%48 = load float, float* %12
%49 = fpext float %48 to double
%50 = fdiv double %49, 3.652500e+04
ret double %50
}

LLVM IR (-O2):
@__const.etstart.M = [12 x i32] [i32 0, i32 31, i32 59, i32 90, i32 120, i32 151, i32 181, i32 212, i32 243, i32 273, i32 304, i32 334]
define double @etstart(i32 %0, i32 %1, i32 %2, double %3, double %4) {
%6 = mul nsw i32 %0, 365
%7 = add nsw i32 %1, -1
%8 = sext i32 %7 to i64
%9 = getelementptr inbounds [12 x i32], [12 x i32]* @__const.etstart.M, i64 0, i64 %8
%10 = load i32, i32* %9
%11 = sdiv i32 %0, 4
%12 = add i32 %6, -730500
%13 = add i32 %12, %11
%14 = add i32 %13, %2
%15 = add i32 %14, %10
%16 = sitofp i32 %15 to float
%17 = fpext float %16 to double
%18 = fadd double %17, -5.000000e-01
%19 = insertelement <2 x double> poison, double %4, i64 0
%20 = insertelement <2 x double> %19, double %3, i64 1
%21 = fdiv <2 x double> %20, <double 8.640000e+04, double 2.400000e+01>
%22 = extractelement <2 x double> %21, i64 1
%23 = fadd double %22, %18
%24 = extractelement <2 x double> %21, i64 0
%25 = fadd double %24, %23
%26 = fptrunc double %25 to float
%27 = and i32 %0, 3
%28 = icmp eq i32 %27, 0
%29 = icmp slt i32 %1, 3
%30 = and i1 %28, %29
%31 = fadd float %26, -1.000000e+00
%32 = select i1 %30, float %31, float %26
%33 = fpext float %32 to double
%34 = fdiv double %33, 3.652500e+04
ret double %34
}