summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authortege <tege@gmplib.org>2002-05-07 03:13:29 +0200
committertege <tege@gmplib.org>2002-05-07 03:13:29 +0200
commitcc3837b9dd50794d585bc9a6cc42fced37f2e555 (patch)
tree3b1447065a21e337ea7fcfe55b0f8eaa03d841e5
parent99d1be3abd81e418dc39ecf97193c24c8287ae8c (diff)
downloadgmp-cc3837b9dd50794d585bc9a6cc42fced37f2e555.tar.gz
Nailify.
-rw-r--r--mpz/aors_ui.h30
1 files changed, 23 insertions, 7 deletions
diff --git a/mpz/aors_ui.h b/mpz/aors_ui.h
index c4ed1bd00..e2f48aeb9 100644
--- a/mpz/aors_ui.h
+++ b/mpz/aors_ui.h
@@ -27,6 +27,7 @@ MA 02111-1307, USA. */
#ifdef OPERATION_add_ui
#define FUNCTION mpz_add_ui
+#define FUNCTION2 mpz_add
#define VARIATION_CMP >=
#define VARIATION_NEG
#define VARIATION_UNNEG -
@@ -34,6 +35,7 @@ MA 02111-1307, USA. */
#ifdef OPERATION_sub_ui
#define FUNCTION mpz_sub_ui
+#define FUNCTION2 mpz_sub
#define VARIATION_CMP <
#define VARIATION_NEG -
#define VARIATION_UNNEG
@@ -45,13 +47,27 @@ Error, need OPERATION_add_ui or OPERATION_sub_ui
void
-FUNCTION (mpz_ptr w, mpz_srcptr u, unsigned long int v)
+FUNCTION (mpz_ptr w, mpz_srcptr u, unsigned long int vval)
{
mp_srcptr up;
mp_ptr wp;
mp_size_t usize, wsize;
mp_size_t abs_usize;
+#if GMP_NAIL_BITS != 0
+ if (vval > GMP_NUMB_MAX)
+ {
+ mpz_t v;
+ mp_limb_t vl[2];
+ PTR(v) = vl;
+ vl[0] = vval & GMP_NUMB_MASK;
+ vl[1] = vval >> GMP_NUMB_BITS;
+ SIZ(v) = 2;
+ FUNCTION2 (w, u, v);
+ return;
+ }
+#endif
+
usize = u->_mp_size;
abs_usize = ABS (usize);
@@ -66,15 +82,15 @@ FUNCTION (mpz_ptr w, mpz_srcptr u, unsigned long int v)
if (abs_usize == 0)
{
- wp[0] = v;
- w->_mp_size = VARIATION_NEG (v != 0);
+ wp[0] = vval;
+ w->_mp_size = VARIATION_NEG (vval != 0);
return;
}
if (usize VARIATION_CMP 0)
{
mp_limb_t cy;
- cy = mpn_add_1 (wp, up, abs_usize, (mp_limb_t) v);
+ cy = mpn_add_1 (wp, up, abs_usize, (mp_limb_t) vval);
wp[abs_usize] = cy;
wsize = VARIATION_NEG (abs_usize + cy);
}
@@ -82,14 +98,14 @@ FUNCTION (mpz_ptr w, mpz_srcptr u, unsigned long int v)
{
/* The signs are different. Need exact comparison to determine
which operand to subtract from which. */
- if (abs_usize == 1 && up[0] < v)
+ if (abs_usize == 1 && up[0] < vval)
{
- wp[0] = v - up[0];
+ wp[0] = vval - up[0];
wsize = VARIATION_NEG 1;
}
else
{
- mpn_sub_1 (wp, up, abs_usize, (mp_limb_t) v);
+ mpn_sub_1 (wp, up, abs_usize, (mp_limb_t) vval);
/* Size can decrease with at most one limb. */
wsize = VARIATION_UNNEG (abs_usize - (wp[abs_usize - 1] == 0));
}