diff options
Diffstat (limited to 'src/cpu/pred')
-rw-r--r-- | src/cpu/pred/btb.cc | 28 | ||||
-rw-r--r-- | src/cpu/pred/btb.hh | 17 | ||||
-rw-r--r-- | src/cpu/pred/ras.cc | 15 | ||||
-rw-r--r-- | src/cpu/pred/ras.hh | 12 |
4 files changed, 35 insertions, 37 deletions
diff --git a/src/cpu/pred/btb.cc b/src/cpu/pred/btb.cc index c6a5e23f9..e87cc6dc2 100644 --- a/src/cpu/pred/btb.cc +++ b/src/cpu/pred/btb.cc @@ -68,25 +68,25 @@ DefaultBTB::reset() inline unsigned -DefaultBTB::getIndex(const Addr &inst_PC) +DefaultBTB::getIndex(Addr instPC) { // Need to shift PC over by the word offset. - return (inst_PC >> instShiftAmt) & idxMask; + return (instPC >> instShiftAmt) & idxMask; } inline Addr -DefaultBTB::getTag(const Addr &inst_PC) +DefaultBTB::getTag(Addr instPC) { - return (inst_PC >> tagShiftAmt) & tagMask; + return (instPC >> tagShiftAmt) & tagMask; } bool -DefaultBTB::valid(const Addr &inst_PC, ThreadID tid) +DefaultBTB::valid(Addr instPC, ThreadID tid) { - unsigned btb_idx = getIndex(inst_PC); + unsigned btb_idx = getIndex(instPC); - Addr inst_tag = getTag(inst_PC); + Addr inst_tag = getTag(instPC); assert(btb_idx < numEntries); @@ -102,12 +102,12 @@ DefaultBTB::valid(const Addr &inst_PC, ThreadID tid) // @todo Create some sort of return struct that has both whether or not the // address is valid, and also the address. For now will just use addr = 0 to // represent invalid entry. -Addr -DefaultBTB::lookup(const Addr &inst_PC, ThreadID tid) +TheISA::PCState +DefaultBTB::lookup(Addr instPC, ThreadID tid) { - unsigned btb_idx = getIndex(inst_PC); + unsigned btb_idx = getIndex(instPC); - Addr inst_tag = getTag(inst_PC); + Addr inst_tag = getTag(instPC); assert(btb_idx < numEntries); @@ -121,14 +121,14 @@ DefaultBTB::lookup(const Addr &inst_PC, ThreadID tid) } void -DefaultBTB::update(const Addr &inst_PC, const Addr &target, ThreadID tid) +DefaultBTB::update(Addr instPC, const TheISA::PCState &target, ThreadID tid) { - unsigned btb_idx = getIndex(inst_PC); + unsigned btb_idx = getIndex(instPC); assert(btb_idx < numEntries); btb[btb_idx].tid = tid; btb[btb_idx].valid = true; btb[btb_idx].target = target; - btb[btb_idx].tag = getTag(inst_PC); + btb[btb_idx].tag = getTag(instPC); } diff --git a/src/cpu/pred/btb.hh b/src/cpu/pred/btb.hh index 6557522e0..814b23872 100644 --- a/src/cpu/pred/btb.hh +++ b/src/cpu/pred/btb.hh @@ -31,8 +31,10 @@ #ifndef __CPU_O3_BTB_HH__ #define __CPU_O3_BTB_HH__ +#include "arch/types.hh" #include "base/misc.hh" #include "base/types.hh" +#include "config/the_isa.hh" class DefaultBTB { @@ -41,14 +43,13 @@ class DefaultBTB { BTBEntry() : tag(0), target(0), valid(false) - { - } + {} /** The entry's tag. */ Addr tag; /** The entry's target. */ - Addr target; + TheISA::PCState target; /** The entry's thread id. */ ThreadID tid; @@ -74,21 +75,21 @@ class DefaultBTB * @param tid The thread id. * @return Returns the target of the branch. */ - Addr lookup(const Addr &inst_PC, ThreadID tid); + TheISA::PCState lookup(Addr instPC, ThreadID tid); /** Checks if a branch is in the BTB. * @param inst_PC The address of the branch to look up. * @param tid The thread id. * @return Whether or not the branch exists in the BTB. */ - bool valid(const Addr &inst_PC, ThreadID tid); + bool valid(Addr instPC, ThreadID tid); /** Updates the BTB with the target of a branch. * @param inst_PC The address of the branch being updated. * @param target_PC The target address of the branch. * @param tid The thread id. */ - void update(const Addr &inst_PC, const Addr &target_PC, + void update(Addr instPC, const TheISA::PCState &targetPC, ThreadID tid); private: @@ -96,13 +97,13 @@ class DefaultBTB * @param inst_PC The branch to look up. * @return Returns the index into the BTB. */ - inline unsigned getIndex(const Addr &inst_PC); + inline unsigned getIndex(Addr instPC); /** Returns the tag bits of a given address. * @param inst_PC The branch's address. * @return Returns the tag bits. */ - inline Addr getTag(const Addr &inst_PC); + inline Addr getTag(Addr instPC); /** The actual BTB. */ std::vector<BTBEntry> btb; diff --git a/src/cpu/pred/ras.cc b/src/cpu/pred/ras.cc index 6373e5de3..0ba09bfae 100644 --- a/src/cpu/pred/ras.cc +++ b/src/cpu/pred/ras.cc @@ -34,13 +34,8 @@ void ReturnAddrStack::init(unsigned _numEntries) { numEntries = _numEntries; - usedEntries = 0; - tos = 0; - addrStack.resize(numEntries); - - for (unsigned i = 0; i < numEntries; ++i) - addrStack[i] = 0; + reset(); } void @@ -49,11 +44,11 @@ ReturnAddrStack::reset() usedEntries = 0; tos = 0; for (unsigned i = 0; i < numEntries; ++i) - addrStack[i] = 0; + addrStack[i].set(0); } void -ReturnAddrStack::push(const Addr &return_addr) +ReturnAddrStack::push(const TheISA::PCState &return_addr) { incrTos(); @@ -76,9 +71,9 @@ ReturnAddrStack::pop() void ReturnAddrStack::restore(unsigned top_entry_idx, - const Addr &restored_target) + const TheISA::PCState &restored) { tos = top_entry_idx; - addrStack[tos] = restored_target; + addrStack[tos] = restored; } diff --git a/src/cpu/pred/ras.hh b/src/cpu/pred/ras.hh index a36faf79a..ab92b34c2 100644 --- a/src/cpu/pred/ras.hh +++ b/src/cpu/pred/ras.hh @@ -33,7 +33,9 @@ #include <vector> +#include "arch/types.hh" #include "base/types.hh" +#include "config/the_isa.hh" /** Return address stack class, implements a simple RAS. */ class ReturnAddrStack @@ -52,7 +54,7 @@ class ReturnAddrStack void reset(); /** Returns the top address on the RAS. */ - Addr top() + TheISA::PCState top() { return addrStack[tos]; } /** Returns the index of the top of the RAS. */ @@ -60,7 +62,7 @@ class ReturnAddrStack { return tos; } /** Pushes an address onto the RAS. */ - void push(const Addr &return_addr); + void push(const TheISA::PCState &return_addr); /** Pops the top address from the RAS. */ void pop(); @@ -68,9 +70,9 @@ class ReturnAddrStack /** Changes index to the top of the RAS, and replaces the top address with * a new target. * @param top_entry_idx The index of the RAS that will now be the top. - * @param restored_target The new target address of the new top of the RAS. + * @param restored The new target address of the new top of the RAS. */ - void restore(unsigned top_entry_idx, const Addr &restored_target); + void restore(unsigned top_entry_idx, const TheISA::PCState &restored); bool empty() { return usedEntries == 0; } @@ -85,7 +87,7 @@ class ReturnAddrStack { tos = (tos == 0 ? numEntries - 1 : tos - 1); } /** The RAS itself. */ - std::vector<Addr> addrStack; + std::vector<TheISA::PCState> addrStack; /** The number of entries in the RAS. */ unsigned numEntries; |