Skip to content

Commit 4cd2d70

Browse files
committed
Better tail handling
1 parent fdfc957 commit 4cd2d70

File tree

1 file changed

+9
-12
lines changed

1 file changed

+9
-12
lines changed

src/EratMedium.cpp

Lines changed: 9 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -69,9 +69,6 @@ void crossOffByResidue(Vector<SievingPrime>& primes,
6969
std::size_t state = wheelIndex & 7;
7070
ASSERT(wheelIndex >= BASE);
7171
ASSERT(wheelIndex <= BASE + 7);
72-
73-
std::size_t maxOffset = sievingPrime * 28 + MAX_OFFSET_ADD;
74-
std::size_t limit = std::max(sieveSize, maxOffset) - maxOffset;
7572
std::size_t loopDist = sievingPrime * 30 + LOOP_ADD;
7673
const uint8_t* masks = wheel30Masks[GROUP];
7774
std::size_t s0, s1, s2, s3, s4, s5, s6, s7;
@@ -108,7 +105,7 @@ void crossOffByResidue(Vector<SievingPrime>& primes,
108105

109106
// Each iteration removes the next 8
110107
// multiples of the sievingPrime.
111-
for (; i < limit; i += loopDist)
108+
for (; i + s7 < sieveSize; i += loopDist)
112109
{
113110
sieve[i + s0] &= MASK_0;
114111
sieve[i + s1] &= MASK_1;
@@ -120,14 +117,14 @@ void crossOffByResidue(Vector<SievingPrime>& primes,
120117
sieve[i + s7] &= MASK_7;
121118
}
122119

123-
// Cross off the last few multiples where i >= limit.
124-
for (;; state = (state + 1) & 7)
125-
{
126-
wheelIndex = BASE + state;
127-
CHECK_FINISHED(wheelIndex);
128-
sieve[i] &= masks[state];
129-
i += adv[state];
130-
}
120+
CHECK_FINISHED(0); sieve[i] &= MASK_0; i += adv[0];
121+
CHECK_FINISHED(1); sieve[i] &= MASK_1; i += adv[1];
122+
CHECK_FINISHED(2); sieve[i] &= MASK_2; i += adv[2];
123+
CHECK_FINISHED(3); sieve[i] &= MASK_3; i += adv[3];
124+
CHECK_FINISHED(4); sieve[i] &= MASK_4; i += adv[4];
125+
CHECK_FINISHED(5); sieve[i] &= MASK_5; i += adv[5];
126+
CHECK_FINISHED(6); sieve[i] &= MASK_6; i += adv[6];
127+
CHECK_FINISHED(7); sieve[i] &= MASK_7; i += adv[7];
131128

132129
next_iteration:;
133130
}

0 commit comments

Comments
 (0)