@@ -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