113944Sodanrc@yahoo.com.br/*
213944Sodanrc@yahoo.com.br * Copyright (c) 2018 Inria
313944Sodanrc@yahoo.com.br * All rights reserved.
413944Sodanrc@yahoo.com.br *
513944Sodanrc@yahoo.com.br * Redistribution and use in source and binary forms, with or without
613944Sodanrc@yahoo.com.br * modification, are permitted provided that the following conditions are
713944Sodanrc@yahoo.com.br * met: redistributions of source code must retain the above copyright
813944Sodanrc@yahoo.com.br * notice, this list of conditions and the following disclaimer;
913944Sodanrc@yahoo.com.br * redistributions in binary form must reproduce the above copyright
1013944Sodanrc@yahoo.com.br * notice, this list of conditions and the following disclaimer in the
1113944Sodanrc@yahoo.com.br * documentation and/or other materials provided with the distribution;
1213944Sodanrc@yahoo.com.br * neither the name of the copyright holders nor the names of its
1313944Sodanrc@yahoo.com.br * contributors may be used to endorse or promote products derived from
1413944Sodanrc@yahoo.com.br * this software without specific prior written permission.
1513944Sodanrc@yahoo.com.br *
1613944Sodanrc@yahoo.com.br * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
1713944Sodanrc@yahoo.com.br * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
1813944Sodanrc@yahoo.com.br * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
1913944Sodanrc@yahoo.com.br * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
2013944Sodanrc@yahoo.com.br * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
2113944Sodanrc@yahoo.com.br * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
2213944Sodanrc@yahoo.com.br * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
2313944Sodanrc@yahoo.com.br * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
2413944Sodanrc@yahoo.com.br * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
2513944Sodanrc@yahoo.com.br * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
2613944Sodanrc@yahoo.com.br * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
2713944Sodanrc@yahoo.com.br *
2813944Sodanrc@yahoo.com.br * Authors: Daniel Carvalho
2913944Sodanrc@yahoo.com.br */
3013944Sodanrc@yahoo.com.br
3113944Sodanrc@yahoo.com.br/** @file
3213944Sodanrc@yahoo.com.br * Definition of "Base-Delta-Immediate Compression: Practical Data Compression
3313944Sodanrc@yahoo.com.br * for On-Chip Caches".
3413944Sodanrc@yahoo.com.br */
3513944Sodanrc@yahoo.com.br
3613944Sodanrc@yahoo.com.br#ifndef __MEM_CACHE_COMPRESSORS_BDI_HH__
3713944Sodanrc@yahoo.com.br#define __MEM_CACHE_COMPRESSORS_BDI_HH__
3813944Sodanrc@yahoo.com.br
3913944Sodanrc@yahoo.com.br#include <cstdint>
4013944Sodanrc@yahoo.com.br#include <memory>
4113944Sodanrc@yahoo.com.br#include <vector>
4213944Sodanrc@yahoo.com.br
4313944Sodanrc@yahoo.com.br#include "base/types.hh"
4413944Sodanrc@yahoo.com.br#include "mem/cache/compressors/base.hh"
4513944Sodanrc@yahoo.com.br
4613944Sodanrc@yahoo.com.brstruct BDIParams;
4713944Sodanrc@yahoo.com.br
4813944Sodanrc@yahoo.com.br/**
4913944Sodanrc@yahoo.com.br * Default maximum number of bases in the original BDI.
5013944Sodanrc@yahoo.com.br */
5113944Sodanrc@yahoo.com.br#define BDI_DEFAULT_MAX_NUM_BASES 2
5213944Sodanrc@yahoo.com.br
5313944Sodanrc@yahoo.com.brclass BDI : public BaseCacheCompressor
5413944Sodanrc@yahoo.com.br{
5513944Sodanrc@yahoo.com.br  protected:
5613944Sodanrc@yahoo.com.br    /**
5713944Sodanrc@yahoo.com.br     * Forward declaration of comp data classes.
5813944Sodanrc@yahoo.com.br     */
5913944Sodanrc@yahoo.com.br    class BDICompData;
6013944Sodanrc@yahoo.com.br    class BDICompDataZeros;
6113944Sodanrc@yahoo.com.br    class BDICompDataRep;
6213944Sodanrc@yahoo.com.br    class BDICompDataUncompressed;
6313944Sodanrc@yahoo.com.br    template <class TB, class TD> class BDICompDataBaseDelta;
6413944Sodanrc@yahoo.com.br
6513944Sodanrc@yahoo.com.br    /**
6613944Sodanrc@yahoo.com.br     * The possible encoding values. If modified, ENCODING_NAMES must be too.
6713944Sodanrc@yahoo.com.br     */
6813944Sodanrc@yahoo.com.br    enum ENCODING {ZERO, REP_VALUES, BASE8_1, BASE8_2, BASE8_4, BASE4_1,
6913944Sodanrc@yahoo.com.br                   BASE4_2, BASE2_1, UNCOMPRESSED, NUM_ENCODINGS};
7013944Sodanrc@yahoo.com.br
7113944Sodanrc@yahoo.com.br    /**
7213944Sodanrc@yahoo.com.br     * The respective encoding names. They are indexed by the ENCODING enum.
7313944Sodanrc@yahoo.com.br     * The values are assigned in the source file, and should be modified if
7413944Sodanrc@yahoo.com.br     * ENCODING is changed.
7513944Sodanrc@yahoo.com.br     */
7613944Sodanrc@yahoo.com.br    static const char* ENCODING_NAMES[];
7713944Sodanrc@yahoo.com.br
7813944Sodanrc@yahoo.com.br    /**
7913944Sodanrc@yahoo.com.br     * If set, create multiple compressor instances for each possible
8013944Sodanrc@yahoo.com.br     * combination of base and delta size. Otherwise, just create a
8113944Sodanrc@yahoo.com.br     * compressor for each base size with the highest available delta
8213944Sodanrc@yahoo.com.br     * size. This can be used to save area and power (having less
8313944Sodanrc@yahoo.com.br     * compressors). True by default.
8413944Sodanrc@yahoo.com.br     */
8513944Sodanrc@yahoo.com.br    const bool useMoreCompressors;
8613944Sodanrc@yahoo.com.br
8713944Sodanrc@yahoo.com.br    /**
8813944Sodanrc@yahoo.com.br     * Number of qwords in a cache line.
8913944Sodanrc@yahoo.com.br     */
9013944Sodanrc@yahoo.com.br    const std::size_t qwordsPerCacheLine;
9113944Sodanrc@yahoo.com.br
9213944Sodanrc@yahoo.com.br    /**
9313944Sodanrc@yahoo.com.br     * @defgroup CompressionStats Compression specific statistics.
9413944Sodanrc@yahoo.com.br     * @{
9513944Sodanrc@yahoo.com.br     */
9613944Sodanrc@yahoo.com.br
9713944Sodanrc@yahoo.com.br    /**
9813944Sodanrc@yahoo.com.br     * Number of data entries that were compressed to each encoding.
9913944Sodanrc@yahoo.com.br     */
10013944Sodanrc@yahoo.com.br    Stats::Vector encodingStats;
10113944Sodanrc@yahoo.com.br
10213944Sodanrc@yahoo.com.br    /**
10313944Sodanrc@yahoo.com.br     * @}
10413944Sodanrc@yahoo.com.br     */
10513944Sodanrc@yahoo.com.br
10613944Sodanrc@yahoo.com.br    /**
10713944Sodanrc@yahoo.com.br     * Check if the cache line consists of only zero values.
10813944Sodanrc@yahoo.com.br     *
10913944Sodanrc@yahoo.com.br     * @param data The cache line.
11013944Sodanrc@yahoo.com.br     * @return True if it is a ZERO cache line.
11113944Sodanrc@yahoo.com.br     */
11213944Sodanrc@yahoo.com.br    bool isZeroPackable(const uint64_t* data) const;
11313944Sodanrc@yahoo.com.br
11413944Sodanrc@yahoo.com.br    /**
11513944Sodanrc@yahoo.com.br     * Check if the cache line consists only of same values.
11613944Sodanrc@yahoo.com.br     *
11713944Sodanrc@yahoo.com.br     * @param data The cache line.
11813944Sodanrc@yahoo.com.br     * @return True if it is a REP_VALUES cache line.
11913944Sodanrc@yahoo.com.br     */
12013944Sodanrc@yahoo.com.br    bool isSameValuePackable(const uint64_t* data) const;
12113944Sodanrc@yahoo.com.br
12213944Sodanrc@yahoo.com.br    /**
12313944Sodanrc@yahoo.com.br     * Instantiate a BaseDelta compressor with given TB and TD, and try to
12413944Sodanrc@yahoo.com.br     * compress the cache line. If the compression fails, it returns a nullptr.
12513944Sodanrc@yahoo.com.br     * @sa BDICompDataBaseDelta
12613944Sodanrc@yahoo.com.br     *
12713944Sodanrc@yahoo.com.br     * @tparam TB Type of a base entry.
12813944Sodanrc@yahoo.com.br     * @tparam TD Type of a delta entry.
12913944Sodanrc@yahoo.com.br     * @param data The cache line to be compressed.
13013944Sodanrc@yahoo.com.br     * @param encoding Encoding value for given TB-TD combination.
13113944Sodanrc@yahoo.com.br     * @return Cache line after compression or nullptr.
13213944Sodanrc@yahoo.com.br     */
13313944Sodanrc@yahoo.com.br    template <class TB, class TD>
13413944Sodanrc@yahoo.com.br    std::unique_ptr<BDICompData> tryCompress(const uint64_t* data,
13513944Sodanrc@yahoo.com.br                                             const uint8_t encoding) const;
13613944Sodanrc@yahoo.com.br
13713944Sodanrc@yahoo.com.br    /**
13813944Sodanrc@yahoo.com.br     * Apply compression.
13913944Sodanrc@yahoo.com.br     *
14013944Sodanrc@yahoo.com.br     * @param data The cache line to be compressed.
14113944Sodanrc@yahoo.com.br     * @param comp_lat Compression latency in number of cycles.
14213944Sodanrc@yahoo.com.br     * @param decomp_lat Decompression latency in number of cycles.
14313944Sodanrc@yahoo.com.br     * @param comp_size Compressed data size.
14413944Sodanrc@yahoo.com.br     */
14513944Sodanrc@yahoo.com.br    std::unique_ptr<BaseCacheCompressor::CompressionData> compress(
14613944Sodanrc@yahoo.com.br        const uint64_t* data, Cycles& comp_lat, Cycles& decomp_lat) override;
14713944Sodanrc@yahoo.com.br
14813944Sodanrc@yahoo.com.br    /**
14913944Sodanrc@yahoo.com.br     * Decompress data.
15013944Sodanrc@yahoo.com.br     *
15113944Sodanrc@yahoo.com.br     * @param comp_data Compressed cache line.
15213944Sodanrc@yahoo.com.br     * @param data The cache line to be decompressed.
15313944Sodanrc@yahoo.com.br     * @return Decompression latency in number of cycles.
15413944Sodanrc@yahoo.com.br     */
15513944Sodanrc@yahoo.com.br    void decompress(const BaseCacheCompressor::CompressionData* comp_data,
15613944Sodanrc@yahoo.com.br                                           uint64_t* data) override;
15713944Sodanrc@yahoo.com.br
15813944Sodanrc@yahoo.com.br  public:
15913944Sodanrc@yahoo.com.br    /** Convenience typedef. */
16013944Sodanrc@yahoo.com.br    typedef BDIParams Params;
16113944Sodanrc@yahoo.com.br
16213944Sodanrc@yahoo.com.br    /**
16313944Sodanrc@yahoo.com.br     * Default constructor.
16413944Sodanrc@yahoo.com.br     */
16513944Sodanrc@yahoo.com.br    BDI(const Params *p);
16613944Sodanrc@yahoo.com.br
16713944Sodanrc@yahoo.com.br    /**
16813944Sodanrc@yahoo.com.br     * Default destructor.
16913944Sodanrc@yahoo.com.br     */
17013944Sodanrc@yahoo.com.br    ~BDI() = default;
17113944Sodanrc@yahoo.com.br
17213944Sodanrc@yahoo.com.br    /**
17313944Sodanrc@yahoo.com.br     * Register local statistics.
17413944Sodanrc@yahoo.com.br     */
17513944Sodanrc@yahoo.com.br    void regStats() override;
17613944Sodanrc@yahoo.com.br};
17713944Sodanrc@yahoo.com.br
17813944Sodanrc@yahoo.com.br/**
17913944Sodanrc@yahoo.com.br * Template for the BDI compression data.
18013944Sodanrc@yahoo.com.br */
18113944Sodanrc@yahoo.com.brclass BDI::BDICompData : public CompressionData
18213944Sodanrc@yahoo.com.br{
18313944Sodanrc@yahoo.com.br  private:
18413944Sodanrc@yahoo.com.br    /**
18513944Sodanrc@yahoo.com.br     * Data encoding.
18613944Sodanrc@yahoo.com.br     * @sa BDI
18713944Sodanrc@yahoo.com.br     */
18813944Sodanrc@yahoo.com.br    const uint8_t _encoding;
18913944Sodanrc@yahoo.com.br
19013944Sodanrc@yahoo.com.br  protected:
19113944Sodanrc@yahoo.com.br    /**
19213944Sodanrc@yahoo.com.br     * Number of bits needed for the encoding field.
19313944Sodanrc@yahoo.com.br     */
19413944Sodanrc@yahoo.com.br    static const std::size_t encodingBits = 4;
19513944Sodanrc@yahoo.com.br
19613944Sodanrc@yahoo.com.br    /**
19713944Sodanrc@yahoo.com.br     * Calculate and set compressed data size.
19813944Sodanrc@yahoo.com.br     * Each BDI compressor generates compressed data with different sizes.
19913944Sodanrc@yahoo.com.br    */
20013944Sodanrc@yahoo.com.br    virtual void calculateCompressedSize() = 0;
20113944Sodanrc@yahoo.com.br
20213944Sodanrc@yahoo.com.br  public:
20313944Sodanrc@yahoo.com.br    /**
20413944Sodanrc@yahoo.com.br     * Default constructor.
20513944Sodanrc@yahoo.com.br     *
20613944Sodanrc@yahoo.com.br     * @param encoding The encoding value.
20713944Sodanrc@yahoo.com.br     */
20813944Sodanrc@yahoo.com.br    BDICompData(const uint8_t encoding);
20913944Sodanrc@yahoo.com.br
21013944Sodanrc@yahoo.com.br    /**
21113944Sodanrc@yahoo.com.br     * Default destructor.
21213944Sodanrc@yahoo.com.br     */
21313944Sodanrc@yahoo.com.br    virtual ~BDICompData() = default;
21413944Sodanrc@yahoo.com.br
21513944Sodanrc@yahoo.com.br    /**
21613944Sodanrc@yahoo.com.br     * Get and decompress data at given index.
21713944Sodanrc@yahoo.com.br     *
21813944Sodanrc@yahoo.com.br     * The index is given relative to 64-bit entries, therefore if the base
21913944Sodanrc@yahoo.com.br     * size of the given compressed data is smaller than that, this function
22013944Sodanrc@yahoo.com.br     * joins multiple base-delta entries to generate the respective 64-bit
22113944Sodanrc@yahoo.com.br     * entry.
22213944Sodanrc@yahoo.com.br     *
22313944Sodanrc@yahoo.com.br     * @param index The index of the compressed data.
22413944Sodanrc@yahoo.com.br     * @return Decompressed data for the given index.
22513944Sodanrc@yahoo.com.br     */
22613944Sodanrc@yahoo.com.br    virtual uint64_t access(const int index) const = 0;
22713944Sodanrc@yahoo.com.br
22813944Sodanrc@yahoo.com.br    /**
22913944Sodanrc@yahoo.com.br     * Get encoding.
23013944Sodanrc@yahoo.com.br     *
23113944Sodanrc@yahoo.com.br     * @return The encoding.
23213944Sodanrc@yahoo.com.br     */
23313944Sodanrc@yahoo.com.br    uint8_t getEncoding() const;
23413944Sodanrc@yahoo.com.br
23513944Sodanrc@yahoo.com.br    /**
23613944Sodanrc@yahoo.com.br     * Get encoding name.
23713944Sodanrc@yahoo.com.br     *
23813944Sodanrc@yahoo.com.br     * @return The encoding name.
23913944Sodanrc@yahoo.com.br     */
24013944Sodanrc@yahoo.com.br    std::string getName() const;
24113944Sodanrc@yahoo.com.br};
24213944Sodanrc@yahoo.com.br
24313944Sodanrc@yahoo.com.br/**
24413944Sodanrc@yahoo.com.br * BDI compressed data containing the ZERO encoding.
24513944Sodanrc@yahoo.com.br */
24613944Sodanrc@yahoo.com.brclass BDI::BDICompDataZeros : public BDICompData
24713944Sodanrc@yahoo.com.br{
24813944Sodanrc@yahoo.com.br  protected:
24913944Sodanrc@yahoo.com.br    /**
25013944Sodanrc@yahoo.com.br     * Calculate compressed data size using ZERO encoding.
25113944Sodanrc@yahoo.com.br     */
25213944Sodanrc@yahoo.com.br    void calculateCompressedSize() override;
25313944Sodanrc@yahoo.com.br
25413944Sodanrc@yahoo.com.br  public:
25513944Sodanrc@yahoo.com.br    /**
25613944Sodanrc@yahoo.com.br     * Default constructor.
25713944Sodanrc@yahoo.com.br    */
25813944Sodanrc@yahoo.com.br    BDICompDataZeros();
25913944Sodanrc@yahoo.com.br
26013944Sodanrc@yahoo.com.br    /**
26113944Sodanrc@yahoo.com.br     * Get and decompress data at given index. Must always return 0.
26213944Sodanrc@yahoo.com.br     *
26313944Sodanrc@yahoo.com.br     * @param index The index of the compressed data.
26413944Sodanrc@yahoo.com.br     * @return Decompressed data for the given index.
26513944Sodanrc@yahoo.com.br     */
26613944Sodanrc@yahoo.com.br    uint64_t access(const int index) const override;
26713944Sodanrc@yahoo.com.br};
26813944Sodanrc@yahoo.com.br
26913944Sodanrc@yahoo.com.br/**
27013944Sodanrc@yahoo.com.br * BDI compressed data containing the REP_VALUES encoding.
27113944Sodanrc@yahoo.com.br */
27213944Sodanrc@yahoo.com.brclass BDI::BDICompDataRep : public BDICompData
27313944Sodanrc@yahoo.com.br{
27413944Sodanrc@yahoo.com.br  private:
27513944Sodanrc@yahoo.com.br    /**
27613944Sodanrc@yahoo.com.br     * The repeated value.
27713944Sodanrc@yahoo.com.br     */
27813944Sodanrc@yahoo.com.br    uint64_t base;
27913944Sodanrc@yahoo.com.br
28013944Sodanrc@yahoo.com.br  protected:
28113944Sodanrc@yahoo.com.br    /**
28213944Sodanrc@yahoo.com.br     * Calculate compressed data size using REP_VALUES encoding.
28313944Sodanrc@yahoo.com.br     */
28413944Sodanrc@yahoo.com.br    void calculateCompressedSize() override;
28513944Sodanrc@yahoo.com.br
28613944Sodanrc@yahoo.com.br  public:
28713944Sodanrc@yahoo.com.br    /**
28813944Sodanrc@yahoo.com.br     * Default constructor.
28913944Sodanrc@yahoo.com.br     *
29013944Sodanrc@yahoo.com.br     * @param rep_value The repeated value.
29113944Sodanrc@yahoo.com.br     */
29213944Sodanrc@yahoo.com.br    BDICompDataRep(const uint64_t rep_value);
29313944Sodanrc@yahoo.com.br
29413944Sodanrc@yahoo.com.br    /**
29513944Sodanrc@yahoo.com.br     * Get and decompress data at given index. Must always return the same
29613944Sodanrc@yahoo.com.br     * value as data[0].
29713944Sodanrc@yahoo.com.br     *
29813944Sodanrc@yahoo.com.br     * @param index The index of the compressed data.
29913944Sodanrc@yahoo.com.br     * @return Decompressed data for the given index.
30013944Sodanrc@yahoo.com.br     */
30113944Sodanrc@yahoo.com.br    uint64_t access(const int index) const override;
30213944Sodanrc@yahoo.com.br};
30313944Sodanrc@yahoo.com.br
30413944Sodanrc@yahoo.com.br/**
30513944Sodanrc@yahoo.com.br * BDI compressed data containing the UNCOMPRESSED encoding.
30613944Sodanrc@yahoo.com.br */
30713944Sodanrc@yahoo.com.brclass BDI::BDICompDataUncompressed : public BDICompData
30813944Sodanrc@yahoo.com.br{
30913944Sodanrc@yahoo.com.br  private:
31013944Sodanrc@yahoo.com.br    /**
31113944Sodanrc@yahoo.com.br     * Uncompressed cache line size (in bytes).
31213944Sodanrc@yahoo.com.br     */
31313944Sodanrc@yahoo.com.br    const std::size_t blkSize;
31413944Sodanrc@yahoo.com.br
31513944Sodanrc@yahoo.com.br    /**
31613944Sodanrc@yahoo.com.br     * The compressed data is the original cache line.
31713944Sodanrc@yahoo.com.br     */
31813944Sodanrc@yahoo.com.br    const std::vector<uint64_t> _data;
31913944Sodanrc@yahoo.com.br
32013944Sodanrc@yahoo.com.br  protected:
32113944Sodanrc@yahoo.com.br    /**
32213944Sodanrc@yahoo.com.br     * Calculate compressed data size using UNCOMPRESSED encoding.
32313944Sodanrc@yahoo.com.br     */
32413944Sodanrc@yahoo.com.br    void calculateCompressedSize() override;
32513944Sodanrc@yahoo.com.br
32613944Sodanrc@yahoo.com.br  public:
32713944Sodanrc@yahoo.com.br    /**
32813944Sodanrc@yahoo.com.br     * Default constructor.
32913944Sodanrc@yahoo.com.br     *
33013944Sodanrc@yahoo.com.br     * @param data The data on which compression was applied.
33113944Sodanrc@yahoo.com.br     * @param blk_size Size of a cache line in bytes.
33213944Sodanrc@yahoo.com.br     */
33313944Sodanrc@yahoo.com.br    BDICompDataUncompressed(const uint64_t* data,
33413944Sodanrc@yahoo.com.br                            const std::size_t blk_size);
33513944Sodanrc@yahoo.com.br
33613944Sodanrc@yahoo.com.br    /**
33713944Sodanrc@yahoo.com.br     * Get and decompress data at given index. Must return the same
33813944Sodanrc@yahoo.com.br     * value as _data[index].
33913944Sodanrc@yahoo.com.br     *
34013944Sodanrc@yahoo.com.br     * @param index The index of the compressed data.
34113944Sodanrc@yahoo.com.br     * @return Decompressed data for the given index.
34213944Sodanrc@yahoo.com.br     */
34313944Sodanrc@yahoo.com.br    uint64_t access(const int index) const override;
34413944Sodanrc@yahoo.com.br};
34513944Sodanrc@yahoo.com.br
34613944Sodanrc@yahoo.com.br/**
34713944Sodanrc@yahoo.com.br * Template class for BDI compressed data containing all the BASE_DELTA
34813944Sodanrc@yahoo.com.br * encodings. TB's size must always be greater than TD's.
34913944Sodanrc@yahoo.com.br *
35013944Sodanrc@yahoo.com.br * @tparam TB Type of a base entry.
35113944Sodanrc@yahoo.com.br * @tparam TD Type of a delta entry.
35213944Sodanrc@yahoo.com.br*/
35313944Sodanrc@yahoo.com.brtemplate <class TB, class TD>
35413944Sodanrc@yahoo.com.brclass BDI::BDICompDataBaseDelta : public BDICompData
35513944Sodanrc@yahoo.com.br{
35613944Sodanrc@yahoo.com.br  protected:
35713944Sodanrc@yahoo.com.br    /**
35813944Sodanrc@yahoo.com.br     * Maximum number of bases.
35913944Sodanrc@yahoo.com.br     */
36013944Sodanrc@yahoo.com.br    const std::size_t maxNumBases;
36113944Sodanrc@yahoo.com.br
36213944Sodanrc@yahoo.com.br    /**
36313944Sodanrc@yahoo.com.br     * Bit mask to differentiate between the bases.
36413944Sodanrc@yahoo.com.br     */
36513944Sodanrc@yahoo.com.br    std::vector<uint8_t> bitMask;
36613944Sodanrc@yahoo.com.br
36713944Sodanrc@yahoo.com.br    /**
36813944Sodanrc@yahoo.com.br     * Bases. bases[0] is 0 and is not stored in a hardware implementation.
36913944Sodanrc@yahoo.com.br     */
37013944Sodanrc@yahoo.com.br    std::vector<TB> bases;
37113944Sodanrc@yahoo.com.br
37213944Sodanrc@yahoo.com.br    /**
37313944Sodanrc@yahoo.com.br     * Array of deltas (or immediate values).
37413944Sodanrc@yahoo.com.br     */
37513944Sodanrc@yahoo.com.br    std::vector<TD> deltas;
37613944Sodanrc@yahoo.com.br
37713944Sodanrc@yahoo.com.br    /**
37813944Sodanrc@yahoo.com.br     * Add a base to the bases vector.
37913944Sodanrc@yahoo.com.br     *
38013944Sodanrc@yahoo.com.br     * @param base The base to be added.
38113944Sodanrc@yahoo.com.br     * @return True on success, false if already used all base slots.
38213944Sodanrc@yahoo.com.br     */
38313944Sodanrc@yahoo.com.br    bool addBase(const TB base);
38413944Sodanrc@yahoo.com.br
38513944Sodanrc@yahoo.com.br    /**
38613944Sodanrc@yahoo.com.br     * Add a delta to the deltas vector.
38713944Sodanrc@yahoo.com.br     *
38813944Sodanrc@yahoo.com.br     * @param base_index Base to which the delta refers.
38913944Sodanrc@yahoo.com.br     * @param delta The delta value.
39013944Sodanrc@yahoo.com.br     */
39113944Sodanrc@yahoo.com.br    void addDelta(const std::size_t base_index, const TD delta);
39213944Sodanrc@yahoo.com.br
39313944Sodanrc@yahoo.com.br    /**
39413944Sodanrc@yahoo.com.br     * Calculate compressed data size using number of bases, the base size and
39513944Sodanrc@yahoo.com.br     * the delta size.
39613944Sodanrc@yahoo.com.br     */
39713944Sodanrc@yahoo.com.br    void calculateCompressedSize() override;
39813944Sodanrc@yahoo.com.br
39913944Sodanrc@yahoo.com.br  public:
40013944Sodanrc@yahoo.com.br    /**
40113944Sodanrc@yahoo.com.br     * Default constructor.
40213944Sodanrc@yahoo.com.br     *
40313944Sodanrc@yahoo.com.br     * @param encoding The encoding value for this compressor.
40413944Sodanrc@yahoo.com.br     * @param blk_size Size of a cache line in bytes.
40513944Sodanrc@yahoo.com.br     * @param max_num_bases Maximum number of bases allowed to be stored.
40613944Sodanrc@yahoo.com.br     */
40713944Sodanrc@yahoo.com.br    BDICompDataBaseDelta(const uint8_t encoding, const std::size_t blk_size,
40813944Sodanrc@yahoo.com.br        const std::size_t max_num_bases = BDI_DEFAULT_MAX_NUM_BASES);
40913944Sodanrc@yahoo.com.br
41013944Sodanrc@yahoo.com.br    /**
41113944Sodanrc@yahoo.com.br     * Get and decompress data at given index.
41213944Sodanrc@yahoo.com.br     *
41313944Sodanrc@yahoo.com.br     * @param index The index of the compressed data.
41413944Sodanrc@yahoo.com.br     * @return Decompressed data for the given index.
41513944Sodanrc@yahoo.com.br     */
41613944Sodanrc@yahoo.com.br    uint64_t access(const int index) const override;
41713944Sodanrc@yahoo.com.br
41813944Sodanrc@yahoo.com.br    /**
41913944Sodanrc@yahoo.com.br     * Apply base delta compression.
42013944Sodanrc@yahoo.com.br     *
42113944Sodanrc@yahoo.com.br     * @param data The data on which compression was applied.
42213944Sodanrc@yahoo.com.br     * @param blk_size Size of a cache line in bytes.
42313944Sodanrc@yahoo.com.br     * @return True on success.
42413944Sodanrc@yahoo.com.br     */
42513944Sodanrc@yahoo.com.br    bool compress(const uint64_t* data, const std::size_t blk_size);
42613944Sodanrc@yahoo.com.br};
42713944Sodanrc@yahoo.com.br
42813944Sodanrc@yahoo.com.br#endif //__MEM_CACHE_COMPRESSORS_BDI_HH__
429