From bf7c98f586ca301e6e2de0aa4d01b66ca0eba761 Mon Sep 17 00:00:00 2001 From: unknown Date: Mon, 8 Jun 2015 16:28:21 -0400 Subject: [PATCH] Conker's BFD micro-optimization with 2's cmpl. integer division --- vu/divide.c | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/vu/divide.c b/vu/divide.c index 81d7cbb..bb5e878 100644 --- a/vu/divide.c +++ b/vu/divide.c @@ -1070,10 +1070,17 @@ INLINE static void do_div(i32 data, int sqrt, int precision) int fetch; 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) data = (data < 0) ? -data : +data; if (precision == SP_DIV_PRECISION_DOUBLE && data < 0) data = (data >= -32768) ? -data : ~data; +#endif /* * Note, from the code just above, that data cannot be negative.