Skip to content

Commit 867d775

Browse files
committed
Make isleap faster
The assembler generated is better if we compare directly instead of doing fancy ring buffer-eque logic. Proof: https://godbolt.org/z/dferPP9h4
1 parent 1b514e4 commit 867d775

File tree

1 file changed

+7
-4
lines changed
  • CoreFoundation/NumberDate.subproj

1 file changed

+7
-4
lines changed

CoreFoundation/NumberDate.subproj/CFDate.c

+7-4
Original file line numberDiff line numberDiff line change
@@ -249,10 +249,13 @@ static const uint8_t daysInMonth[16] = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 3
249249
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};
250250
static const uint16_t daysAfterMonth[16] = {365, 334, 306, 275, 245, 214, 184, 153, 122, 92, 61, 31, 0, 0, 0, 0};
251251

252-
CF_INLINE bool isleap(int64_t year) {
253-
int64_t y = (year + 1) % 400; /* correct to nearest multiple-of-400 year, then find the remainder */
254-
if (y < 0) y = -y;
255-
return (0 == (y & 3) && 100 != y && 200 != y && 300 != y);
252+
CF_INLINE bool isleap(int64_t year)
253+
{
254+
if (year < 0) year = -year;
255+
if ((year & 3) != 0) return false;
256+
if (year % 400) return true;
257+
if (year % 100) return false;
258+
return true;
256259
}
257260

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

0 commit comments

Comments
 (0)