tournament.cc (7082:070529b41c1e) tournament.cc (8463:7a48916a32a8)
1/*
2 * Copyright (c) 2004-2006 The Regents of The University of Michigan
3 * All rights reserved.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions are
7 * met: redistributions of source code must retain the above copyright
8 * notice, this list of conditions and the following disclaimer;

--- 22 unchanged lines hidden (view full) ---

31#include "base/intmath.hh"
32#include "cpu/pred/tournament.hh"
33
34TournamentBP::TournamentBP(unsigned _localPredictorSize,
35 unsigned _localCtrBits,
36 unsigned _localHistoryTableSize,
37 unsigned _localHistoryBits,
38 unsigned _globalPredictorSize,
1/*
2 * Copyright (c) 2004-2006 The Regents of The University of Michigan
3 * All rights reserved.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions are
7 * met: redistributions of source code must retain the above copyright
8 * notice, this list of conditions and the following disclaimer;

--- 22 unchanged lines hidden (view full) ---

31#include "base/intmath.hh"
32#include "cpu/pred/tournament.hh"
33
34TournamentBP::TournamentBP(unsigned _localPredictorSize,
35 unsigned _localCtrBits,
36 unsigned _localHistoryTableSize,
37 unsigned _localHistoryBits,
38 unsigned _globalPredictorSize,
39 unsigned _globalCtrBits,
40 unsigned _globalHistoryBits,
39 unsigned _globalHistoryBits,
40 unsigned _globalCtrBits,
41 unsigned _choicePredictorSize,
42 unsigned _choiceCtrBits,
43 unsigned _instShiftAmt)
44 : localPredictorSize(_localPredictorSize),
45 localCtrBits(_localCtrBits),
46 localHistoryTableSize(_localHistoryTableSize),
47 localHistoryBits(_localHistoryBits),
48 globalPredictorSize(_globalPredictorSize),

--- 193 unchanged lines hidden (view full) ---

242 // there was a prediction.
243 if (bp_history) {
244 BPHistory *history = static_cast<BPHistory *>(bp_history);
245 if (history->localPredTaken != history->globalPredTaken) {
246 // If the local prediction matches the actual outcome,
247 // decerement the counter. Otherwise increment the
248 // counter.
249 if (history->localPredTaken == taken) {
41 unsigned _choicePredictorSize,
42 unsigned _choiceCtrBits,
43 unsigned _instShiftAmt)
44 : localPredictorSize(_localPredictorSize),
45 localCtrBits(_localCtrBits),
46 localHistoryTableSize(_localHistoryTableSize),
47 localHistoryBits(_localHistoryBits),
48 globalPredictorSize(_globalPredictorSize),

--- 193 unchanged lines hidden (view full) ---

242 // there was a prediction.
243 if (bp_history) {
244 BPHistory *history = static_cast<BPHistory *>(bp_history);
245 if (history->localPredTaken != history->globalPredTaken) {
246 // If the local prediction matches the actual outcome,
247 // decerement the counter. Otherwise increment the
248 // counter.
249 if (history->localPredTaken == taken) {
250 choiceCtrs[globalHistory].decrement();
250 choiceCtrs[history->globalHistory].decrement();
251 } else if (history->globalPredTaken == taken){
251 } else if (history->globalPredTaken == taken){
252 choiceCtrs[globalHistory].increment();
252 choiceCtrs[history->globalHistory].increment();
253 }
253 }
254
254 }
255
255 }
256
257 // Update the counters and local history with the proper
258 // resolution of the branch. Global history is updated
259 // speculatively and restored upon squash() calls, so it does not
260 // need to be updated.
261 if (taken) {
262 localCtrs[local_predictor_idx].increment();
263 globalCtrs[history->globalHistory].increment();
264
265 updateLocalHistTaken(local_history_idx);
266 } else {
267 localCtrs[local_predictor_idx].decrement();
268 globalCtrs[history->globalHistory].decrement();
269
270 updateLocalHistNotTaken(local_history_idx);
271 }
272
273 bool mispredict = false;
274
275 //global predictor used and mispredicted
276 if (history->globalUsed && history->globalPredTaken != taken)
277 mispredict = true;
278 //local predictor used and mispredicted
279 else if (!history->globalUsed && history->localPredTaken != taken)
280 mispredict = true;
281
282 if (mispredict) {
283 if (taken) {
284 globalHistory = globalHistory | 1;
285 } else {
286 unsigned mask = globalHistoryMask - 1;
287 globalHistory = globalHistory & mask;
288 }
289
290 }
256 // We're done with this history, now delete it.
257 delete history;
258 }
259
260 assert(globalHistory < globalPredictorSize &&
261 local_history_idx < localHistoryTableSize &&
262 local_predictor_idx < localPredictorSize);
263
291 // We're done with this history, now delete it.
292 delete history;
293 }
294
295 assert(globalHistory < globalPredictorSize &&
296 local_history_idx < localHistoryTableSize &&
297 local_predictor_idx < localPredictorSize);
298
264 // Update the counters and local history with the proper
265 // resolution of the branch. Global history is updated
266 // speculatively and restored upon squash() calls, so it does not
267 // need to be updated.
268 if (taken) {
269 localCtrs[local_predictor_idx].increment();
270 globalCtrs[globalHistory].increment();
271
299
272 updateLocalHistTaken(local_history_idx);
273 } else {
274 localCtrs[local_predictor_idx].decrement();
275 globalCtrs[globalHistory].decrement();
276
277 updateLocalHistNotTaken(local_history_idx);
278 }
279}
280
281void
282TournamentBP::squash(void *bp_history)
283{
284 BPHistory *history = static_cast<BPHistory *>(bp_history);
285
286 // Restore global history to state prior to this branch.
287 globalHistory = history->globalHistory;
288
289 // Delete this BPHistory now that we're done with it.
290 delete history;
291}
292
293#ifdef DEBUG
294int
295TournamentBP::BPHistory::newCount = 0;
296#endif
300}
301
302void
303TournamentBP::squash(void *bp_history)
304{
305 BPHistory *history = static_cast<BPHistory *>(bp_history);
306
307 // Restore global history to state prior to this branch.
308 globalHistory = history->globalHistory;
309
310 // Delete this BPHistory now that we're done with it.
311 delete history;
312}
313
314#ifdef DEBUG
315int
316TournamentBP::BPHistory::newCount = 0;
317#endif