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
AreaZR committed Dec 12, 2023
1 parent 1b514e4 commit 9c46202
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 9c46202

Please sign in to comment.