[Python-Dev] Memory size overflows
Gerald S. Williams
gsw@agere.com
Thu, 17 Oct 2002 10:07:12 -0400
Here's a version of my previous algorithm with the checks added
back in to improve overall performance. This one runs about as
fast as the divide-and-compare algorithm for my test cases. :-)
OK, I'm done tweaking now...
#define FULL_BITS (sizeof(size_t) * 8U)
#define TOP_BIT (((size_t)1) << ((FULL_BITS)-1))
#define HALF_BITS (sizeof(size_t) * 4U)
#define MID_BIT (((size_t)1) << ((HALF_BITS)-1))
#define LO_MASK ((((size_t)1) << (HALF_BITS))-1)
#define HI_MASK (~(LO_MASK))
#define SAFE_MULTIPLY(dest,src1,src2,on_overflow)\
{\
size_t _x = src1;\
size_t _y = src2;\
size_t _dest = _x * _y;\
\
dest = _dest;\
\
if ((_x | _y) & HI_MASK)\
{\
size_t h;\
int hlog;\
size_t l;\
int llog;\
size_t mask;\
\
if (_x >= _y)\
{\
h = _x;\
l = _y;\
}\
else\
{\
h = _y;\
l = _x;\
}\
\
if ((h & HI_MASK) && (l))\
{\
if (l & HI_MASK)\
{\
hlog = llog = FULL_BITS;\
}\
else\
{\
for ((mask=TOP_BIT),(hlog=FULL_BITS-1);!(mask&h);mask>>=1)\
{\
--hlog;\
}\
for ((mask=MID_BIT),(llog=HALF_BITS-1);!(mask&l);mask>>=1)\
{\
--llog;\
}\
}\
if ((hlog + llog > FULL_BITS - 1) ||\
((hlog + llog == FULL_BITS - 1) && !(_dest & TOP_BIT)))\
{\
on_overflow;\
}\
}\
}\
}
-Jerry