mul_2exp.c revision 1.1.1.1
1/* mpz_mul_2exp -- Multiply a bignum by 2**CNT 2 3Copyright 1991, 1993, 1994, 1996, 2001, 2002 Free Software Foundation, Inc. 4 5This file is part of the GNU MP Library. 6 7The GNU MP Library is free software; you can redistribute it and/or modify 8it under the terms of the GNU Lesser General Public License as published by 9the Free Software Foundation; either version 3 of the License, or (at your 10option) any later version. 11 12The GNU MP Library is distributed in the hope that it will be useful, but 13WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY 14or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public 15License for more details. 16 17You should have received a copy of the GNU Lesser General Public License 18along with the GNU MP Library. If not, see http://www.gnu.org/licenses/. */ 19 20#include "gmp.h" 21#include "gmp-impl.h" 22 23void 24mpz_mul_2exp (mpz_ptr w, mpz_srcptr u, mp_bitcnt_t cnt) 25{ 26 mp_size_t usize = u->_mp_size; 27 mp_size_t abs_usize = ABS (usize); 28 mp_size_t wsize; 29 mp_size_t limb_cnt; 30 mp_ptr wp; 31 mp_limb_t wlimb; 32 33 if (usize == 0) 34 { 35 w->_mp_size = 0; 36 return; 37 } 38 39 limb_cnt = cnt / GMP_NUMB_BITS; 40 wsize = abs_usize + limb_cnt + 1; 41 if (w->_mp_alloc < wsize) 42 _mpz_realloc (w, wsize); 43 44 wp = w->_mp_d; 45 wsize = abs_usize + limb_cnt; 46 47 cnt %= GMP_NUMB_BITS; 48 if (cnt != 0) 49 { 50 wlimb = mpn_lshift (wp + limb_cnt, u->_mp_d, abs_usize, cnt); 51 if (wlimb != 0) 52 { 53 wp[wsize] = wlimb; 54 wsize++; 55 } 56 } 57 else 58 { 59 MPN_COPY_DECR (wp + limb_cnt, u->_mp_d, abs_usize); 60 } 61 62 /* Zero all whole limbs at low end. Do it here and not before calling 63 mpn_lshift, not to lose for U == W. */ 64 MPN_ZERO (wp, limb_cnt); 65 66 w->_mp_size = usize >= 0 ? wsize : -wsize; 67} 68