B= &(b->d[b->top]); j=(b->max - b->top) & ~7; for (i=0; i<j; i+=8)
A= &(b->d[b->top]); for (i=(b->max - b->top)>>3; i>0; i--,A+=8)
BIGNUM *bn_expand2(BIGNUM *b, int words)	{	BN_ULONG *A,*B,*a;	int i,j;	bn_check_top(b);	if (words > b->max)		{		bn_check_top(b);			if (BN_get_flags(b,BN_FLG_STATIC_DATA))			{			BNerr(BN_F_BN_EXPAND2,BN_R_EXPAND_ON_STATIC_BIGNUM_DATA);			return(NULL);			}		a=A=(BN_ULONG *)Malloc(sizeof(BN_ULONG)*(words+1));		if (A == NULL)			{			BNerr(BN_F_BN_EXPAND2,ERR_R_MALLOC_FAILURE);			return(NULL);			}memset(A,0x5c,sizeof(BN_ULONG)*(words+1));#if 1		B=b->d;		/* Check if the previous number needs to be copied */		if (B != NULL)			{			/* This lot is an unrolled loop to copy b->top 			 * BN_ULONGs from B to A			 */			for (i=b->top&(~7); i>0; i-=8)				{				A[0]=B[0]; A[1]=B[1]; A[2]=B[2]; A[3]=B[3];				A[4]=B[4]; A[5]=B[5]; A[6]=B[6]; A[7]=B[7];				A+=8;				B+=8;				}			switch (b->top&7)				{			case 7:				A[6]=B[6];			case 6:				A[5]=B[5];			case 5:				A[4]=B[4];			case 4:				A[3]=B[3];			case 3:				A[2]=B[2];			case 2:				A[1]=B[1];			case 1:				A[0]=B[0];			case 0:				/* I need the 'case 0' entry for utrix cc.				 * If the optimiser is turned on, it does the				 * switch table by doing				 * a=top&7				 * a--;				 * goto jump_table[a];				 * If top is 0, this makes us jump to 0xffffffc 				 * which is rather bad :-(.				 * eric 23-Apr-1998				 */				;				}			Free(b->d);			}		b->d=a;		b->max=words;		/* Now need to zero any data between b->top and b->max */		B= &(b->d[b->top]);		j=(b->max - b->top) & ~7;		for (i=0; i<j; i+=8)			{			B[0]=0; B[1]=0; B[2]=0; B[3]=0;			B[4]=0; B[5]=0; B[6]=0; B[7]=0;			B+=8;			}		j=(b->max - b->top) & 7;		for (i=0; i<j; i++)			{			B[0]=0;			B++;			}#else			memcpy(a->d,b->d,sizeof(b->d[0])*b->top);#endif		/*		memset(&(p[b->max]),0,((words+1)-b->max)*sizeof(BN_ULONG)); *//*	{ int i; for (i=b->max; i<words+1; i++) p[i]=i;} */		}	return(b);	}