//@Description Given a bit-vector and a bit-mask, the task is select from the bit-vector all the bits selected by the bit-mask and pack them in the beginning of the word.

int W = 16;

bit[W] compress(bit[W] x, bit[W] m){
  int i=0;
  bit[W] out = 0;	
  for(int j=0; j<W; ++j){
  	if(m[j]){
  	  out[i] = x[j];
  	  i = i+1;	
  	}  	
  }
  return out;
}


generator bit[W] fixedMask(bit[W] x){ 
   bit[W] mask = {0, 1, 0, 0, 1, 0, 0, 1};
   return  compress(x, mask);
}


bit[W] xor_reduce(bit[W] in){ 
  bit[W] out = 0;
  out[0] = in[0];
  for(int i=1; i<W; ++i){
  	out[i] = in[i] ^ out[i-1];
  }
  return out;
}

bit[W] xor_reduceFast(bit[W] in) implements xor_reduce{ 
    bit[W] out = in;
    repeat(??){
        out = (out<<?? & ??) ^ (out<<?? & ??);
    }
    return out;
  }

generator bit[W] maskedShift(bit[W] in, bit[W] mask, int s){ /* automatically rewritten */
	bit[W] t = in & mask;
	return (in ^ t) | t >> s;
}

bit[W] fast(bit[W] x, bit[W] m) implements compress{
	bit[W] mk=0;
	bit[W] mp=0;
	bit[W] mv=0;
	bit[W] t=0;
	int i=0;
	x = x & m;
	mk = (!m) << ??;	
	repeat(??){
	  mp = xor_reduceFast(mk); 
	  mv = mp & m;
	  m = maskedShift(m, mv, ??);
	  x = maskedShift(x, mv, ??);
	  mk = mk & !mp;
	}
	return x;	
}