spx_word16_t *a;
void fir_mem_up(spx_sig_t *x, float *aa, spx_sig_t *y, int N, int M, float *mem, char *stack)   /* assumptions:      all odd x[i] are zero -- well, actually they are left out of the array now      N and M are multiples of 4 */{   int i, j;   spx_word16_t *a;   spx_word16_t *xx;      xx= PUSH(stack, M+N-1, spx_word16_t);   for (i = 0; i < N/2; i++)      xx[2*i] = SHR(x[N/2-1-i],SIG_SHIFT+1);   for (i = 0; i < M - 1; i += 2)      xx[N+i] = mem[i+1];#ifdef FIXED_POINT   a = PUSH(stack, M, spx_word16_t);   for (i=0;i<M;i++)      a[i] = floor(.5+65536*aa[i]);#else   a = aa;#endif   for (i = 0; i < N; i += 4) {      spx_sig_t y0, y1, y2, y3;      spx_word16_t x0;      y0 = y1 = y2 = y3 = 0.f;      x0 = xx[N-4-i];      for (j = 0; j < M; j += 4) {         spx_word16_t x1;         spx_word16_t a0, a1;         a0 = a[j];         a1 = a[j+1];         x1 = xx[N-2+j-i];         y0 += SHR(MULT16_16(a0, x1),1);         y1 += SHR(MULT16_16(a1, x1),1);         y2 += SHR(MULT16_16(a0, x0),1);         y3 += SHR(MULT16_16(a1, x0),1);         a0 = a[j+2];         a1 = a[j+3];         x0 = xx[N+j-i];         y0 += SHR(MULT16_16(a0, x0),1);         y1 += SHR(MULT16_16(a1, x0),1);         y2 += SHR(MULT16_16(a0, x1),1);         y3 += SHR(MULT16_16(a1, x1),1);      }      y[i] = y0;      y[i+1] = y1;      y[i+2] = y2;      y[i+3] = y3;   }   for (i = 0; i < M - 1; i += 2)      mem[i+1] = xx[i];}