void civil_from_days(long z, int *py, unsigned *pm, unsigned *pd) {
  int y;
  unsigned m;
  unsigned d;
  z += 719468;
  const long era = (z >= 0 ? z : z - 146096) / 146097;
  const unsigned doe = (z - era * 146097);
  const unsigned yoe = (doe - doe / 1460 + doe / 36524 - doe / 146096) / 365;
  y = ((long)yoe) + era * 400;
  const unsigned doy = doe - (365 * yoe + yoe / 4 - yoe / 100);
  const unsigned mp = (5 * doy + 2) / 153;
  d = doy - (153 * mp + 2) / 5 + 1;
  m = mp + (mp < 10 ? 3 : -9);
  y += (m <= 2);
  --m;
  if (py)
    *py = y;
  if (pm)
    *pm = m;
  if (pd)
    *pd = d;
}


x86 assembly (clang, -O0):
<civil_from_days>:
push   %rbp
mov    %rsp,%rbp
mov    %rdi,-0x8(%rbp)
mov    %rsi,-0x10(%rbp)
mov    %rdx,-0x18(%rbp)
mov    %rcx,-0x20(%rbp)
mov    -0x8(%rbp),%rax
add    $0xafa6c,%rax
mov    %rax,-0x8(%rbp)
cmpq   $0x0,-0x8(%rbp)
jl     113a <civil_from_days+0x3a>
mov    -0x8(%rbp),%rax
mov    %rax,-0x50(%rbp)
jmp    1148 <civil_from_days+0x48>
mov    -0x8(%rbp),%rax
sub    $0x23ab0,%rax
mov    %rax,-0x50(%rbp)
mov    -0x50(%rbp),%rax
mov    $0x23ab1,%ecx
cqto
idiv   %rcx
mov    %rax,-0x38(%rbp)
mov    -0x8(%rbp),%rax
imul   $0x23ab1,-0x38(%rbp),%rcx
sub    %rcx,%rax
mov    %eax,-0x3c(%rbp)
mov    -0x3c(%rbp),%eax
mov    %eax,-0x64(%rbp)
mov    -0x3c(%rbp),%eax
mov    $0x5b4,%ecx
xor    %edx,%edx
div    %ecx
mov    %eax,%ecx
mov    -0x64(%rbp),%eax
sub    %ecx,%eax
mov    %eax,-0x60(%rbp)
mov    -0x3c(%rbp),%eax
mov    $0x8eac,%ecx
xor    %edx,%edx
div    %ecx
mov    %eax,%ecx
mov    -0x60(%rbp),%eax
add    %ecx,%eax
mov    %eax,-0x5c(%rbp)
mov    -0x3c(%rbp),%eax
mov    $0x23ab0,%ecx
xor    %edx,%edx
div    %ecx
mov    %eax,%ecx
mov    -0x5c(%rbp),%eax
sub    %ecx,%eax
mov    $0x16d,%ecx
xor    %edx,%edx
div    %ecx
mov    %eax,-0x40(%rbp)
mov    -0x40(%rbp),%eax
imul   $0x190,-0x38(%rbp),%rcx
add    %rcx,%rax
mov    %eax,-0x24(%rbp)
mov    -0x3c(%rbp),%eax
mov    %eax,-0x58(%rbp)
imul   $0x16d,-0x40(%rbp),%ecx
mov    -0x40(%rbp),%eax
shr    $0x2,%eax
add    %eax,%ecx
mov    -0x40(%rbp),%eax
mov    $0x64,%esi
xor    %edx,%edx
div    %esi
mov    %eax,%edx
mov    -0x58(%rbp),%eax
sub    %edx,%ecx
sub    %ecx,%eax
mov    %eax,-0x44(%rbp)
imul   $0x5,-0x44(%rbp),%eax
add    $0x2,%eax
mov    $0x99,%ecx
xor    %edx,%edx
div    %ecx
mov    %eax,-0x48(%rbp)
mov    -0x44(%rbp),%eax
mov    %eax,-0x54(%rbp)
imul   $0x99,-0x48(%rbp),%eax
add    $0x2,%eax
mov    $0x5,%ecx
xor    %edx,%edx
div    %ecx
mov    %eax,%ecx
mov    -0x54(%rbp),%eax
sub    %ecx,%eax
add    $0x1,%eax
mov    %eax,-0x2c(%rbp)
mov    -0x48(%rbp),%eax
mov    -0x48(%rbp),%esi
mov    $0xfffffff7,%ecx
mov    $0x3,%edx
cmp    $0xa,%esi
cmovb  %edx,%ecx
add    %ecx,%eax
mov    %eax,-0x28(%rbp)
cmpl   $0x2,-0x28(%rbp)
setbe  %al
and    $0x1,%al
movzbl %al,%eax
add    -0x24(%rbp),%eax
mov    %eax,-0x24(%rbp)
mov    -0x28(%rbp),%eax
add    $0xffffffff,%eax
mov    %eax,-0x28(%rbp)
cmpq   $0x0,-0x10(%rbp)
je     127e <civil_from_days+0x17e>
mov    -0x24(%rbp),%ecx
mov    -0x10(%rbp),%rax
mov    %ecx,(%rax)
cmpq   $0x0,-0x18(%rbp)
je     1292 <civil_from_days+0x192>
mov    -0x28(%rbp),%ecx
mov    -0x18(%rbp),%rax
mov    %ecx,(%rax)
cmpq   $0x0,-0x20(%rbp)
je     12a6 <civil_from_days+0x1a6>
mov    -0x2c(%rbp),%ecx
mov    -0x20(%rbp),%rax
mov    %ecx,(%rax)
pop    %rbp
ret

x86 assembly (clang, -O2):
<civil_from_days>:
push   %rbx
mov    %rdx,%r8
lea    0xafa6c(%rdi),%r9
lea    0x8bfbc(%rdi),%rax
cmp    $0xfffffffffff50594,%rdi
cmovge %r9,%rax
movabs $0x396b06bcc8f862ed,%rdx
06 6b 39
imul   %rdx
mov    %rdx,%rax
shr    $0x3f,%rax
sar    $0xf,%rdx
add    %rax,%rdx
imul   $0xfffdc54f,%edx,%eax
add    %eax,%r9d
mov    %r9d,%eax
shr    $0x2,%eax
imul   $0x59c67cd9,%rax,%r10
shr    $0x27,%r10
imul   $0x396b207f,%rax,%rax
shr    $0x2b,%rax
mov    %r9d,%edi
shr    $0x4,%edi
imul   $0x72d641,%rdi,%rdi
shr    $0x24,%rdi
add    %r9d,%eax
add    %r10d,%edi
sub    %edi,%eax
imul   $0x6719f361,%rax,%r10
shr    $0x20,%r10
mov    %eax,%r11d
mov    $0xe5d32b1f,%ebx
imul   %rax,%rbx
mov    %eax,%edi
sub    %r10d,%edi
shr    %edi
add    %r10d,%edi
shr    $0x8,%edi
shr    $0x2,%r11d
imul   $0x59c67cd9,%r11,%rax
shr    $0x27,%rax
shr    $0x2f,%rbx
imul   $0xfffffe93,%edi,%r10d
sub    %eax,%r9d
add    %ebx,%r9d
add    %r10d,%r9d
lea    (%r9,%r9,4),%ebx
add    $0x2,%ebx
mov    $0xd62b80d7,%eax
imul   %rbx,%rax
shr    $0x27,%rax
lea    -0x9(%rax),%r11d
lea    0x3(%rax),%r10d
cmp    $0x5fa,%ebx
cmovae %r11d,%r10d
test   %rsi,%rsi
je     11f9 <civil_from_days+0xf9>
imul   $0x190,%edx,%edx
add    %edx,%edi
cmp    $0x3,%r10d
adc    $0x0,%edi
mov    %edi,(%rsi)
test   %r8,%r8
je     1205 <civil_from_days+0x105>
add    $0xffffffff,%r10d
mov    %r10d,(%r8)
test   %rcx,%rcx
je     122a <civil_from_days+0x12a>
imul   $0x99,%eax,%eax
add    $0x2,%eax
mov    $0xcccccccd,%edx
imul   %rax,%rdx
shr    $0x22,%rdx
sub    %edx,%r9d
add    $0x1,%r9d
mov    %r9d,(%rcx)
pop    %rbx
ret

LLVM IR (-O0):
define void @civil_from_days(i64 %0, i32* %1, i32* %2, i32* %3) {
%5 = alloca i64
%6 = alloca i32*
%7 = alloca i32*
%8 = alloca i32*
%9 = alloca i32
%10 = alloca i32
%11 = alloca i32
%12 = alloca i64
%13 = alloca i32
%14 = alloca i32
%15 = alloca i32
%16 = alloca i32
store i64 %0, i64* %5
store i32* %1, i32** %6
store i32* %2, i32** %7
store i32* %3, i32** %8
%17 = load i64, i64* %5
%18 = add nsw i64 %17, 719468
store i64 %18, i64* %5
%19 = load i64, i64* %5
%20 = icmp sge i64 %19, 0
br i1 %20, label %21, label %23
21: ; preds = %4
%22 = load i64, i64* %5
br label %26
23: ; preds = %4
%24 = load i64, i64* %5
%25 = sub nsw i64 %24, 146096
br label %26
26: ; preds = %23, %21
%27 = phi i64 [ %22, %21 ], [ %25, %23 ]
%28 = sdiv i64 %27, 146097
store i64 %28, i64* %12
%29 = load i64, i64* %5
%30 = load i64, i64* %12
%31 = mul nsw i64 %30, 146097
%32 = sub nsw i64 %29, %31
%33 = trunc i64 %32 to i32
store i32 %33, i32* %13
%34 = load i32, i32* %13
%35 = load i32, i32* %13
%36 = udiv i32 %35, 1460
%37 = sub i32 %34, %36
%38 = load i32, i32* %13
%39 = udiv i32 %38, 36524
%40 = add i32 %37, %39
%41 = load i32, i32* %13
%42 = udiv i32 %41, 146096
%43 = sub i32 %40, %42
%44 = udiv i32 %43, 365
store i32 %44, i32* %14
%45 = load i32, i32* %14
%46 = zext i32 %45 to i64
%47 = load i64, i64* %12
%48 = mul nsw i64 %47, 400
%49 = add nsw i64 %46, %48
%50 = trunc i64 %49 to i32
store i32 %50, i32* %9
%51 = load i32, i32* %13
%52 = load i32, i32* %14
%53 = mul i32 365, %52
%54 = load i32, i32* %14
%55 = udiv i32 %54, 4
%56 = add i32 %53, %55
%57 = load i32, i32* %14
%58 = udiv i32 %57, 100
%59 = sub i32 %56, %58
%60 = sub i32 %51, %59
store i32 %60, i32* %15
%61 = load i32, i32* %15
%62 = mul i32 5, %61
%63 = add i32 %62, 2
%64 = udiv i32 %63, 153
store i32 %64, i32* %16
%65 = load i32, i32* %15
%66 = load i32, i32* %16
%67 = mul i32 153, %66
%68 = add i32 %67, 2
%69 = udiv i32 %68, 5
%70 = sub i32 %65, %69
%71 = add i32 %70, 1
store i32 %71, i32* %11
%72 = load i32, i32* %16
%73 = load i32, i32* %16
%74 = icmp ult i32 %73, 10
%75 = zext i1 %74 to i64
%76 = select i1 %74, i32 3, i32 -9
%77 = add i32 %72, %76
store i32 %77, i32* %10
%78 = load i32, i32* %10
%79 = icmp ule i32 %78, 2
%80 = zext i1 %79 to i32
%81 = load i32, i32* %9
%82 = add nsw i32 %81, %80
store i32 %82, i32* %9
%83 = load i32, i32* %10
%84 = add i32 %83, -1
store i32 %84, i32* %10
%85 = load i32*, i32** %6
%86 = icmp ne i32* %85, null
br i1 %86, label %87, label %90
87: ; preds = %26
%88 = load i32, i32* %9
%89 = load i32*, i32** %6
store i32 %88, i32* %89
br label %90
90: ; preds = %87, %26
%91 = load i32*, i32** %7
%92 = icmp ne i32* %91, null
br i1 %92, label %93, label %96
93: ; preds = %90
%94 = load i32, i32* %10
%95 = load i32*, i32** %7
store i32 %94, i32* %95
br label %96
96: ; preds = %93, %90
%97 = load i32*, i32** %8
%98 = icmp ne i32* %97, null
br i1 %98, label %99, label %102
99: ; preds = %96
%100 = load i32, i32* %11
%101 = load i32*, i32** %8
store i32 %100, i32* %101
br label %102
102: ; preds = %99, %96
ret void
}

LLVM IR (-O2):
define void @civil_from_days(i64 %0, i32* writeonly %1, i32* writeonly %2, i32* writeonly %3) {
%5 = add nsw i64 %0, 719468
%6 = icmp sgt i64 %0, -719469
%7 = add nsw i64 %0, 573372
%8 = select i1 %6, i64 %5, i64 %7
%9 = sdiv i64 %8, 146097
%10 = mul nsw i64 %9, -146097
%11 = add i64 %10, %5
%12 = trunc i64 %11 to i32
%13 = udiv i32 %12, 1460
%14 = udiv i32 %12, 36524
%15 = udiv i32 %12, 146096
%16 = add i32 %14, %12
%17 = add nuw nsw i32 %15, %13
%18 = sub i32 %16, %17
%19 = udiv i32 %18, 365
%20 = udiv i32 %18, 1460
%21 = udiv i32 %18, 36500
%22 = mul i32 %19, -365
%23 = sub i32 %12, %20
%24 = add i32 %23, %21
%25 = add i32 %24, %22
%26 = mul i32 %25, 5
%27 = add i32 %26, 2
%28 = udiv i32 %27, 153
%29 = mul nuw i32 %28, 153
%30 = add nuw i32 %29, 2
%31 = udiv i32 %30, 5
%32 = add i32 %25, 1
%33 = sub i32 %32, %31
%34 = icmp ult i32 %27, 1530
%35 = select i1 %34, i32 3, i32 -9
%36 = add nsw i32 %35, %28
%37 = add nsw i32 %36, -1
%38 = icmp eq i32* %1, null
br i1 %38, label %46, label %39
39: ; preds = %4
%40 = trunc i64 %9 to i32
%41 = mul i32 %40, 400
%42 = add i32 %19, %41
%43 = icmp ult i32 %36, 3
%44 = zext i1 %43 to i32
%45 = add nsw i32 %42, %44
store i32 %45, i32* %1
br label %46
46: ; preds = %39, %4
%47 = icmp eq i32* %2, null
br i1 %47, label %49, label %48
48: ; preds = %46
store i32 %37, i32* %2
br label %49
49: ; preds = %48, %46
%50 = icmp eq i32* %3, null
br i1 %50, label %52, label %51
51: ; preds = %49
store i32 %33, i32* %3
br label %52
52: ; preds = %51, %49
ret void
}