Skip to content

Commit 360fedc

Browse files
authored
bpo-46055: Streamline inner loop for right shifts (#30243)
1 parent 2e3e0d2 commit 360fedc

File tree

1 file changed

+8
-7
lines changed

1 file changed

+8
-7
lines changed

Objects/longobject.c

+8-7
Original file line numberDiff line numberDiff line change
@@ -4491,7 +4491,7 @@ long_rshift1(PyLongObject *a, Py_ssize_t wordshift, digit remshift)
44914491
{
44924492
PyLongObject *z = NULL;
44934493
Py_ssize_t newsize, hishift, i, j;
4494-
digit lomask, himask;
4494+
twodigits accum;
44954495

44964496
if (Py_SIZE(a) < 0) {
44974497
/* Right shifting negative numbers is harder */
@@ -4511,16 +4511,17 @@ long_rshift1(PyLongObject *a, Py_ssize_t wordshift, digit remshift)
45114511
if (newsize <= 0)
45124512
return PyLong_FromLong(0);
45134513
hishift = PyLong_SHIFT - remshift;
4514-
lomask = ((digit)1 << hishift) - 1;
4515-
himask = PyLong_MASK ^ lomask;
45164514
z = _PyLong_New(newsize);
45174515
if (z == NULL)
45184516
return NULL;
4519-
for (i = 0, j = wordshift; i < newsize; i++, j++) {
4520-
z->ob_digit[i] = (a->ob_digit[j] >> remshift) & lomask;
4521-
if (i+1 < newsize)
4522-
z->ob_digit[i] |= (a->ob_digit[j+1] << hishift) & himask;
4517+
j = wordshift;
4518+
accum = a->ob_digit[j++] >> remshift;
4519+
for (i = 0; j < Py_SIZE(a); i++, j++) {
4520+
accum |= (twodigits)a->ob_digit[j] << hishift;
4521+
z->ob_digit[i] = (digit)(accum & PyLong_MASK);
4522+
accum >>= PyLong_SHIFT;
45234523
}
4524+
z->ob_digit[i] = (digit)accum;
45244525
z = maybe_small_long(long_normalize(z));
45254526
}
45264527
return (PyObject *)z;

0 commit comments

Comments
 (0)