#define NULL ((void *)0)
typedef unsigned long size_t; // Customize by platform.
typedef long intptr_t;
typedef unsigned long uintptr_t;
typedef long scalar_t__; // Either arithmetic or pointer type.
/* By default, we understand bool (as a convenience). */
typedef int bool;
#define false 0
#define true 1

/* Forward declarations */

/* Type definitions */
typedef int /*<<< orphan*/ time_t;
struct tm {
  long tm_mon;
  long tm_year;
  int tm_mday;
  int tm_hour;
  int tm_min;
  int tm_sec;
  int tm_isdst;
};

/* Variables and functions */
int /*<<< orphan*/ mktime(struct tm *);
extern time_t JDtoDate(double jd, struct tm *event_date) {
  long a, a1, z, b, c, d, e;
  double f, day;
  jd += 0.5;
  z = (long)jd;
  f = jd - z;
  if (z < 2299161) {
    a = z;
  } else {
    a1 = (long)((z - 1867216.25) / 36524.25);
    a = z + 1 + a1 - (long)(a1 / 4);
  }
  b = a + 1524;
  c = (long)((b - 122.1) / 365.25);
  d = (long)(365.25 * c);
  e = (long)((b - d) / 30.6001);
  day = b - d - (long)(30.6001 * e) + f;
  if (e < 14) {
    event_date->tm_mon = (e - 1) - 1;
  } else {
    event_date->tm_mon = (e - 13) - 1;
  }
  if (event_date->tm_mon > (2 - 1)) {
    event_date->tm_year = c - 4716 - 1900;
  } else {
    event_date->tm_year = c - 4715 - 1900;
  }
  event_date->tm_mday = (int)day;
  day -= event_date->tm_mday;
  day *= 24;
  event_date->tm_hour = (int)day;
  day -= event_date->tm_hour;
  day *= 60;
  event_date->tm_min = (int)day;
  day -= event_date->tm_min;
  day *= 60;
  event_date->tm_sec = (int)day;
  event_date->tm_isdst = -1;
  return mktime(event_date);
}


x86 assembly (clang, -O0):
<JDtoDate>:
push   %rbp
mov    %rsp,%rbp
sub    $0x60,%rsp
movsd  %xmm0,-0x8(%rbp)
mov    %rdi,-0x10(%rbp)
movsd  0xed7(%rip),%xmm0
addsd  -0x8(%rbp),%xmm0
movsd  %xmm0,-0x8(%rbp)
cvttsd2si -0x8(%rbp),%rax
mov    %rax,-0x28(%rbp)
movsd  -0x8(%rbp),%xmm0
cvtsi2sdq -0x28(%rbp),%xmm1
subsd  %xmm1,%xmm0
movsd  %xmm0,-0x50(%rbp)
cmpq   $0x231519,-0x28(%rbp)
jge    116c <JDtoDate+0x5c>
mov    -0x28(%rbp),%rax
mov    %rax,-0x18(%rbp)
jmp    11bf <JDtoDate+0xaf>
cvtsi2sdq -0x28(%rbp),%xmm0
movsd  0xe96(%rip),%xmm1
subsd  %xmm1,%xmm0
movsd  0xe82(%rip),%xmm1
divsd  %xmm1,%xmm0
cvttsd2si %xmm0,%rax
mov    %rax,-0x20(%rbp)
mov    -0x28(%rbp),%rax
add    $0x1,%rax
add    -0x20(%rbp),%rax
mov    %rax,-0x60(%rbp)
mov    -0x20(%rbp),%rax
mov    $0x4,%ecx
cqto
idiv   %rcx
mov    %rax,%rcx
mov    -0x60(%rbp),%rax
sub    %rcx,%rax
mov    %rax,-0x18(%rbp)
mov    -0x18(%rbp),%rax
add    $0x5f4,%rax
mov    %rax,-0x30(%rbp)
cvtsi2sdq -0x30(%rbp),%xmm0
movsd  0xe4d(%rip),%xmm1
subsd  %xmm1,%xmm0
movsd  0xe39(%rip),%xmm1
divsd  %xmm1,%xmm0
cvttsd2si %xmm0,%rax
mov    %rax,-0x38(%rbp)
cvtsi2sdq -0x38(%rbp),%xmm1
movsd  0xe1e(%rip),%xmm0
mulsd  %xmm1,%xmm0
cvttsd2si %xmm0,%rax
mov    %rax,-0x40(%rbp)
mov    -0x30(%rbp),%rax
sub    -0x40(%rbp),%rax
cvtsi2sd %rax,%xmm0
movsd  0xdf4(%rip),%xmm1
divsd  %xmm1,%xmm0
cvttsd2si %xmm0,%rax
mov    %rax,-0x48(%rbp)
mov    -0x30(%rbp),%rax
sub    -0x40(%rbp),%rax
cvtsi2sdq -0x48(%rbp),%xmm1
movsd  0xdd1(%rip),%xmm0
mulsd  %xmm1,%xmm0
cvttsd2si %xmm0,%rcx
sub    %rcx,%rax
cvtsi2sd %rax,%xmm0
addsd  -0x50(%rbp),%xmm0
movsd  %xmm0,-0x58(%rbp)
cmpq   $0xe,-0x48(%rbp)
jge    1285 <JDtoDate+0x175>
mov    -0x48(%rbp),%rcx
sub    $0x1,%rcx
sub    $0x1,%rcx
mov    -0x10(%rbp),%rax
mov    %rcx,(%rax)
jmp    1298 <JDtoDate+0x188>
mov    -0x48(%rbp),%rcx
sub    $0xd,%rcx
sub    $0x1,%rcx
mov    -0x10(%rbp),%rax
mov    %rcx,(%rax)
mov    -0x10(%rbp),%rax
cmpq   $0x1,(%rax)
jle    12c5 <JDtoDate+0x1b5>
mov    -0x38(%rbp),%rcx
sub    $0x126c,%rcx
sub    $0x76c,%rcx
mov    -0x10(%rbp),%rax
mov    %rcx,0x8(%rax)
jmp    12df <JDtoDate+0x1cf>
mov    -0x38(%rbp),%rcx
sub    $0x126b,%rcx
sub    $0x76c,%rcx
mov    -0x10(%rbp),%rax
mov    %rcx,0x8(%rax)
cvttsd2si -0x58(%rbp),%ecx
mov    -0x10(%rbp),%rax
mov    %ecx,0x10(%rax)
mov    -0x10(%rbp),%rax
cvtsi2sdl 0x10(%rax),%xmm1
movsd  -0x58(%rbp),%xmm0
subsd  %xmm1,%xmm0
movsd  %xmm0,-0x58(%rbp)
movsd  0xd2e(%rip),%xmm0
mulsd  -0x58(%rbp),%xmm0
movsd  %xmm0,-0x58(%rbp)
cvttsd2si -0x58(%rbp),%ecx
mov    -0x10(%rbp),%rax
mov    %ecx,0x14(%rax)
mov    -0x10(%rbp),%rax
cvtsi2sdl 0x14(%rax),%xmm1
movsd  -0x58(%rbp),%xmm0
subsd  %xmm1,%xmm0
movsd  %xmm0,-0x58(%rbp)
movsd  0xcf1(%rip),%xmm0
mulsd  -0x58(%rbp),%xmm0
movsd  %xmm0,-0x58(%rbp)
cvttsd2si -0x58(%rbp),%ecx
mov    -0x10(%rbp),%rax
mov    %ecx,0x18(%rax)
mov    -0x10(%rbp),%rax
cvtsi2sdl 0x18(%rax),%xmm1
movsd  -0x58(%rbp),%xmm0
subsd  %xmm1,%xmm0
movsd  %xmm0,-0x58(%rbp)
movsd  0xcbc(%rip),%xmm0
mulsd  -0x58(%rbp),%xmm0
movsd  %xmm0,-0x58(%rbp)
cvttsd2si -0x58(%rbp),%ecx
mov    -0x10(%rbp),%rax
mov    %ecx,0x1c(%rax)
mov    -0x10(%rbp),%rax
movl   $0xffffffff,0x20(%rax)
mov    -0x10(%rbp),%rdi
call   1030 <mktime@plt>
add    $0x60,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<JDtoDate>:
addsd  0xee8(%rip),%xmm0
cvttsd2si %xmm0,%rax
cvtsi2sd %rax,%xmm1
cmp    $0x231519,%rax
jl     115c <JDtoDate+0x4c>
movsd  0xed6(%rip),%xmm2
addsd  %xmm1,%xmm2
divsd  0xed2(%rip),%xmm2
cvttsd2si %xmm2,%rcx
add    %rcx,%rax
lea    0x3(%rcx),%rdx
test   %rcx,%rcx
cmovns %rcx,%rdx
sar    $0x2,%rdx
sub    %rdx,%rax
add    $0x1,%rax
subsd  %xmm1,%xmm0
add    $0x5f4,%rax
xorps  %xmm1,%xmm1
cvtsi2sd %rax,%xmm1
addsd  0xea2(%rip),%xmm1
movsd  0xea2(%rip),%xmm2
divsd  %xmm2,%xmm1
cvttsd2si %xmm1,%rcx
xorps  %xmm1,%xmm1
cvtsi2sd %rcx,%xmm1
mulsd  %xmm2,%xmm1
cvttsd2si %xmm1,%rdx
sub    %rdx,%rax
xorps  %xmm1,%xmm1
cvtsi2sd %rax,%xmm1
movsd  0xe7d(%rip),%xmm2
divsd  %xmm2,%xmm1
cvttsd2si %xmm1,%rdx
xorps  %xmm1,%xmm1
cvtsi2sd %rdx,%xmm1
mulsd  %xmm2,%xmm1
cvttsd2si %xmm1,%rsi
sub    %rsi,%rax
xorps  %xmm1,%xmm1
cvtsi2sd %rax,%xmm1
addsd  %xmm0,%xmm1
lea    -0xe(%rdx),%rax
lea    -0x2(%rdx),%rsi
cmp    $0xe,%rdx
cmovl  %rsi,%rax
mov    %rax,(%rdi)
xor    %edx,%edx
cmp    $0x2,%rax
setge  %dl
neg    %rdx
lea    (%rcx,%rdx,1),%rax
add    $0xffffffffffffe629,%rax
cvttsd2si %xmm1,%ecx
cvttpd2dq %xmm1,%xmm0
cvtdq2pd %xmm0,%xmm0
mov    %rax,0x8(%rdi)
subsd  %xmm0,%xmm1
mulsd  0xe17(%rip),%xmm1
cvttsd2si %xmm1,%eax
cvttpd2dq %xmm1,%xmm0
mov    %ecx,0x10(%rdi)
cvtdq2pd %xmm0,%xmm0
subsd  %xmm0,%xmm1
movsd  0xe04(%rip),%xmm0
mulsd  %xmm0,%xmm1
cvttsd2si %xmm1,%ecx
mov    %eax,0x14(%rdi)
mov    %ecx,0x18(%rdi)
cvttpd2dq %xmm1,%xmm2
cvtdq2pd %xmm2,%xmm2
subsd  %xmm2,%xmm1
mulsd  %xmm0,%xmm1
cvttsd2si %xmm1,%eax
mov    %eax,0x1c(%rdi)
movl   $0xffffffff,0x20(%rdi)
jmp    1030 <mktime@plt>

LLVM IR (-O0):
%struct.tm = type { i64, i64, i32, i32, i32, i32, i32 }
define i32 @JDtoDate(double %0, %struct.tm* %1) {
%3 = alloca double
%4 = alloca %struct.tm*
%5 = alloca i64
%6 = alloca i64
%7 = alloca i64
%8 = alloca i64
%9 = alloca i64
%10 = alloca i64
%11 = alloca i64
%12 = alloca double
%13 = alloca double
store double %0, double* %3
store %struct.tm* %1, %struct.tm** %4
%14 = load double, double* %3
%15 = fadd double %14, 5.000000e-01
store double %15, double* %3
%16 = load double, double* %3
%17 = fptosi double %16 to i64
store i64 %17, i64* %7
%18 = load double, double* %3
%19 = load i64, i64* %7
%20 = sitofp i64 %19 to double
%21 = fsub double %18, %20
store double %21, double* %12
%22 = load i64, i64* %7
%23 = icmp slt i64 %22, 2299161
br i1 %23, label %24, label %26
24: ; preds = %2
%25 = load i64, i64* %7
store i64 %25, i64* %5
br label %39
26: ; preds = %2
%27 = load i64, i64* %7
%28 = sitofp i64 %27 to double
%29 = fsub double %28, 0x413C7DD040000000
%30 = fdiv double %29, 0x40E1D58800000000
%31 = fptosi double %30 to i64
store i64 %31, i64* %6
%32 = load i64, i64* %7
%33 = add nsw i64 %32, 1
%34 = load i64, i64* %6
%35 = add nsw i64 %33, %34
%36 = load i64, i64* %6
%37 = sdiv i64 %36, 4
%38 = sub nsw i64 %35, %37
store i64 %38, i64* %5
br label %39
39: ; preds = %26, %24
%40 = load i64, i64* %5
%41 = add nsw i64 %40, 1524
store i64 %41, i64* %8
%42 = load i64, i64* %8
%43 = sitofp i64 %42 to double
%44 = fsub double %43, 1.221000e+02
%45 = fdiv double %44, 3.652500e+02
%46 = fptosi double %45 to i64
store i64 %46, i64* %9
%47 = load i64, i64* %9
%48 = sitofp i64 %47 to double
%49 = fmul double 3.652500e+02, %48
%50 = fptosi double %49 to i64
store i64 %50, i64* %10
%51 = load i64, i64* %8
%52 = load i64, i64* %10
%53 = sub nsw i64 %51, %52
%54 = sitofp i64 %53 to double
%55 = fdiv double %54, 3.060010e+01
%56 = fptosi double %55 to i64
store i64 %56, i64* %11
%57 = load i64, i64* %8
%58 = load i64, i64* %10
%59 = sub nsw i64 %57, %58
%60 = load i64, i64* %11
%61 = sitofp i64 %60 to double
%62 = fmul double 3.060010e+01, %61
%63 = fptosi double %62 to i64
%64 = sub nsw i64 %59, %63
%65 = sitofp i64 %64 to double
%66 = load double, double* %12
%67 = fadd double %65, %66
store double %67, double* %13
%68 = load i64, i64* %11
%69 = icmp slt i64 %68, 14
br i1 %69, label %70, label %76
70: ; preds = %39
%71 = load i64, i64* %11
%72 = sub nsw i64 %71, 1
%73 = sub nsw i64 %72, 1
%74 = load %struct.tm*, %struct.tm** %4
%75 = getelementptr inbounds %struct.tm, %struct.tm* %74, i32 0, i32 0
store i64 %73, i64* %75
br label %82
76: ; preds = %39
%77 = load i64, i64* %11
%78 = sub nsw i64 %77, 13
%79 = sub nsw i64 %78, 1
%80 = load %struct.tm*, %struct.tm** %4
%81 = getelementptr inbounds %struct.tm, %struct.tm* %80, i32 0, i32 0
store i64 %79, i64* %81
br label %82
82: ; preds = %76, %70
%83 = load %struct.tm*, %struct.tm** %4
%84 = getelementptr inbounds %struct.tm, %struct.tm* %83, i32 0, i32 0
%85 = load i64, i64* %84
%86 = icmp sgt i64 %85, 1
br i1 %86, label %87, label %93
87: ; preds = %82
%88 = load i64, i64* %9
%89 = sub nsw i64 %88, 4716
%90 = sub nsw i64 %89, 1900
%91 = load %struct.tm*, %struct.tm** %4
%92 = getelementptr inbounds %struct.tm, %struct.tm* %91, i32 0, i32 1
store i64 %90, i64* %92
br label %99
93: ; preds = %82
%94 = load i64, i64* %9
%95 = sub nsw i64 %94, 4715
%96 = sub nsw i64 %95, 1900
%97 = load %struct.tm*, %struct.tm** %4
%98 = getelementptr inbounds %struct.tm, %struct.tm* %97, i32 0, i32 1
store i64 %96, i64* %98
br label %99
99: ; preds = %93, %87
%100 = load double, double* %13
%101 = fptosi double %100 to i32
%102 = load %struct.tm*, %struct.tm** %4
%103 = getelementptr inbounds %struct.tm, %struct.tm* %102, i32 0, i32 2
store i32 %101, i32* %103
%104 = load %struct.tm*, %struct.tm** %4
%105 = getelementptr inbounds %struct.tm, %struct.tm* %104, i32 0, i32 2
%106 = load i32, i32* %105
%107 = sitofp i32 %106 to double
%108 = load double, double* %13
%109 = fsub double %108, %107
store double %109, double* %13
%110 = load double, double* %13
%111 = fmul double %110, 2.400000e+01
store double %111, double* %13
%112 = load double, double* %13
%113 = fptosi double %112 to i32
%114 = load %struct.tm*, %struct.tm** %4
%115 = getelementptr inbounds %struct.tm, %struct.tm* %114, i32 0, i32 3
store i32 %113, i32* %115
%116 = load %struct.tm*, %struct.tm** %4
%117 = getelementptr inbounds %struct.tm, %struct.tm* %116, i32 0, i32 3
%118 = load i32, i32* %117
%119 = sitofp i32 %118 to double
%120 = load double, double* %13
%121 = fsub double %120, %119
store double %121, double* %13
%122 = load double, double* %13
%123 = fmul double %122, 6.000000e+01
store double %123, double* %13
%124 = load double, double* %13
%125 = fptosi double %124 to i32
%126 = load %struct.tm*, %struct.tm** %4
%127 = getelementptr inbounds %struct.tm, %struct.tm* %126, i32 0, i32 4
store i32 %125, i32* %127
%128 = load %struct.tm*, %struct.tm** %4
%129 = getelementptr inbounds %struct.tm, %struct.tm* %128, i32 0, i32 4
%130 = load i32, i32* %129
%131 = sitofp i32 %130 to double
%132 = load double, double* %13
%133 = fsub double %132, %131
store double %133, double* %13
%134 = load double, double* %13
%135 = fmul double %134, 6.000000e+01
store double %135, double* %13
%136 = load double, double* %13
%137 = fptosi double %136 to i32
%138 = load %struct.tm*, %struct.tm** %4
%139 = getelementptr inbounds %struct.tm, %struct.tm* %138, i32 0, i32 5
store i32 %137, i32* %139
%140 = load %struct.tm*, %struct.tm** %4
%141 = getelementptr inbounds %struct.tm, %struct.tm* %140, i32 0, i32 6
store i32 -1, i32* %141
%142 = load %struct.tm*, %struct.tm** %4
%143 = call i32 @mktime(%struct.tm* %142)
ret i32 %143
}

LLVM IR (-O2):
%struct.tm = type { i64, i64, i32, i32, i32, i32, i32 }
define i32 @JDtoDate(double %0, %struct.tm* nocapture %1) {
%3 = fadd double %0, 5.000000e-01
%4 = fptosi double %3 to i64
%5 = sitofp i64 %4 to double
%6 = icmp slt i64 %4, 2299161
br i1 %6, label %15, label %7
7: ; preds = %2
%8 = fadd double %5, 0xC13C7DD040000000
%9 = fdiv double %8, 0x40E1D58800000000
%10 = fptosi double %9 to i64
%11 = add nuw nsw i64 %4, 1
%12 = add nsw i64 %11, %10
%13 = sdiv i64 %10, -4
%14 = add i64 %12, %13
br label %15
15: ; preds = %2, %7
%16 = phi i64 [ %14, %7 ], [ %4, %2 ]
%17 = fsub double %3, %5
%18 = add nsw i64 %16, 1524
%19 = sitofp i64 %18 to double
%20 = fadd double %19, -1.221000e+02
%21 = fdiv double %20, 3.652500e+02
%22 = fptosi double %21 to i64
%23 = sitofp i64 %22 to double
%24 = fmul double %23, 3.652500e+02
%25 = fptosi double %24 to i64
%26 = sub nsw i64 %18, %25
%27 = sitofp i64 %26 to double
%28 = fdiv double %27, 3.060010e+01
%29 = fptosi double %28 to i64
%30 = sitofp i64 %29 to double
%31 = fmul double %30, 3.060010e+01
%32 = fptosi double %31 to i64
%33 = sub nsw i64 %26, %32
%34 = sitofp i64 %33 to double
%35 = fadd double %17, %34
%36 = icmp slt i64 %29, 14
%37 = select i1 %36, i64 -2, i64 -14
%38 = add nsw i64 %37, %29
%39 = getelementptr inbounds %struct.tm, %struct.tm* %1, i64 0, i32 0
store i64 %38, i64* %39
%40 = icmp sgt i64 %38, 1
%41 = select i1 %40, i64 -6616, i64 -6615
%42 = add nsw i64 %41, %22
%43 = getelementptr inbounds %struct.tm, %struct.tm* %1, i64 0, i32 1
store i64 %42, i64* %43
%44 = fptosi double %35 to i32
%45 = getelementptr inbounds %struct.tm, %struct.tm* %1, i64 0, i32 2
store i32 %44, i32* %45
%46 = sitofp i32 %44 to double
%47 = fsub double %35, %46
%48 = fmul double %47, 2.400000e+01
%49 = fptosi double %48 to i32
%50 = getelementptr inbounds %struct.tm, %struct.tm* %1, i64 0, i32 3
store i32 %49, i32* %50
%51 = sitofp i32 %49 to double
%52 = fsub double %48, %51
%53 = fmul double %52, 6.000000e+01
%54 = fptosi double %53 to i32
%55 = getelementptr inbounds %struct.tm, %struct.tm* %1, i64 0, i32 4
store i32 %54, i32* %55
%56 = sitofp i32 %54 to double
%57 = fsub double %53, %56
%58 = fmul double %57, 6.000000e+01
%59 = fptosi double %58 to i32
%60 = getelementptr inbounds %struct.tm, %struct.tm* %1, i64 0, i32 5
store i32 %59, i32* %60
%61 = getelementptr inbounds %struct.tm, %struct.tm* %1, i64 0, i32 6
store i32 -1, i32* %61
%62 = tail call i32 @mktime(%struct.tm* %1)
ret i32 %62
}