Integrating Memory Compression and Decompression with Coherence Protocols in Distributed Shared Memory Multiprocessors