void Convolve (
		Word16 x[],        /* (i)     : input vector                           */
		Word16 h[],        /* (i)     : impulse response                       */
		Word16 y[],        /* (o)     : output vector                          */
		Word16 L           /* (i)     : vector size                            */
	      )
{
	Word32  i, n;
	Word16 *tmpH,*tmpX;
	Word32 s;
	for (n = 0; n < 64;)
	{
		tmpH = h+n;
		tmpX = x;
		i=n+1;
		s = vo_mult32((*tmpX++), (*tmpH--));i--;
		while(i>0)
		{
			s += vo_mult32((*tmpX++), (*tmpH--));
			s += vo_mult32((*tmpX++), (*tmpH--));
			s += vo_mult32((*tmpX++), (*tmpH--));
			s += vo_mult32((*tmpX++), (*tmpH--));
			i -= 4;
		}
		y[n] = ((s<<1) + 0x8000)>>16;   
		n++;

		tmpH = h+n;
		tmpX = x;
		i=n+1;
		s =  vo_mult32((*tmpX++), (*tmpH--));i--;
		s += vo_mult32((*tmpX++), (*tmpH--));i--;

		while(i>0)
		{
			s += vo_mult32((*tmpX++), (*tmpH--));
			s += vo_mult32((*tmpX++), (*tmpH--));
			s += vo_mult32((*tmpX++), (*tmpH--));
			s += vo_mult32((*tmpX++), (*tmpH--));
			i -= 4;
		}
		y[n] = ((s<<1) + 0x8000)>>16;    
		n++;

		tmpH = h+n;
		tmpX = x;
		i=n+1;
		s =  vo_mult32((*tmpX++), (*tmpH--));i--;
		s += vo_mult32((*tmpX++), (*tmpH--));i--;
		s += vo_mult32((*tmpX++), (*tmpH--));i--;

		while(i>0)
		{
			s += vo_mult32((*tmpX++), (*tmpH--));
			s += vo_mult32((*tmpX++), (*tmpH--));
			s += vo_mult32((*tmpX++), (*tmpH--));
			s += vo_mult32((*tmpX++), (*tmpH--));
			i -= 4;
		}
		y[n] = ((s<<1) + 0x8000)>>16;   
		n++;

		s = 0;
		tmpH = h+n;
		tmpX = x;
		i=n+1;
		while(i>0)
		{
			s += vo_mult32((*tmpX++), (*tmpH--));
			s += vo_mult32((*tmpX++), (*tmpH--));
			s += vo_mult32((*tmpX++), (*tmpH--));
			s += vo_mult32((*tmpX++), (*tmpH--));
			i -= 4;
		}
		y[n] = ((s<<1) + 0x8000)>>16;   
		n++;        
	}
	return;
}
void Residu(
		Word16 a[],                           /* (i) Q12 : prediction coefficients                     */
		Word16 x[],                           /* (i)     : speech (values x[-m..-1] are needed         */
		Word16 y[],                           /* (o) x2  : residual signal                             */
		Word16 lg                             /* (i)     : size of filtering                           */
		)
{
	Word16 i,*p1, *p2;
	Word32 s;
	for (i = 0; i < lg; i++)
	{
		p1 = a;
		p2 = &x[i];
		s  = vo_mult32((*p1++), (*p2--));
		s += vo_mult32((*p1++), (*p2--));
		s += vo_mult32((*p1++), (*p2--));
		s += vo_mult32((*p1++), (*p2--));
		s += vo_mult32((*p1++), (*p2--));
		s += vo_mult32((*p1++), (*p2--));
		s += vo_mult32((*p1++), (*p2--));
		s += vo_mult32((*p1++), (*p2--));
		s += vo_mult32((*p1++), (*p2--));
		s += vo_mult32((*p1++), (*p2--));
		s += vo_mult32((*p1++), (*p2--));
		s += vo_mult32((*p1++), (*p2--));
		s += vo_mult32((*p1++), (*p2--));
		s += vo_mult32((*p1++), (*p2--));
		s += vo_mult32((*p1++), (*p2--));
		s += vo_mult32((*p1++), (*p2--));
		s += vo_mult32((*p1), (*p2));

		s = L_shl2(s, 5); 
		y[i] = extract_h(L_add(s, 0x8000));
	}

	return;
}
void Pred_lt4(
		Word16 exc[],                         /* in/out: excitation buffer */
		Word16 T0,                            /* input : integer pitch lag */
		Word16 frac,                          /* input : fraction of lag   */
		Word16 L_subfr                        /* input : subframe size     */
	     )
{
	Word16 j, k, *x;
	Word32 L_sum;
	Word16 *ptr, *ptr1;
	Word16 *ptr2;

	x = exc - T0;
	frac = -frac;
	if (frac < 0)
	{
		frac += UP_SAMP;
		x--;
	}
	x -= 15;                                     /* x = L_INTERPOL2 - 1 */
	k = 3 - frac;                                /* k = UP_SAMP - 1 - frac */

	ptr2 = &(inter4_2[k][0]);
	for (j = 0; j < L_subfr; j++)
	{
		ptr = ptr2;
		ptr1 = x;
		L_sum  = vo_mult32((*ptr1++), (*ptr++));
		L_sum += vo_mult32((*ptr1++), (*ptr++));
		L_sum += vo_mult32((*ptr1++), (*ptr++));
		L_sum += vo_mult32((*ptr1++), (*ptr++));
		L_sum += vo_mult32((*ptr1++), (*ptr++));
		L_sum += vo_mult32((*ptr1++), (*ptr++));
		L_sum += vo_mult32((*ptr1++), (*ptr++));
		L_sum += vo_mult32((*ptr1++), (*ptr++));
		L_sum += vo_mult32((*ptr1++), (*ptr++));
		L_sum += vo_mult32((*ptr1++), (*ptr++));
		L_sum += vo_mult32((*ptr1++), (*ptr++));
		L_sum += vo_mult32((*ptr1++), (*ptr++));
		L_sum += vo_mult32((*ptr1++), (*ptr++));
		L_sum += vo_mult32((*ptr1++), (*ptr++));
		L_sum += vo_mult32((*ptr1++), (*ptr++));
		L_sum += vo_mult32((*ptr1++), (*ptr++));
		L_sum += vo_mult32((*ptr1++), (*ptr++));
		L_sum += vo_mult32((*ptr1++), (*ptr++));
		L_sum += vo_mult32((*ptr1++), (*ptr++));
		L_sum += vo_mult32((*ptr1++), (*ptr++));
		L_sum += vo_mult32((*ptr1++), (*ptr++));
		L_sum += vo_mult32((*ptr1++), (*ptr++));
		L_sum += vo_mult32((*ptr1++), (*ptr++));
		L_sum += vo_mult32((*ptr1++), (*ptr++));
		L_sum += vo_mult32((*ptr1++), (*ptr++));
		L_sum += vo_mult32((*ptr1++), (*ptr++));
		L_sum += vo_mult32((*ptr1++), (*ptr++));
		L_sum += vo_mult32((*ptr1++), (*ptr++));
		L_sum += vo_mult32((*ptr1++), (*ptr++));
		L_sum += vo_mult32((*ptr1++), (*ptr++));
		L_sum += vo_mult32((*ptr1++), (*ptr++));
		L_sum += vo_mult32((*ptr1++), (*ptr++));

		L_sum = L_shl2(L_sum, 2);
		exc[j] = extract_h(L_add(L_sum, 0x8000));
		x++;
	}

	return;
}