void Scale_sig(
        Word16 x[],                           /* (i/o) : signal to scale               */
        Word16 lg,                            /* (i)   : size of x[]                   */
        Word16 exp                            /* (i)   : exponent: x = round(x << exp) */
          )
{
    Word32 i;
    Word32 L_tmp;
    if(exp > 0)
    {
        for (i = lg - 1 ; i >= 0; i--)
        {
            L_tmp = L_shl2(x[i], 16 + exp);
            x[i] = extract_h(L_add(L_tmp, 0x8000));
        }
    }
    else
    {
        exp = -exp;
        for (i = lg - 1; i >= 0; i--)
        {
            L_tmp = x[i] << 16;
            L_tmp >>= exp;
            x[i] = (L_tmp + 0x8000)>>16;
        }
    }
    return;
}
void Updt_tar(
		Word16 * x,                           /* (i) Q0  : old target (for pitch search)     */
		Word16 * x2,                          /* (o) Q0  : new target (for codebook search)  */
		Word16 * y,                           /* (i) Q0  : filtered adaptive codebook vector */
		Word16 gain,                          /* (i) Q14 : adaptive codebook gain            */
		Word16 L                              /* (i)     : subframe size                     */
	     )
{
	Word32 i;
	Word32 L_tmp;

	for (i = 0; i < L; i++)
	{
		L_tmp = x[i] << 15;
		L_tmp -= (y[i] * gain)<<1;
		x2[i] = extract_h(L_shl2(L_tmp, 1));
	}

	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;
}