/*************************************************************************** * Copyright (c) 2002-2009, Broadcom Corporation * All Rights Reserved * Confidential Property of Broadcom Corporation * * THIS SOFTWARE MAY ONLY BE USED SUBJECT TO AN EXECUTED SOFTWARE LICENSE * AGREEMENT BETWEEN THE USER AND BROADCOM. YOU HAVE NO RIGHT TO USE OR * EXPLOIT THIS MATERIAL EXCEPT SUBJECT TO THE TERMS OF SUCH AN AGREEMENT. * * Filename: mpclshift.c * ***************************************************************************/ /* * Multiple-Precision Modular Arithmetic Routines * * * Change log: 07/17/02 - Created. * 07/29/02 - Split functions mpcopy(), mplong2mp(), * mpzero(), newabs() into separate files. * 07/30/02 - newabs & sign support removed definitely. */ #include "mp2.h" /* global vars */ /* optimization: do not swap bytes in word, assume input is given * as little-endian 32-bit words. */ #undef INPUT_IS_NOT_LITTLE_ENDIAN_WORD32_ARRAY /* Left shift by k 30-bit units (ie. by 30*k bits) */ void mpclshift (mp a, u32 k, mp b) { register u32 *aa = a; register u32 *bb = b; register u32 kk = k; u32 sa = *a; register u32 sb = sa+kk; if (iszero(aa)) return; /* set new length */ *bb = sb; /* shift the remaining chunks */ for (aa+=sa, bb+=sb; sb>0; sb--, aa--, bb--) *bb = (sb>kk)? *aa : 0L; return; }