gem5 v24.0.0.0
Loading...
Searching...
No Matches
simple_indirect.hh
Go to the documentation of this file.
1/*
2 * Copyright (c) 2014 ARM Limited
3 * Copyright (c) 2022-2023 The University of Edinburgh
4 * All rights reserved
5 *
6 * The license below extends only to copyright in the software and shall
7 * not be construed as granting a license to any other intellectual
8 * property including but not limited to intellectual property relating
9 * to a hardware implementation of the functionality of the software
10 * licensed hereunder. You may use the software subject to the license
11 * terms below provided that you ensure that this notice is replicated
12 * unmodified and in its entirety in all distributions of the software,
13 * modified or unmodified, in source code or in binary form.
14 *
15 * Redistribution and use in source and binary forms, with or without
16 * modification, are permitted provided that the following conditions are
17 * met: redistributions of source code must retain the above copyright
18 * notice, this list of conditions and the following disclaimer;
19 * redistributions in binary form must reproduce the above copyright
20 * notice, this list of conditions and the following disclaimer in the
21 * documentation and/or other materials provided with the distribution;
22 * neither the name of the copyright holders nor the names of its
23 * contributors may be used to endorse or promote products derived from
24 * this software without specific prior written permission.
25 *
26 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
27 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
28 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
29 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
30 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
31 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
32 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
33 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
34 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
35 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
36 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
37 */
38
39#ifndef __CPU_PRED_INDIRECT_HH__
40#define __CPU_PRED_INDIRECT_HH__
41
42#include <deque>
43
44#include "base/statistics.hh"
45#include "cpu/inst_seq.hh"
46#include "cpu/pred/indirect.hh"
47#include "params/SimpleIndirectPredictor.hh"
48
49namespace gem5
50{
51
52namespace branch_prediction
53{
54
56{
57 public:
58 SimpleIndirectPredictor(const SimpleIndirectPredictorParams &params);
59
61 void reset() override;
62
63 const PCStateBase * lookup(ThreadID tid, InstSeqNum sn,
64 Addr pc, void * &iHistory) override;
65 void update(ThreadID tid, InstSeqNum sn, Addr pc, bool squash,
66 bool taken, const PCStateBase& target,
67 BranchType br_type, void * &iHistory) override;
68 void squash(ThreadID tid, InstSeqNum sn, void * &iHistory) override;
69 void commit(ThreadID tid, InstSeqNum sn, void * &iHistory) override;
70
71
72
77 private:
78 const bool hashGHR;
79 const bool hashTargets;
80 const unsigned numSets;
81 const unsigned numWays;
82 const unsigned tagBits;
83 const unsigned pathLength;
84 const unsigned speculativePathLength;
85 const unsigned instShift;
86 const unsigned ghrNumBits;
87 const unsigned ghrMask;
88
90 {
91 Addr tag = 0;
92 std::unique_ptr<PCStateBase> target;
93 };
94
96
97
98
100 {
101 HistoryEntry(Addr br_addr, Addr tgt_addr, InstSeqNum seq_num)
102 : pcAddr(br_addr), targetAddr(tgt_addr), seqNum(seq_num) { }
107 };
108
113 {
114 /* data */
118
121 bool hit;
122 unsigned ghr;
123 uint64_t pathHist;
124
126
128 : pcAddr(MaxAddr),
130 was_indirect(false)
131 {}
132 };
133
136 {
137 // Path history register
139 // Global direction history register
140 unsigned ghr = 0;
141 };
142
144
145
146 // ---- Internal functions ----- //
147 bool lookup(ThreadID tid, Addr br_addr,
148 PCStateBase * &target, IndirectHistory * &history);
149 void recordTarget(ThreadID tid, InstSeqNum sn,
150 const PCStateBase& target, IndirectHistory * &history);
151
152 // Helper functions to generate and modify the
153 // direction info
154 void genIndirectInfo(ThreadID tid, void* &iHistory);
155 void updateDirectionInfo(ThreadID tid, bool taken, Addr pc, Addr target);
156
157 // Helper to compute set and tag
158 inline Addr getSetIndex(Addr br_addr, ThreadID tid);
159 inline Addr getTag(Addr br_addr);
160
162 return (type == BranchType::CallIndirect) ||
163 (type == BranchType::IndirectUncond) ||
164 (type == BranchType::IndirectCond);
165 }
166
167 protected:
180};
181
182} // namespace branch_prediction
183} // namespace gem5
184
185#endif // __CPU_PRED_INDIRECT_HH__
void reset() override
Indirect predictor interface.
std::vector< std::vector< IPredEntry > > targetCache
void genIndirectInfo(ThreadID tid, void *&iHistory)
const PCStateBase * lookup(ThreadID tid, InstSeqNum sn, Addr pc, void *&iHistory) override
Predicts the indirect target of an indirect branch.
void recordTarget(ThreadID tid, InstSeqNum sn, const PCStateBase &target, IndirectHistory *&history)
void update(ThreadID tid, InstSeqNum sn, Addr pc, bool squash, bool taken, const PCStateBase &target, BranchType br_type, void *&iHistory) override
Updates the indirect predictor with history information of a branch.
gem5::branch_prediction::SimpleIndirectPredictor::IndirectStats stats
void commit(ThreadID tid, InstSeqNum sn, void *&iHistory) override
A branch gets finally commited.
void squash(ThreadID tid, InstSeqNum sn, void *&iHistory) override
Squashes a branch.
SimpleIndirectPredictor(const SimpleIndirectPredictorParams &params)
void updateDirectionInfo(ThreadID tid, bool taken, Addr pc, Addr target)
Statistics container.
Definition group.hh:93
This is a simple scalar statistic, like a counter.
STL deque class.
Definition stl.hh:44
STL vector class.
Definition stl.hh:37
const Params & params() const
Bitfield< 4 > pc
enums::BranchType BranchType
Copyright (c) 2024 - Pranith Kumar Copyright (c) 2020 Inria All rights reserved.
Definition binary32.hh:36
int16_t ThreadID
Thread index/ID type.
Definition types.hh:235
uint64_t Addr
Address type This will probably be moved somewhere else in the near future.
Definition types.hh:147
const Addr MaxAddr
Definition types.hh:171
uint64_t InstSeqNum
Definition inst_seq.hh:40
Declaration of Statistics objects.
HistoryEntry(Addr br_addr, Addr tgt_addr, InstSeqNum seq_num)
Indirect branch history information Used for prediction, update and recovery.
Per thread path and global history registers.

Generated on Tue Jun 18 2024 16:24:02 for gem5 by doxygen 1.11.0