summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authortege <tege@gmplib.org>2002-05-07 03:14:34 +0200
committertege <tege@gmplib.org>2002-05-07 03:14:34 +0200
commita0997b6571f3bfb7a924ba7acae869393c148eff (patch)
tree43c22f4736872484ed1d49f0e8d53d52c4b92513
parentcc3837b9dd50794d585bc9a6cc42fced37f2e555 (diff)
downloadgmp-a0997b6571f3bfb7a924ba7acae869393c148eff.tar.gz
*** empty log message ***
-rw-r--r--ChangeLog2
-rw-r--r--mpz/ui_sub.c87
2 files changed, 89 insertions, 0 deletions
diff --git a/ChangeLog b/ChangeLog
index a6ad70c01..fe2d0dea4 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -21,6 +21,8 @@ MA 02111-1307, USA.
2002-05-07 Torbjorn Granlund <tege@swox.com>
+ * mpz/aors_ui.h: Nailify.
+
* tests/mpz/t-addsub.c: New file.
* tests/mpz/Makefile.am (check_PROGRAMS): Add t-addsub.
diff --git a/mpz/ui_sub.c b/mpz/ui_sub.c
new file mode 100644
index 000000000..9e2478484
--- /dev/null
+++ b/mpz/ui_sub.c
@@ -0,0 +1,87 @@
+/* mpz_ui_sub -- Subtract an unsigned one-word integer and an mpz_t.
+
+Copyright 2002 Free Software Foundation, Inc.
+
+This file is part of the GNU MP Library.
+
+The GNU MP Library is free software; you can redistribute it and/or modify
+it under the terms of the GNU Lesser General Public License as published by
+the Free Software Foundation; either version 2.1 of the License, or (at your
+option) any later version.
+
+The GNU MP Library is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public
+License for more details.
+
+You should have received a copy of the GNU Lesser General Public License
+along with the GNU MP Library; see the file COPYING.LIB. If not, write to
+the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,
+MA 02111-1307, USA. */
+
+#include "gmp.h"
+#include "gmp-impl.h"
+
+void
+mpz_ui_sub (mpz_ptr w, unsigned long int uval, mpz_srcptr v)
+{
+ mp_ptr vp, wp;
+ mp_size_t vn, wn;
+ mp_limb_t cy;
+
+#if GMP_NAIL_BITS != 0
+ if (uval > GMP_NUMB_MAX)
+ {
+ mpz_t u;
+ mp_limb_t ul[2];
+ PTR(u) = ul;
+ ul[0] = uval & GMP_NUMB_MASK;
+ ul[1] = uval >> GMP_NUMB_BITS;
+ SIZ(u) = 2;
+ mpz_sub (w, u, v);
+ return;
+ }
+#endif
+
+ vp = PTR(v);
+ vn = SIZ(v);
+
+ wp = PTR(w);
+
+ if (vn > 1)
+ {
+ wp = MPZ_REALLOC (w, vn);
+ vp = PTR(v);
+ mpn_sub_1 (wp, vp, vn, (mp_limb_t) uval);
+ wn = -(vn - (wp[vn - 1] == 0));
+ }
+ else if (vn == 1)
+ {
+ if (uval >= vp[0])
+ {
+ wp[0] = uval - vp[0];
+ wn = wp[0] != 0;
+ }
+ else
+ {
+ wp[0] = vp[0] - uval;
+ wn = -1;
+ }
+ }
+ else if (vn == 0)
+ {
+ wp[0] = uval;
+ wn = uval != 0;
+ }
+ else /* (vn < 0) */
+ {
+ vn = -vn;
+ wp = MPZ_REALLOC (w, vn + 1);
+ vp = PTR(v);
+ cy = mpn_add_1 (wp, vp, vn, (mp_limb_t) uval);
+ wp[vn] = cy;
+ wn = vn + (cy != 0);
+ }
+
+ SIZ(w) = wn;
+}