blob: f910eb14943137a079ec17e3e6003927a2296623 [file] [log] [blame]
/*
* Copyright (c) 2018-2020 Inria
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are
* met: redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer;
* redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution;
* neither the name of the copyright holders nor the names of its
* contributors may be used to endorse or promote products derived from
* this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
#include "mem/cache/compressors/fpc.hh"
#include "mem/cache/compressors/dictionary_compressor_impl.hh"
#include "params/FPC.hh"
namespace gem5
{
namespace compression
{
FPC::FPCCompData::FPCCompData(int zero_run_size_bits)
: CompData(), zeroRunSizeBits(zero_run_size_bits)
{
}
void
FPC::FPCCompData::addEntry(std::unique_ptr<Pattern> pattern)
{
// If this is a zero match, check for zero runs
if (pattern->getPatternNumber() == ZERO_RUN) {
// If it is a new zero run, create it; otherwise, increase current
// run's length
if (!entries.size() ||
(entries.back()->getPatternNumber() != ZERO_RUN)) {
static_cast<ZeroRun*>(pattern.get())->setRealSize(zeroRunSizeBits);
} else {
// A zero run has a maximum length, given by the number of bits
// used to represent it. When this limit is reached, a new run
// must be created
const int run_length =
static_cast<ZeroRun*>(entries.back().get())->getRunLength();
if (run_length == mask(zeroRunSizeBits)) {
// The limit for this zero run has been reached, so a new
// run must be started, with a sized pattern
static_cast<ZeroRun*>(pattern.get())->setRealSize(
zeroRunSizeBits);
} else {
// Increase the current run's length.
// Since the first zero entry of the run contains the size,
// and all the following ones are created just to simplify
// decompression, this fake pattern will have a size of 0 bits
static_cast<ZeroRun*>(pattern.get())->setRunLength(
run_length + 1);
}
}
}
CompData::addEntry(std::move(pattern));
}
FPC::FPC(const Params &p)
: DictionaryCompressor<uint32_t>(p), zeroRunSizeBits(p.zero_run_bits)
{
}
void
FPC::addToDictionary(const DictionaryEntry data)
{
// There is no dictionary in FPC, so its size is zero, and no pattern
// causes an insertion in the dictionary. The only reason we do not
// assert it is that the UncompressedPattern implementation always
// inserts by default
}
std::unique_ptr<DictionaryCompressor<uint32_t>::CompData>
FPC::instantiateDictionaryCompData() const
{
return std::unique_ptr<DictionaryCompressor<uint32_t>::CompData>(
new FPCCompData(zeroRunSizeBits));
}
} // namespace compression
} // namespace gem5