Skip to content

Commit

Permalink
Make isleap faster
Browse files Browse the repository at this point in the history
The assembler generated is better if we compare directly instead of doing fancy ring buffer-eque logic.

Proof:
https://godbolt.org/z/dferPP9h4
  • Loading branch information
AtariDreams committed Dec 11, 2023
1 parent 9f011c6 commit 547f2d7
Showing 1 changed file with 7 additions and 4 deletions.
11 changes: 7 additions & 4 deletions CoreFoundation/NumberDate.subproj/CFDate.c
Original file line number Diff line number Diff line change
Expand Up @@ -249,10 +249,13 @@ static const uint8_t daysInMonth[16] = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 3
static const uint16_t daysBeforeMonth[16] = {INVALID_MONTH_RESULT, 0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334, 365, INVALID_MONTH_RESULT, INVALID_MONTH_RESULT};
static const uint16_t daysAfterMonth[16] = {365, 334, 306, 275, 245, 214, 184, 153, 122, 92, 61, 31, 0, 0, 0, 0};

CF_INLINE bool isleap(int64_t year) {
int64_t y = (year + 1) % 400; /* correct to nearest multiple-of-400 year, then find the remainder */
if (y < 0) y = -y;
return (0 == (y & 3) && 100 != y && 200 != y && 300 != y);
CF_INLINE bool isleap(int64_t year)
{
if (year < 0) year = -year;
if (((year & 3) == 0 && (year % 100) != 0) || ((year % 400) == 0))
return true;

return false;
}

/* year arg is absolute year; Gregorian 2001 == year 0; 2001/1/1 = absolute date 0 */
Expand Down

0 comments on commit 547f2d7

Please sign in to comment.