9 template <u
int32_t SETS, u
int32_t WAYS>
24 uint64_t
set_index(uint64_t ip) {
return ((ip >> 2) & (SETS - 1)); }
28 for (uint32_t i = 0; i < WAYS; i++) {
39 for (uint32_t i = 0; i < WAYS; i++) {
56 std::cout <<
"Basic BTB sets: " << SETS <<
" ways: " << WAYS << std::endl;
57 for (uint32_t i = 0; i < SETS; i++) {
58 for (uint32_t j = 0; j < WAYS; j++) {
68 std::pair<uint64_t, uint8_t>
predict(uint64_t ip) {
70 if (btb_entry == NULL) {
75 return std::make_pair(btb_entry->target, btb_entry->branch_info);
80 if (btb_entry == NULL) {
81 if ((branch_target == 0) || !taken) {
87 btb_entry->ip_tag = ip;
92 if (branch_target != 0) btb_entry->target = branch_target;
#define BRANCH_INFO_ALWAYS_TAKEN
Definition: branch_info.h:6
#define BRANCH_INFO_INDIRECT
Definition: branch_info.h:4
#define BRANCH_INFO_CONDITIONAL
Definition: branch_info.h:7
#define BRANCH_INFO_RETURN
Definition: branch_info.h:5
Definition: basic_btb.h:10
void initialize()
Definition: basic_btb.h:55
uint64_t set_index(uint64_t ip)
Definition: basic_btb.h:24
void update(uint64_t ip, uint64_t branch_target, uint8_t taken, uint8_t branch_type)
Definition: basic_btb.h:78
uint64_t lru_counter
Definition: basic_btb.h:22
ENTRY * get_lru_entry(uint64_t set)
Definition: basic_btb.h:36
ENTRY basic_btb[SETS][WAYS]
Definition: basic_btb.h:21
void update_lru(ENTRY *btb_entry)
Definition: basic_btb.h:48
std::pair< uint64_t, uint8_t > predict(uint64_t ip)
Definition: basic_btb.h:68
ENTRY * find_entry(uint64_t ip)
Definition: basic_btb.h:26
branch_type
Definition: instruction.h:30
@ BRANCH_INDIRECT_CALL
Definition: instruction.h:36
@ BRANCH_RETURN
Definition: instruction.h:37
@ BRANCH_CONDITIONAL
Definition: instruction.h:34
@ BRANCH_INDIRECT
Definition: instruction.h:33
Definition: basic_btb.h:14
uint64_t target
Definition: basic_btb.h:16
uint8_t branch_info
Definition: basic_btb.h:17
uint64_t lru
Definition: basic_btb.h:18
uint64_t ip_tag
Definition: basic_btb.h:15