summaryrefslogtreecommitdiff
path: root/mpf/cmp_ui.c
diff options
context:
space:
mode:
authortege <tege@gmplib.org>2002-05-06 15:05:24 +0200
committertege <tege@gmplib.org>2002-05-06 15:05:24 +0200
commit0e6c3fe79785bac780c57613a11a333ec6649453 (patch)
tree16e8ee3cca8e35f57f42e78aebd8ad08ad039997 /mpf/cmp_ui.c
parent9a2cd598e3e9ea6f035ddc74e4c0bbc91542c459 (diff)
downloadgmp-0e6c3fe79785bac780c57613a11a333ec6649453.tar.gz
Nailify.
Diffstat (limited to 'mpf/cmp_ui.c')
-rw-r--r--mpf/cmp_ui.c33
1 files changed, 25 insertions, 8 deletions
diff --git a/mpf/cmp_ui.c b/mpf/cmp_ui.c
index cbb17bbac..47ca597a4 100644
--- a/mpf/cmp_ui.c
+++ b/mpf/cmp_ui.c
@@ -23,11 +23,12 @@ MA 02111-1307, USA. */
#include "gmp-impl.h"
int
-mpf_cmp_ui (mpf_srcptr u, unsigned long int vlimb)
+mpf_cmp_ui (mpf_srcptr u, unsigned long int vval)
{
mp_srcptr up;
mp_size_t usize;
mp_exp_t uexp;
+ mp_limb_t ulimb;
uexp = u->_mp_exp;
usize = u->_mp_size;
@@ -37,36 +38,52 @@ mpf_cmp_ui (mpf_srcptr u, unsigned long int vlimb)
return -1;
/* We rely on usize being non-negative in the code that follows. */
- if (vlimb == 0)
+ if (vval == 0)
return usize != 0;
/* 2. Are the exponents different (V's exponent == 1)? */
+#if GMP_NAIL_BITS != 0
+ if (uexp > 1 + (vval > GMP_NUMB_MAX))
+ return 1;
+ if (uexp < 1 + (vval > GMP_NUMB_MAX))
+ return -1;
+#else
if (uexp > 1)
return 1;
if (uexp < 1)
return -1;
+#endif
up = u->_mp_d;
+ ulimb = up[usize - 1];
+#if GMP_NAIL_BITS != 0
+ if (usize >= 2 && uexp == 2)
+ {
+ if ((ulimb >> GMP_NAIL_BITS) != 0)
+ return 1;
+ ulimb = (ulimb << GMP_NUMB_BITS) | up[usize - 2];
+ usize--;
+ }
+#endif
+ usize--;
+
/* 3. Compare the most significant mantissa limb with V. */
- if (up[usize - 1] > vlimb)
+ if (ulimb > vval)
return 1;
- else if (up[usize - 1] < vlimb)
+ else if (ulimb < vval)
return -1;
-#define STRICT_MPF_NORMALIZATION 0
-#if ! STRICT_MPF_NORMALIZATION
/* Ignore zeroes at the low end of U. */
while (*up == 0)
{
up++;
usize--;
}
-#endif
/* 4. Now, if the number of limbs are different, we have a difference
since we have made sure the trailing limbs are not zero. */
- if (usize > 1)
+ if (usize > 0)
return 1;
/* Wow, we got zero even if we tried hard to avoid it. */