// Update stats
stats.compressions++;
stats.compressionSizeBits += comp_size_bits;
- stats.compressionSize[std::ceil(std::log2(comp_size_bits))]++;
+ if (comp_size_bits != 0) {
+ stats.compressionSize[1 + std::ceil(std::log2(comp_size_bits))]++;
+ } else {
+ stats.compressionSize[0]++;
+ }
// Print debug information
DPRINTF(CacheComp, "Compressed cache line from %d to %d bits. " \
{
Stats::Group::regStats();
- compressionSize.init(std::log2(compressor.blkSize*8) + 1);
+ // Values comprised are {0, 1, 2, 4, ..., blkSize}
+ compressionSize.init(std::log2(compressor.blkSize*8) + 2);
+ compressionSize.subname(0, "0");
+ compressionSize.subdesc(0,
+ "Number of blocks that compressed to fit in 0 bits");
for (unsigned i = 0; i <= std::log2(compressor.blkSize*8); ++i) {
std::string str_i = std::to_string(1 << i);
- compressionSize.subname(i, str_i);
- compressionSize.subdesc(i,
+ compressionSize.subname(1+i, str_i);
+ compressionSize.subdesc(1+i,
"Number of blocks that compressed to fit in " + str_i + " bits");
}
const std::size_t size = compData->getSize();
// If the compressed size is worse than the uncompressed size,
// we assume the size is the uncompressed size, and thus the
- // compression factor is 1
+ // compression factor is 1.
+ //
+ // Some compressors (notably the zero compressor) may rely on
+ // extra information being stored in the tags, or added in
+ // another compression layer. Their size can be 0, so it is
+ // assigned the highest possible compression factor (the original
+ // block's size).
compressionFactor = (size > blk_size) ? 1 :
- alignToPowerOfTwo(std::floor(blk_size / (double) size));
+ ((size == 0) ? blk_size :
+ alignToPowerOfTwo(std::floor(blk_size / (double) size)));
}
};
struct ResultsComparator
{
public:
PatternX(const DictionaryEntry bytes, const int match_location)
- : DictionaryCompressor::UncompressedPattern(X, 0, 1, match_location,
+ : DictionaryCompressor::UncompressedPattern(X, 0, 0, match_location,
bytes)
{
}
public:
PatternZ(const DictionaryEntry bytes, const int match_location)
: DictionaryCompressor::MaskedValuePattern<0, 0xFFFFFFFFFFFFFFFF>(
- Z, 1, 1, match_location, bytes)
+ Z, 1, 0, match_location, bytes)
{
}
};