Conker's BFD micro-optimization with 2's cmpl. integer division

This commit is contained in:
unknown 2015-06-08 16:28:21 -04:00
parent 690bb76c47
commit bf7c98f586

View file

@ -1070,10 +1070,17 @@ INLINE static void do_div(i32 data, int sqrt, int precision)
int fetch; int fetch;
int shift; int shift;
#if (~0 >> 1 == -1)
data ^= (s32)(data + 32768) >> 31; /* DP only: (data < -32768) */
fetch = (s32)(data + 0) >> 31;
data ^= fetch;
data -= fetch; /* two's complement: -x == ~x - (~0) on wrap-around */
#else
if (precision == SP_DIV_PRECISION_SINGLE) if (precision == SP_DIV_PRECISION_SINGLE)
data = (data < 0) ? -data : +data; data = (data < 0) ? -data : +data;
if (precision == SP_DIV_PRECISION_DOUBLE && data < 0) if (precision == SP_DIV_PRECISION_DOUBLE && data < 0)
data = (data >= -32768) ? -data : ~data; data = (data >= -32768) ? -data : ~data;
#endif
/* /*
* Note, from the code just above, that data cannot be negative. * Note, from the code just above, that data cannot be negative.