void sgdate(int *day, int *mon, int *year, long serial) {
  int j;
  if (serial >= 59)
    serial = serial + 1;
  serial = serial + 36466;
  serial = serial * 4;
  serial = serial - 1;
  *year = serial / 1461;
  j = serial % 1461;
  if (j < 0) {
    j = j + 1461;
    *year = *year - 1;
  }
  j = j / 4;
  j = j * 5;
  j = j + 2;
  *mon = j / 153;
  *day = j % 153;
  *day = *day / 5 + 1;
  if (*mon < 10) {
    *mon = *mon + 3;
  } else {
    *mon = *mon - 9;
    *year = *year + 1;
  }
  *year = *year - 100;
  return;
}


x86 assembly (clang, -O0):
<sgdate>:
push   %rbp
mov    %rsp,%rbp
mov    %rdi,-0x8(%rbp)
mov    %rsi,-0x10(%rbp)
mov    %rdx,-0x18(%rbp)
mov    %rcx,-0x20(%rbp)
cmpq   $0x3b,-0x20(%rbp)
jl     112b <sgdate+0x2b>
mov    -0x20(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x20(%rbp)
mov    -0x20(%rbp),%rax
add    $0x8e72,%rax
mov    %rax,-0x20(%rbp)
mov    -0x20(%rbp),%rax
shl    $0x2,%rax
mov    %rax,-0x20(%rbp)
mov    -0x20(%rbp),%rax
sub    $0x1,%rax
mov    %rax,-0x20(%rbp)
mov    -0x20(%rbp),%rax
mov    $0x5b5,%ecx
cqto
idiv   %rcx
mov    %eax,%ecx
mov    -0x18(%rbp),%rax
mov    %ecx,(%rax)
mov    -0x20(%rbp),%rax
mov    $0x5b5,%ecx
cqto
idiv   %rcx
mov    %edx,%eax
mov    %eax,-0x24(%rbp)
cmpl   $0x0,-0x24(%rbp)
jge    119e <sgdate+0x9e>
mov    -0x24(%rbp),%eax
add    $0x5b5,%eax
mov    %eax,-0x24(%rbp)
mov    -0x18(%rbp),%rax
mov    (%rax),%ecx
sub    $0x1,%ecx
mov    -0x18(%rbp),%rax
mov    %ecx,(%rax)
mov    -0x24(%rbp),%eax
mov    $0x4,%ecx
cltd
idiv   %ecx
mov    %eax,-0x24(%rbp)
imul   $0x5,-0x24(%rbp),%eax
mov    %eax,-0x24(%rbp)
mov    -0x24(%rbp),%eax
add    $0x2,%eax
mov    %eax,-0x24(%rbp)
mov    -0x24(%rbp),%eax
mov    $0x99,%ecx
cltd
idiv   %ecx
mov    %eax,%ecx
mov    -0x10(%rbp),%rax
mov    %ecx,(%rax)
mov    -0x24(%rbp),%eax
mov    $0x99,%ecx
cltd
idiv   %ecx
mov    -0x8(%rbp),%rax
mov    %edx,(%rax)
mov    -0x8(%rbp),%rax
mov    (%rax),%eax
mov    $0x5,%ecx
cltd
idiv   %ecx
mov    %eax,%ecx
add    $0x1,%ecx
mov    -0x8(%rbp),%rax
mov    %ecx,(%rax)
mov    -0x10(%rbp),%rax
cmpl   $0xa,(%rax)
jge    121a <sgdate+0x11a>
mov    -0x10(%rbp),%rax
mov    (%rax),%ecx
add    $0x3,%ecx
mov    -0x10(%rbp),%rax
mov    %ecx,(%rax)
jmp    1238 <sgdate+0x138>
mov    -0x10(%rbp),%rax
mov    (%rax),%ecx
sub    $0x9,%ecx
mov    -0x10(%rbp),%rax
mov    %ecx,(%rax)
mov    -0x18(%rbp),%rax
mov    (%rax),%ecx
add    $0x1,%ecx
mov    -0x18(%rbp),%rax
mov    %ecx,(%rax)
mov    -0x18(%rbp),%rax
mov    (%rax),%ecx
sub    $0x64,%ecx
mov    -0x18(%rbp),%rax
mov    %ecx,(%rax)
pop    %rbp
ret

x86 assembly (clang, -O2):
<sgdate>:
mov    %rdx,%r8
xor    %r9d,%r9d
cmp    $0x3b,%rcx
setge  %r9b
add    %rcx,%r9
lea    0x239c7(,%r9,4),%rcx
movabs $0xb36d8397914268c9,%rdx
83 6d b3
mov    %rcx,%rax
imul   %rdx
lea    (%rdx,%r9,4),%rax
add    $0x239c7,%rax
mov    %rax,%rdx
shr    $0x3f,%rdx
shr    $0xa,%rax
add    %edx,%eax
imul   $0x5b5,%eax,%edx
sub    %edx,%ecx
mov    %ecx,%edx
sar    $0x1f,%edx
add    %eax,%edx
lea    0x5b5(%rcx),%eax
test   %ecx,%ecx
mov    %edx,(%r8)
cmovns %ecx,%eax
movzwl %ax,%eax
shr    $0x2,%eax
lea    (%rax,%rax,4),%eax
add    $0x2,%eax
movzwl %ax,%ecx
imul   $0x358b,%ecx,%ecx
shr    $0x15,%ecx
mov    %ecx,(%rsi)
imul   $0x99,%ecx,%ecx
sub    %ecx,%eax
imul   $0xcd,%eax,%eax
movzwl %ax,%eax
shr    $0xa,%eax
add    $0x1,%al
movzbl %al,%eax
mov    %eax,(%rdi)
mov    (%rsi),%eax
cmp    $0x9,%eax
jg     11a3 <sgdate+0xa3>
add    $0x3,%eax
mov    %eax,(%rsi)
mov    (%r8),%eax
jmp    11ae <sgdate+0xae>
add    $0xfffffff7,%eax
mov    %eax,(%rsi)
mov    (%r8),%eax
add    $0x1,%eax
add    $0xffffff9c,%eax
mov    %eax,(%r8)
ret

LLVM IR (-O0):
define void @sgdate(i32* %0, i32* %1, i32* %2, i64 %3) {
%5 = alloca i32*
%6 = alloca i32*
%7 = alloca i32*
%8 = alloca i64
%9 = alloca i32
store i32* %0, i32** %5
store i32* %1, i32** %6
store i32* %2, i32** %7
store i64 %3, i64* %8
%10 = load i64, i64* %8
%11 = icmp sge i64 %10, 59
br i1 %11, label %12, label %15
12: ; preds = %4
%13 = load i64, i64* %8
%14 = add nsw i64 %13, 1
store i64 %14, i64* %8
br label %15
15: ; preds = %12, %4
%16 = load i64, i64* %8
%17 = add nsw i64 %16, 36466
store i64 %17, i64* %8
%18 = load i64, i64* %8
%19 = mul nsw i64 %18, 4
store i64 %19, i64* %8
%20 = load i64, i64* %8
%21 = sub nsw i64 %20, 1
store i64 %21, i64* %8
%22 = load i64, i64* %8
%23 = sdiv i64 %22, 1461
%24 = trunc i64 %23 to i32
%25 = load i32*, i32** %7
store i32 %24, i32* %25
%26 = load i64, i64* %8
%27 = srem i64 %26, 1461
%28 = trunc i64 %27 to i32
store i32 %28, i32* %9
%29 = load i32, i32* %9
%30 = icmp slt i32 %29, 0
br i1 %30, label %31, label %38
31: ; preds = %15
%32 = load i32, i32* %9
%33 = add nsw i32 %32, 1461
store i32 %33, i32* %9
%34 = load i32*, i32** %7
%35 = load i32, i32* %34
%36 = sub nsw i32 %35, 1
%37 = load i32*, i32** %7
store i32 %36, i32* %37
br label %38
38: ; preds = %31, %15
%39 = load i32, i32* %9
%40 = sdiv i32 %39, 4
store i32 %40, i32* %9
%41 = load i32, i32* %9
%42 = mul nsw i32 %41, 5
store i32 %42, i32* %9
%43 = load i32, i32* %9
%44 = add nsw i32 %43, 2
store i32 %44, i32* %9
%45 = load i32, i32* %9
%46 = sdiv i32 %45, 153
%47 = load i32*, i32** %6
store i32 %46, i32* %47
%48 = load i32, i32* %9
%49 = srem i32 %48, 153
%50 = load i32*, i32** %5
store i32 %49, i32* %50
%51 = load i32*, i32** %5
%52 = load i32, i32* %51
%53 = sdiv i32 %52, 5
%54 = add nsw i32 %53, 1
%55 = load i32*, i32** %5
store i32 %54, i32* %55
%56 = load i32*, i32** %6
%57 = load i32, i32* %56
%58 = icmp slt i32 %57, 10
br i1 %58, label %59, label %64
59: ; preds = %38
%60 = load i32*, i32** %6
%61 = load i32, i32* %60
%62 = add nsw i32 %61, 3
%63 = load i32*, i32** %6
store i32 %62, i32* %63
br label %73
64: ; preds = %38
%65 = load i32*, i32** %6
%66 = load i32, i32* %65
%67 = sub nsw i32 %66, 9
%68 = load i32*, i32** %6
store i32 %67, i32* %68
%69 = load i32*, i32** %7
%70 = load i32, i32* %69
%71 = add nsw i32 %70, 1
%72 = load i32*, i32** %7
store i32 %71, i32* %72
br label %73
73: ; preds = %64, %59
%74 = load i32*, i32** %7
%75 = load i32, i32* %74
%76 = sub nsw i32 %75, 100
%77 = load i32*, i32** %7
store i32 %76, i32* %77
ret void
}

LLVM IR (-O2):
define void @sgdate(i32* nocapture writeonly %0, i32* nocapture %1, i32* nocapture %2, i64 %3) {
%5 = icmp sgt i64 %3, 58
%6 = zext i1 %5 to i64
%7 = add nsw i64 %6, %3
%8 = shl i64 %7, 2
%9 = add i64 %8, 145863
%10 = sdiv i64 %9, 1461
%11 = trunc i64 %10 to i32
%12 = srem i64 %9, 1461
%13 = trunc i64 %12 to i32
%14 = icmp slt i32 %13, 0
%15 = add nsw i32 %13, 1461
%16 = ashr i32 %13, 31
%17 = add nsw i32 %16, %11
%18 = select i1 %14, i32 %15, i32 %13
store i32 %17, i32* %2
%19 = trunc i32 %18 to i16
%20 = lshr i16 %19, 2
%21 = mul nuw nsw i16 %20, 5
%22 = add nuw nsw i16 %21, 2
%23 = udiv i16 %22, 153
%24 = zext i16 %23 to i32
store i32 %24, i32* %1
%25 = urem i16 %22, 153
%26 = trunc i16 %25 to i8
%27 = udiv i8 %26, 5
%28 = add nuw nsw i8 %27, 1
%29 = zext i8 %28 to i32
store i32 %29, i32* %0
%30 = load i32, i32* %1
%31 = icmp slt i32 %30, 10
br i1 %31, label %32, label %35
32: ; preds = %4
%33 = add nsw i32 %30, 3
store i32 %33, i32* %1
%34 = load i32, i32* %2
br label %39
35: ; preds = %4
%36 = add nsw i32 %30, -9
store i32 %36, i32* %1
%37 = load i32, i32* %2
%38 = add nsw i32 %37, 1
br label %39
39: ; preds = %35, %32
%40 = phi i32 [ %38, %35 ], [ %34, %32 ]
%41 = add nsw i32 %40, -100
store i32 %41, i32* %2
ret void
}