short int juliad(year, mon, day)
short year;
short mon;
short day;
{
  static short nrofdays[13] = {0,   0,   31,  59,  90,  120, 151,
                               181, 212, 243, 273, 304, 334};
  if ((mon >= 3) && (!(year % 4)))
    return (day + nrofdays[mon] + 1);
  else
    return (day + nrofdays[mon]);
}


x86 assembly (clang, -O0):
<juliad>:
push   %rbp
mov    %rsp,%rbp
mov    %edx,%eax
mov    %di,%dx
mov    %si,%cx
mov    %dx,-0x4(%rbp)
mov    %cx,-0x6(%rbp)
mov    %ax,-0x8(%rbp)
movswl -0x6(%rbp),%eax
cmp    $0x3,%eax
jl     115c <juliad+0x5c>
movswl -0x4(%rbp),%eax
mov    $0x4,%ecx
cltd
idiv   %ecx
cmp    $0x0,%edx
jne    115c <juliad+0x5c>
movswl -0x8(%rbp),%eax
movswq -0x6(%rbp),%rdx
lea    0x2ee6(%rip),%rcx
movswl (%rcx,%rdx,2),%ecx
add    %ecx,%eax
add    $0x1,%eax
mov    %ax,-0x2(%rbp)
jmp    1176 <juliad+0x76>
movswl -0x8(%rbp),%eax
movswq -0x6(%rbp),%rdx
lea    0x2ec4(%rip),%rcx
movswl (%rcx,%rdx,2),%ecx
add    %ecx,%eax
mov    %ax,-0x2(%rbp)
movswl -0x2(%rbp),%eax
pop    %rbp
ret

x86 assembly (clang, -O2):
<juliad>:
mov    %edx,%eax
test   $0x3,%dil
jne    1120 <juliad+0x20>
cmp    $0x3,%si
jl     1120 <juliad+0x20>
movzwl %si,%ecx
lea    0xee8(%rip),%rdx
add    (%rdx,%rcx,2),%ax
add    $0x1,%eax
ret
movswq %si,%rcx
lea    0xed5(%rip),%rdx
add    (%rdx,%rcx,2),%ax
ret

LLVM IR (-O0):
@juliad.nrofdays = internal global [13 x i16] [i16 0, i16 0, i16 31, i16 59, i16 90, i16 120, i16 151, i16 181, i16 212, i16 243, i16 273, i16 304, i16 334]
define signext i16 @juliad(i32 %0, i32 %1, i32 %2) {
%4 = alloca i16
%5 = alloca i16
%6 = alloca i16
%7 = alloca i16
%8 = trunc i32 %0 to i16
%9 = trunc i32 %1 to i16
%10 = trunc i32 %2 to i16
store i16 %8, i16* %5
store i16 %9, i16* %6
store i16 %10, i16* %7
%11 = load i16, i16* %6
%12 = sext i16 %11 to i32
%13 = icmp sge i32 %12, 3
br i1 %13, label %14, label %30
14: ; preds = %3
%15 = load i16, i16* %5
%16 = sext i16 %15 to i32
%17 = srem i32 %16, 4
%18 = icmp ne i32 %17, 0
br i1 %18, label %30, label %19
19: ; preds = %14
%20 = load i16, i16* %7
%21 = sext i16 %20 to i32
%22 = load i16, i16* %6
%23 = sext i16 %22 to i64
%24 = getelementptr inbounds [13 x i16], [13 x i16]* @juliad.nrofdays, i64 0, i64 %23
%25 = load i16, i16* %24
%26 = sext i16 %25 to i32
%27 = add nsw i32 %21, %26
%28 = add nsw i32 %27, 1
%29 = trunc i32 %28 to i16
store i16 %29, i16* %4
br label %40
30: ; preds = %14, %3
%31 = load i16, i16* %7
%32 = sext i16 %31 to i32
%33 = load i16, i16* %6
%34 = sext i16 %33 to i64
%35 = getelementptr inbounds [13 x i16], [13 x i16]* @juliad.nrofdays, i64 0, i64 %34
%36 = load i16, i16* %35
%37 = sext i16 %36 to i32
%38 = add nsw i32 %32, %37
%39 = trunc i32 %38 to i16
store i16 %39, i16* %4
br label %40
40: ; preds = %30, %19
%41 = load i16, i16* %4
ret i16 %41
}

LLVM IR (-O2):
@juliad.nrofdays = internal unnamed_addr constant [13 x i16] [i16 0, i16 0, i16 31, i16 59, i16 90, i16 120, i16 151, i16 181, i16 212, i16 243, i16 273, i16 304, i16 334]
define signext i16 @juliad(i32 %0, i32 %1, i32 %2) {
%4 = trunc i32 %1 to i16
%5 = icmp sgt i16 %4, 2
%6 = and i32 %0, 3
%7 = icmp eq i32 %6, 0
%8 = and i1 %7, %5
br i1 %8, label %9, label %17
9: ; preds = %3
%10 = and i32 %1, 65535
%11 = zext i32 %10 to i64
%12 = getelementptr inbounds [13 x i16], [13 x i16]* @juliad.nrofdays, i64 0, i64 %11
%13 = load i16, i16* %12
%14 = trunc i32 %2 to i16
%15 = add i16 %14, 1
%16 = add i16 %15, %13
br label %23
17: ; preds = %3
%18 = sext i16 %4 to i64
%19 = getelementptr inbounds [13 x i16], [13 x i16]* @juliad.nrofdays, i64 0, i64 %18
%20 = load i16, i16* %19
%21 = trunc i32 %2 to i16
%22 = add i16 %20, %21
br label %23
23: ; preds = %17, %9
%24 = phi i16 [ %22, %17 ], [ %16, %9 ]
ret i16 %24
}