Annotation of OpenXM_contrib/gmp/mpn/generic/lshift.c, Revision 1.1.1.3
1.1 maekawa 1: /* mpn_lshift -- Shift left low level.
2:
1.1.1.3 ! ohara 3: Copyright 1991, 1993, 1994, 1996, 2000, 2001, 2002 Free Software Foundation,
! 4: Inc.
1.1 maekawa 5:
6: This file is part of the GNU MP Library.
7:
8: The GNU MP Library is free software; you can redistribute it and/or modify
1.1.1.2 maekawa 9: it under the terms of the GNU Lesser General Public License as published by
10: the Free Software Foundation; either version 2.1 of the License, or (at your
1.1 maekawa 11: option) any later version.
12:
13: The GNU MP Library is distributed in the hope that it will be useful, but
14: WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
1.1.1.2 maekawa 15: or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public
1.1 maekawa 16: License for more details.
17:
1.1.1.2 maekawa 18: You should have received a copy of the GNU Lesser General Public License
1.1 maekawa 19: along with the GNU MP Library; see the file COPYING.LIB. If not, write to
20: the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,
21: MA 02111-1307, USA. */
22:
23: #include "gmp.h"
24: #include "gmp-impl.h"
25:
1.1.1.3 ! ohara 26: /* Shift U (pointed to by up and n limbs long) cnt bits to the left
! 27: and store the n least significant limbs of the result at rp.
! 28: Return the bits shifted out from the most significant limb.
1.1 maekawa 29:
30: Argument constraints:
1.1.1.3 ! ohara 31: 1. 0 < cnt < GMP_NUMB_BITS.
! 32: 2. If the result is to be written over the input, rp must be >= up.
1.1 maekawa 33: */
34:
35: mp_limb_t
1.1.1.3 ! ohara 36: mpn_lshift (mp_ptr rp, mp_srcptr up, mp_size_t n, unsigned int cnt)
1.1 maekawa 37: {
1.1.1.3 ! ohara 38: mp_limb_t high_limb, low_limb;
! 39: unsigned int tnc;
! 40: mp_size_t i;
1.1 maekawa 41: mp_limb_t retval;
42:
1.1.1.3 ! ohara 43: ASSERT (n >= 1);
! 44: ASSERT (cnt >= 1);
! 45: ASSERT (cnt < GMP_NUMB_BITS);
! 46: ASSERT (MPN_SAME_OR_DECR_P (rp, up, n));
! 47:
! 48: up += n;
! 49: rp += n;
! 50:
! 51: tnc = GMP_NUMB_BITS - cnt;
! 52: low_limb = *--up;
! 53: retval = low_limb >> tnc;
! 54: high_limb = (low_limb << cnt) & GMP_NUMB_MASK;
1.1 maekawa 55:
1.1.1.3 ! ohara 56: for (i = n - 1; i != 0; i--)
1.1 maekawa 57: {
1.1.1.3 ! ohara 58: low_limb = *--up;
! 59: *--rp = high_limb | (low_limb >> tnc);
! 60: high_limb = (low_limb << cnt) & GMP_NUMB_MASK;
1.1 maekawa 61: }
1.1.1.3 ! ohara 62: *--rp = high_limb;
1.1 maekawa 63:
64: return retval;
65: }
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>