int _mjd(int year, int month, int day) {
  double mjd;
  mjd = 367.0 * year - (int)(7.0 * (year + (int)((month + 9.0) / 12.0)) / 4.0) +
        (int)(275.0 * month / 9.0) + day - 678987.0;
  return ((int)mjd);
}


x86 assembly (clang, -O0):
<_mjd>:
push   %rbp
mov    %rsp,%rbp
mov    %edi,-0x4(%rbp)
mov    %esi,-0x8(%rbp)
mov    %edx,-0xc(%rbp)
cvtsi2sdl -0x4(%rbp),%xmm0
mov    -0x4(%rbp),%eax
cvtsi2sdl -0x8(%rbp),%xmm1
movsd  0xee6(%rip),%xmm2
addsd  %xmm2,%xmm1
movsd  0xf02(%rip),%xmm2
divsd  %xmm2,%xmm1
cvttsd2si %xmm1,%ecx
add    %ecx,%eax
cvtsi2sd %eax,%xmm2
movsd  0xee4(%rip),%xmm1
mulsd  %xmm2,%xmm1
movsd  0xed0(%rip),%xmm2
divsd  %xmm2,%xmm1
cvttsd2si %xmm1,%eax
cvtsi2sd %eax,%xmm1
movq   %xmm1,%rax
movabs $0x8000000000000000,%rcx
xor    %rcx,%rax
movq   %rax,%xmm1
movsd  0xe9d(%rip),%xmm2
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
cvtsi2sdl -0x8(%rbp),%xmm2
movsd  0xe80(%rip),%xmm1
mulsd  %xmm2,%xmm1
movsd  0xe6c(%rip),%xmm2
divsd  %xmm2,%xmm1
cvttsd2si %xmm1,%eax
cvtsi2sd %eax,%xmm1
addsd  %xmm1,%xmm0
cvtsi2sdl -0xc(%rbp),%xmm1
addsd  %xmm1,%xmm0
movsd  0xe43(%rip),%xmm1
subsd  %xmm1,%xmm0
movsd  %xmm0,-0x18(%rbp)
cvttsd2si -0x18(%rbp),%eax
pop    %rbp
ret

x86 assembly (clang, -O2):
<_mjd>:
cvtsi2sd %edi,%xmm0
cvtsi2sd %esi,%xmm1
movsd  0xef0(%rip),%xmm2
movapd %xmm1,%xmm3
addsd  %xmm2,%xmm3
divsd  0xee8(%rip),%xmm3
cvttsd2si %xmm3,%eax
add    %edi,%eax
xorps  %xmm3,%xmm3
cvtsi2sd %eax,%xmm3
mulsd  0xedb(%rip),%xmm3
mulsd  0xedb(%rip),%xmm3
cvttpd2dq %xmm3,%xmm3
cvtdq2pd %xmm3,%xmm3
mulsd  0xed3(%rip),%xmm0
subsd  %xmm3,%xmm0
mulsd  0xecf(%rip),%xmm1
divsd  %xmm2,%xmm1
cvttpd2dq %xmm1,%xmm1
cvtdq2pd %xmm1,%xmm1
addsd  %xmm0,%xmm1
xorps  %xmm0,%xmm0
cvtsi2sd %edx,%xmm0
addsd  %xmm1,%xmm0
addsd  0xeb4(%rip),%xmm0
cvttsd2si %xmm0,%eax
ret

LLVM IR (-O0):
define i32 @_mjd(i32 %0, i32 %1, i32 %2) {
%4 = alloca i32
%5 = alloca i32
%6 = alloca i32
%7 = alloca double
store i32 %0, i32* %4
store i32 %1, i32* %5
store i32 %2, i32* %6
%8 = load i32, i32* %4
%9 = sitofp i32 %8 to double
%10 = load i32, i32* %4
%11 = load i32, i32* %5
%12 = sitofp i32 %11 to double
%13 = fadd double %12, 9.000000e+00
%14 = fdiv double %13, 1.200000e+01
%15 = fptosi double %14 to i32
%16 = add nsw i32 %10, %15
%17 = sitofp i32 %16 to double
%18 = fmul double 7.000000e+00, %17
%19 = fdiv double %18, 4.000000e+00
%20 = fptosi double %19 to i32
%21 = sitofp i32 %20 to double
%22 = fneg double %21
%23 = call double @llvm.fmuladd.f64(double 3.670000e+02, double %9, double %22)
%24 = load i32, i32* %5
%25 = sitofp i32 %24 to double
%26 = fmul double 2.750000e+02, %25
%27 = fdiv double %26, 9.000000e+00
%28 = fptosi double %27 to i32
%29 = sitofp i32 %28 to double
%30 = fadd double %23, %29
%31 = load i32, i32* %6
%32 = sitofp i32 %31 to double
%33 = fadd double %30, %32
%34 = fsub double %33, 6.789870e+05
store double %34, double* %7
%35 = load double, double* %7
%36 = fptosi double %35 to i32
ret i32 %36
}

LLVM IR (-O2):
define i32 @_mjd(i32 %0, i32 %1, i32 %2) {
%4 = sitofp i32 %0 to double
%5 = sitofp i32 %1 to double
%6 = fadd double %5, 9.000000e+00
%7 = fdiv double %6, 1.200000e+01
%8 = fptosi double %7 to i32
%9 = add nsw i32 %8, %0
%10 = sitofp i32 %9 to double
%11 = fmul double %10, 7.000000e+00
%12 = fmul double %11, 2.500000e-01
%13 = fptosi double %12 to i32
%14 = sitofp i32 %13 to double
%15 = fneg double %14
%16 = tail call double @llvm.fmuladd.f64(double %4, double 3.670000e+02, double %15)
%17 = fmul double %5, 2.750000e+02
%18 = fdiv double %17, 9.000000e+00
%19 = fptosi double %18 to i32
%20 = sitofp i32 %19 to double
%21 = fadd double %16, %20
%22 = sitofp i32 %2 to double
%23 = fadd double %21, %22
%24 = fadd double %23, -6.789870e+05
%25 = fptosi double %24 to i32
ret i32 %25
}