Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(292)

Unified Diff: gcc/gmp/mpn/generic/gcdext_1.c

Issue 3050029: [gcc] GCC 4.5.0=>4.5.1 (Closed) Base URL: ssh://git@gitrw.chromium.org:9222/nacl-toolchain.git
Patch Set: Created 10 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « gcc/gmp/mpn/generic/gcd_subdiv_step.c ('k') | gcc/gmp/mpn/generic/get_d.c » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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 */
« no previous file with comments | « gcc/gmp/mpn/generic/gcd_subdiv_step.c ('k') | gcc/gmp/mpn/generic/get_d.c » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698