diff -r f494052eb476 Lib/test/test_long.py --- a/Lib/test/test_long.py Mon Feb 08 20:28:22 2016 +0200 +++ b/Lib/test/test_long.py Mon Feb 08 17:36:33 2016 -0500 @@ -723,6 +723,20 @@ for zero in ["huge / 0", "mhuge / 0"]: self.assertRaises(ZeroDivisionError, eval, zero, namespace) + def test_floordiv(self): + with self.assertRaises(ZeroDivisionError): + a = 1 // 0 + + self.assertEqual(2 // 3, 0) + self.assertEqual(2 // -3, -1) + self.assertEqual(-2 // 3, -1) + self.assertEqual(-2 // -3, 0) + + self.assertEqual(-11 // -3, 3) + self.assertEqual(-11 // 3, -4) + self.assertEqual(11 // -3, -4) + self.assertEqual(11 // 3, 3) + def check_truediv(self, a, b, skip_small=True): """Verify that the result of a/b is correctly rounded, by comparing it with a pure Python implementation of correctly diff -r f494052eb476 Objects/longobject.c --- a/Objects/longobject.c Mon Feb 08 20:28:22 2016 +0200 +++ b/Objects/longobject.c Mon Feb 08 17:36:33 2016 -0500 @@ -3573,6 +3573,26 @@ PyLongObject *div; CHECK_BINOP(a, b); + + if (Py_ABS(Py_SIZE(a)) == 1 && Py_ABS(Py_SIZE(b)) == 1) { + /* Fast path for single digit longs. */ + sdigit left = ((PyLongObject*)a)->ob_digit[0]; + sdigit right = ((PyLongObject*)b)->ob_digit[0]; + sdigit div; + + div = left / right; + if (Py_SIZE(a) != Py_SIZE(b)) { + /* either 'a' or 'b' is negative */ + if (left != div * right) { + /* we want floor */ + ++div; + } + div = -div; + } + + return PyLong_FromLong(div); + } + if (l_divmod((PyLongObject*)a, (PyLongObject*)b, &div, NULL) < 0) div = NULL; return (PyObject *)div;