| Index: gcc/gmp/mpn/generic/gcdext_1.c
|
| diff --git a/gcc/gmp/mpn/generic/gcdext_1.c b/gcc/gmp/mpn/generic/gcdext_1.c
|
| deleted file mode 100644
|
| index efade2b4c9e00542ad751b948d2c4a2e4f89f1cb..0000000000000000000000000000000000000000
|
| --- a/gcc/gmp/mpn/generic/gcdext_1.c
|
| +++ /dev/null
|
| @@ -1,319 +0,0 @@
|
| -/* mpn_gcdext -- Extended Greatest Common Divisor.
|
| -
|
| -Copyright 1996, 1998, 2000, 2001, 2002, 2003, 2004, 2005, 2008 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 3 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. If not, see http://www.gnu.org/licenses/. */
|
| -
|
| -/* Default to binary gcdext_1, since it is best on most current machines.
|
| - We should teach tuneup to choose the right gcdext_1. */
|
| -#define GCDEXT_1_USE_BINARY 1
|
| -
|
| -#include "gmp.h"
|
| -#include "gmp-impl.h"
|
| -#include "longlong.h"
|
| -
|
| -#ifndef NULL
|
| -# define NULL ((void *) 0)
|
| -#endif
|
| -
|
| -/* FIXME: Takes two single-word limbs. It could be extended to a
|
| - * function that accepts a bignum for the first input, and only
|
| - * returns the first co-factor. */
|
| -
|
| -/* Returns g, u and v such that g = u A - v B. There are three
|
| - different cases for the result:
|
| -
|
| - g = u A - v B, 0 < u < b, 0 < v < a
|
| - g = A u = 1, v = 0
|
| - g = B u = B, v = A - 1
|
| -
|
| - We always return with 0 < u <= b, 0 <= v < a.
|
| -*/
|
| -#if GCDEXT_1_USE_BINARY
|
| -
|
| -static mp_limb_t
|
| -gcdext_1_odd (mp_limb_t *up, mp_limb_t *vp, mp_limb_t a, mp_limb_t b)
|
| -{
|
| - mp_limb_t u0;
|
| - mp_limb_t v0;
|
| - mp_limb_t v1;
|
| - mp_limb_t u1;
|
| -
|
| - mp_limb_t B = b;
|
| - mp_limb_t A = a;
|
| -
|
| - /* Through out this function maintain
|
| -
|
| - a = u0 A - v0 B
|
| - b = u1 A - v1 B
|
| -
|
| - where A and B are odd. */
|
| -
|
| - u0 = 1; v0 = 0;
|
| - u1 = b; v1 = a-1;
|
| -
|
| - if (A == 1)
|
| - {
|
| - *up = u0; *vp = v0;
|
| - return 1;
|
| - }
|
| - else if (B == 1)
|
| - {
|
| - *up = u1; *vp = v1;
|
| - return 1;
|
| - }
|
| -
|
| - while (a != b)
|
| - {
|
| - mp_limb_t mask;
|
| -
|
| - ASSERT (a % 2 == 1);
|
| - ASSERT (b % 2 == 1);
|
| -
|
| - ASSERT (0 < u0); ASSERT (u0 <= B);
|
| - ASSERT (0 < u1); ASSERT (u1 <= B);
|
| -
|
| - ASSERT (0 <= v0); ASSERT (v0 < A);
|
| - ASSERT (0 <= v1); ASSERT (v1 < A);
|
| -
|
| - if (a > b)
|
| - {
|
| - MP_LIMB_T_SWAP (a, b);
|
| - MP_LIMB_T_SWAP (u0, u1);
|
| - MP_LIMB_T_SWAP (v0, v1);
|
| - }
|
| -
|
| - ASSERT (a < b);
|
| -
|
| - /* Makes b even */
|
| - b -= a;
|
| -
|
| - mask = - (mp_limb_t) (u1 < u0);
|
| - u1 += B & mask;
|
| - v1 += A & mask;
|
| - u1 -= u0;
|
| - v1 -= v0;
|
| -
|
| - ASSERT (b % 2 == 0);
|
| -
|
| - do
|
| - {
|
| - /* As b = u1 A + v1 B is even, while A and B are odd,
|
| - either both or none of u1, v1 is even */
|
| -
|
| - ASSERT (u1 % 2 == v1 % 2);
|
| -
|
| - mask = -(u1 & 1);
|
| - u1 = u1 / 2 + ((B / 2) & mask) - mask;
|
| - v1 = v1 / 2 + ((A / 2) & mask) - mask;
|
| -
|
| - b /= 2;
|
| - }
|
| - while (b % 2 == 0);
|
| - }
|
| -
|
| - /* Now g = a = b */
|
| - ASSERT (a == b);
|
| - ASSERT (u1 <= B);
|
| - ASSERT (v1 < A);
|
| -
|
| - ASSERT (A % a == 0);
|
| - ASSERT (B % a == 0);
|
| - ASSERT (u0 % (B/a) == u1 % (B/a));
|
| - ASSERT (v0 % (A/a) == v1 % (A/a));
|
| -
|
| - *up = u0; *vp = v0;
|
| -
|
| - return a;
|
| -}
|
| -
|
| -mp_limb_t
|
| -mpn_gcdext_1 (mp_limb_t *up, mp_limb_t *vp, mp_limb_t a, mp_limb_t b)
|
| -{
|
| - unsigned shift = 0;
|
| - mp_limb_t g;
|
| - mp_limb_t u;
|
| - mp_limb_t v;
|
| -
|
| - /* We use unsigned values in the range 0, ... B - 1. As the values
|
| - are uniquely determined only modulo B, we can add B at will, to
|
| - get numbers in range or flip the least significant bit. */
|
| - /* Deal with powers of two */
|
| - while ((a | b) % 2 == 0)
|
| - {
|
| - a /= 2; b /= 2; shift++;
|
| - }
|
| -
|
| - if (b % 2 == 0)
|
| - {
|
| - unsigned k = 0;
|
| -
|
| - do {
|
| - b /= 2; k++;
|
| - } while (b % 2 == 0);
|
| -
|
| - g = gcdext_1_odd (&u, &v, a, b);
|
| -
|
| - while (k--)
|
| - {
|
| - /* We have g = u a + v b, and need to construct
|
| - g = u'a + v'(2b).
|
| -
|
| - If v is even, we can just set u' = u, v' = v/2
|
| - If v is odd, we can set v' = (v + a)/2, u' = u + b
|
| - */
|
| -
|
| - if (v % 2 == 0)
|
| - v /= 2;
|
| - else
|
| - {
|
| - u = u + b;
|
| - v = v/2 + a/2 + 1;
|
| - }
|
| - b *= 2;
|
| - }
|
| - }
|
| - else if (a % 2 == 0)
|
| - {
|
| - unsigned k = 0;
|
| -
|
| - do {
|
| - a /= 2; k++;
|
| - } while (a % 2 == 0);
|
| -
|
| - g = gcdext_1_odd (&u, &v, a, b);
|
| -
|
| - while (k--)
|
| - {
|
| - /* We have g = u a + v b, and need to construct
|
| - g = u'(2a) + v'b.
|
| -
|
| - If u is even, we can just set u' = u/2, v' = v.
|
| - If u is odd, we can set u' = (u + b)/2
|
| - */
|
| -
|
| - if (u % 2 == 0)
|
| - u /= 2;
|
| - else
|
| - {
|
| - u = u/2 + b/2 + 1;
|
| - v = v + a;
|
| - }
|
| - a *= 2;
|
| - }
|
| - }
|
| - else
|
| - /* Ok, both are odd */
|
| - g = gcdext_1_odd (&u, &v, a, b);
|
| -
|
| - *up = u;
|
| - *vp = v;
|
| -
|
| - return g << shift;
|
| -}
|
| -
|
| -#else /* ! GCDEXT_1_USE_BINARY */
|
| -static mp_limb_t
|
| -gcdext_1_u (mp_limb_t *up, mp_limb_t a, mp_limb_t b)
|
| -{
|
| - /* Maintain
|
| -
|
| - a = u0 A mod B
|
| - b = - u1 A mod B
|
| - */
|
| - mp_limb_t u0 = 1;
|
| - mp_limb_t u1 = 0;
|
| - mp_limb_t B = b;
|
| -
|
| - ASSERT (a >= b);
|
| - ASSERT (b > 0);
|
| -
|
| - for (;;)
|
| - {
|
| - mp_limb_t q;
|
| -
|
| - q = a / b;
|
| - a -= q * b;
|
| -
|
| - if (a == 0)
|
| - {
|
| - *up = B - u1;
|
| - return b;
|
| - }
|
| - u0 += q * u1;
|
| -
|
| - q = b / a;
|
| - b -= q * a;
|
| -
|
| - if (b == 0)
|
| - {
|
| - *up = u0;
|
| - return a;
|
| - }
|
| - u1 += q * u0;
|
| - }
|
| -}
|
| -
|
| -mp_limb_t
|
| -mpn_gcdext_1 (mp_limb_t *up, mp_limb_t *vp, mp_limb_t a, mp_limb_t b)
|
| -{
|
| - /* Maintain
|
| -
|
| - a = u0 A - v0 B
|
| - b = - u1 A + v1 B = (B - u1) A - (A - v1) B
|
| - */
|
| - mp_limb_t u0 = 1;
|
| - mp_limb_t v0 = 0;
|
| - mp_limb_t u1 = 0;
|
| - mp_limb_t v1 = 1;
|
| -
|
| - mp_limb_t A = a;
|
| - mp_limb_t B = b;
|
| -
|
| - ASSERT (a >= b);
|
| - ASSERT (b > 0);
|
| -
|
| - for (;;)
|
| - {
|
| - mp_limb_t q;
|
| -
|
| - q = a / b;
|
| - a -= q * b;
|
| -
|
| - if (a == 0)
|
| - {
|
| - *up = B - u1;
|
| - *vp = A - v1;
|
| - return b;
|
| - }
|
| - u0 += q * u1;
|
| - v0 += q * v1;
|
| -
|
| - q = b / a;
|
| - b -= q * a;
|
| -
|
| - if (b == 0)
|
| - {
|
| - *up = u0;
|
| - *vp = v0;
|
| - return a;
|
| - }
|
| - u1 += q * u0;
|
| - v1 += q * v0;
|
| - }
|
| -}
|
| -#endif /* ! GCDEXT_1_USE_BINARY */
|
|
|