Branches that talk to each other: correlating and two-level predictors
After this lesson you will fill the prediction table of a (1,1) or (2,2) correlating predictor cycle by cycle, say which predictor can learn a loop exit and why, and explain what gshare's XOR buys.
Two branches, one after the other, test the same variable d, which alternates 2, 0, 2, 0. Give each branch its own one-bit history entry, as lesson 5 did, and watch: 0 of 8 predictions right. A coin would do better.
Now add one bit of information — not about this branch, but the outcome of the branch executed just before. After two warm-up misses it never misses again: 8 of 8 on every later pass. Where did that information come from, if the branch's own history was worthless?
Two branches, one variable: where the per-branch table goes blind
Recall from lesson 5: a branch history table (BHT) is indexed by the low-order PC bits, has no tags, and holds a tiny state machine per entry — one bit or two (Strongly/Weakly Taken, Weakly/Strongly Not Taken) — whose state is the prediction; the branch target buffer (BTB) is the tagged cache that supplies where to fetch when the prediction says Taken.
Every BHT entry looks at one thing, that branch's own past. The notes open §2.6.4 (p. 65) with the simplest case where that is not enough:
if (x > 0) // Branch A
...
if (x > 0) // Branch B
...
Branch B behaves like Branch A because both test the same condition, and "a normal predictor doesn't know this. It treats A and B independently" (p. 65). Hennessy and Patterson sharpen the example with a variable that changes between the tests — in RISC-V in the book, here in the papers' mnemonics, with d in R1 and R0 as the zero register:
BNE R1, R0, L1 ; b1: taken if d != 0
ADDUI R1, R0, 1 ; d = 1
L1: SUBI R3, R1, 1 ; R3 = d - 1
BNE R3, R0, L2 ; b2: taken if d != 1
...
L2:
Three cases. d = 0: b1 not taken, d becomes 1, b2 not taken. d = 1: b1 taken, b2 not taken. d = 2: both taken. So if b1 is not taken, b2 is certainly not taken — a correlation no per-branch counter can see. Let d alternate 2, 0, 2, 0 and give each branch a 1-bit entry initialised Not Taken; the prediction is the bit before the branch, the bit after is the outcome.
d = 2, 0, 2, 0: every prediction is one step behind.| d | b1 prediction | b1 outcome | b1 bit after | b2 prediction | b2 outcome | b2 bit after |
|---|---|---|---|---|---|---|
| 2 | NT | T | T | NT | T | T |
| 0 | T | NT | NT | T | NT | NT |
| 2 | NT | T | T | NT | T | T |
| 0 | T | NT | NT | T | NT | NT |
Eight predictions, eight misses: the bit always holds the previous outcome and the pattern flips every time. What decides b2 is not what b2 did last time but what b1 did a moment ago.
Before: one entry per branch
After: one entry per (branch, last outcome)
The right panel is the notes' (1,1) correlating predictor (p. 67): a 1-bit global history stores the last branch outcome and selects one of two 1-bit tables (T1 if the last branch was taken, T2 if not); the low-order PC bits index the selected table. Each branch now has two entries, written below as "if last NT / if last T", all initialised NT; the history starts at NT.
| d | GH before b1 | b1 entries | b1 pred. | b1 outcome | GH before b2 | b2 entries | b2 pred. | b2 outcome |
|---|---|---|---|---|---|---|---|---|
| 2 | NT | NT / NT | NT (miss) | T | T | NT / NT | NT (miss) | T |
| 0 | T | T / NT | NT | NT | NT | NT / T | NT | NT |
| 2 | NT | T / NT | T | T | T | NT / T | T | T |
| 0 | T | T / NT | NT | NT | NT | NT / T | NT | NT |
Two misses, both on cold entries, then a perfect record. The column "GH before b1" is b2's previous outcome, which encodes the previous value of d: b1 is predicted from the last b2, b2 from the current b1 — the two branches predict each other.
Correlating predictor (also two-level predictor) — a dynamic predictor that selects the counter by the branch address and the recent history of branch outcomes, one counter per (branch, context). The notes' key idea (p. 65): "use global branch history (outcomes of previous branches) to improve prediction for the current branch".
A per-branch counter answers "what did this branch do last time?"; a correlating predictor answers "what did this branch do last time it was in this situation?"
The (m, n) predictor: a history register that picks the table
Generalise the right panel of Fig. 1 and you get the notes' general case (p. 65): in an (m, n) correlating predictor the outcomes of the last m branches select one of \(2^m\) prediction tables of n-bit entries. The four steps, in the order the hardware takes them:
- Track the last m branches: their outcomes, in program order, whichever branches they were, are shifted into an m-bit Global History Register (GHR), Taken = 1, Not Taken = 0.
- Select a table: the GHR value picks one of the \(2^m\) tables.
- Index it with k low-order bits of the branch PC.
- Predict with the n-bit entry — the last outcome (n = 1) or the four-state machine of lesson 5 (n = 2); after the branch resolves, update the entry and shift the outcome into the GHR.
Why a real core shifts the predicted outcome in, not the resolved one
Background, not in the notes: the next branch is fetched long before this one resolves, so a GHR updated only at resolution would lag by the pipeline depth and the next prediction would read a stale history. Real cores shift the predicted outcome in at fetch and repair the register on a misprediction. The notes (p. 71) and the exam tables update at resolution: keep that convention on paper.
In memory (p. 66): \(2^m\) tables of \(2^k\) entries of n bits. The plain 2-bit BHT of lesson 5 is the (0, 2) predictor of this family — no history bits, one table. And the tables, selected by the GHR and indexed by the PC, are one table of \(2^{m+k}\) entries indexed by the concatenation of the GHR and the PC bits.
- \(m\)
- global history bits (outcomes of the last m branches)
- \(n\)
- bits per entry: 1 (last outcome) or 2 (the four states)
- \(k\)
- low-order PC bits used to index a table
- \(\Vert\)
- concatenation: GHR as the upper m bits, the k PC bits as the lower ones — an index of m + k bits
The shift convention, and the (2,2) walkthrough done right
An exercise is only as right as its shift convention. The notes' (p. 69), for m = 2: 00 both Not Taken; 01 last Taken, penultimate Not Taken; 10 last Not Taken, penultimate Taken; 11 both Taken — shift left, newest outcome on the right. The opposite convention exists elsewhere, so state yours at the top of an exercise.
- \(o\)
- the outcome just resolved: 1 for Taken, 0 for Not Taken
- \(\ll 1\)
- shift left by one bit; the oldest bit falls out on the left
Now the notes' (2,2) example (pp. 69–70): branches A, B and C in program order, outcomes Taken, Not Taken, Taken; four tables of 2-bit counters, one per GHR value; GHR starting at 00. Each branch is predicted from the table the GHR selects at that moment, the entry is updated, the outcome shifted in — Table 3. For C the notes assume Weakly Taken in table 10: Taken is predicted and is right; the entry moves to Strongly Taken, the GHR becomes 01 again.
| Cycle | Branch | GHR before | Table used (predict and update) | Outcome | GHR after |
|---|---|---|---|---|---|
| 1 | A | 00 | BHT[00] | T | 01 |
| 2 | B | 01 | BHT[01] | NT | 10 |
| 3 | C | 10 | BHT[10] | T | 01 |
Each (branch, context) pair has its own counter, which converges where a single counter would flip-flop; and because the history also holds the branch's own previous outcomes, b1 was fixed in Table 2 although it comes first. Pan, So and Rahmeh, who published the scheme in 1992, priced it at "up to 11% additional accuracy at the extra hardware cost of one shift register".
Same budget, two designs
History bits are not free: tables multiply as \(2^m\), each context must be trained, and distant outcomes are mostly noise. The honest comparison is at equal storage, as Hennessy and Patterson make it on SPEC89.
A (2,2) predictor with 1024 entries per table: \(2^m \cdot n \cdot 2^k = 4 \cdot 2 \cdot 1024\).
\[ \text{storage} = 8192 \text{ bits} = 1 \text{ KB} \]A plain 2-bit BHT — the (0,2) predictor — with the same 8192 bits holds 8192 / 2 entries.
\[ \text{entries} = 4096 \]Their SPEC89 measurement (background from the textbook): the (2,2) with 1024 entries per table mispredicts less than the 4096-entry 2-bit BHT, and even than one with unlimited entries (
eqntott: about 6 % against 18 %). Unlimited entries remove aliasing, not the lack of context.The address of an entry in the single-table view: GHR =
\[ \text{index} = 10\,\Vert\,1011 = 101011_2 = 43 \]10, PC bits =1011, k = 4.
Two levels: a history register and a pattern table — global or local
Yeh and Patt gave the family its general shape in 1991; the notes present it as two-level adaptive branch prediction (p. 71): a history-tracking component and a pattern-based prediction component, with the exam vocabulary of both:
- A Branch History Register (BHR): a shift register of the most recent outcomes — "k-bit" in the notes' letter; this lesson writes h for the history length and keeps k for the PC bits. Global — one register for all branches, the GHR above — or local, "separate register for each branch": in hardware, a table of history registers indexed by the PC.
- A Pattern History Table (PHT): a table of 2-bit saturating counters, indexed with the content of the BHR.
The process (p. 71): index the PHT with the BHR, read the counter, predict Taken if it is in a Taken state; afterwards update the counter and shift the outcome in. The (m, n) predictor is one member — global history, table by history, row by PC; the variants differ only in whose history (global or local) and how the PHT is indexed (history alone, history ‖ PC, history ⊕ PC).
Global: one register, all branches
Local: one register per branch
What local history buys: the loop exit
The loop of the June 2025 paper, whose 2-bit table lesson 5 filled in, runs five iterations: the BNE goes T T T T NT, and again on the next execution.
LOOP: LD F0, 0(R1)
FADD F2, F0, F0
SD F2, 0(R1)
ADDUI R1, R1, 4
BNE R1, R2, LOOP ; R1 = 0, R2 = 20: T T T T NT
A 2-bit counter mispredicts the exit every time: it holds a bias, and no counter can express "after four taken comes a not-taken". Yet the exit comes at the same place in every pass. A local history of 4 bits makes it visible: before the fifth iteration the branch's own history is 1111, before the first 1110, and each context gets its own counter. The smallest example that fits in a table: a 3-iteration loop, pattern T T NT, 2 bits of local history (older, newer), counters initialised Weakly Taken:
T T NT, four times over (recomputed). History before step 1: T,T.| step | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 |
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| history | T,T | T,T | T,T | T,NT | NT,T | T,T | T,NT | NT,T | T,T | T,NT | NT,T | T,T |
| its counter | WT | ST | ST | WT | WT | WT | ST | ST | WNT | ST | ST | SNT |
| prediction | T | T | T | T | T | T | T | T | NT | T | T | NT |
| outcome | T | T | NT | T | T | NT | T | T | NT | T | T | NT |
| result | hit | hit | miss | hit | hit | miss | hit | hit | hit | hit | hit | hit |
Two warm-up misses while the counter of context "T,T" is dragged from Weakly Taken to Weakly Not Taken, then nothing: three contexts, three converged counters, the pattern memorised. A plain 2-bit counter on the same stream, started Strongly Taken, misses every third execution for ever — 4 of 12. The rule:
- \(h\)
- bits of local history
- \(N\)
- iterations of the loop (the branch is taken N − 1 times, then not taken)
With h ≥ N − 1 every position in the pattern has its own history, so after warm-up the exit is predicted like the others. A global register can do the same only if the loop body holds no other branch; otherwise their outcomes dilute the pattern — the reason tournament designs such as the Alpha 21264 of 1998 keep both kinds. Yeh and Patt's 1991 figure: "97 percent accuracy on nine of the ten SPEC benchmarks, compared to less than 93 percent for other schemes".
Time to race them. The arena feeds one stream to eight predictors, from the two static rules and the BHTs of lesson 5 to the (1,1), the (2,2), gshare and a local two-level predictor with h history bits. Counters start Strongly Not Taken (the June 2025 initialisation), 1-bit entries Not Taken, histories at 0; a toggle switches the 2-bit entries from the saturating counter (pp. 69, 71) to the four-state figure of p. 59.
What the papers ask: counting accesses, initialisation and size
Three exam habits, all in the May 2025 midterm (notes pp. 538–541; quiz texts are the paper's, solutions the note author's, recomputed here).
Habit 1: count the executions of the branch, not the iterations
Quiz 5 gives a top-tested loop and a 1-entry 1-bit BHT initialised Taken, and asks how many BHT accesses and mispredictions, "assuming only the branch instruction accesses the BHT":
ADDI R1, R0, 0
ADDI R2, R0, 100
LOOP: BEQ R1, R2, DONE
ADD R5, R5, R4
ADDI R1, R1, 1
J LOOP
DONE:
The BEQ executes for R1 = 0, 1, …, 100 — the exit test is the 101st execution; the unconditional J does not touch the BHT. Outcomes: Not Taken 100 times, then Taken.
| access | R1 | prediction | outcome | result | bit after |
|---|---|---|---|---|---|
| 1 | 0 | T (initial) | NT | miss | NT |
| 2 to 100 | 1 to 99 | NT | NT | 99 hits | NT |
| 101 | 100 | NT | T | miss | T |
Two mispredictions — one artificial (initialisation), one real (exit) — in 101 accesses; the bottom-tested loop of June 2025 executes its BNE five times for five iterations. The rule: branch at the bottom, N executions; test at the top, N + 1.
Habit 2: initialisation and size both change the count
Quiz 4 — "the number of mispredictions depends on the initialization and the size of the Branch History Table", true or false, motivate: true, for two reasons the motivation must name. Initialisation sets the start-up misses: a 2-bit entry started Strongly Not Taken misses twice before predicting a loop branch Taken (the 60 % of June 2025), started Strongly Taken it misses none. Size sets aliasing: no tags, so a small table lets unrelated branches overwrite each other's state (Fig. 4, right).
Any predictor table: state before each execution, prediction from it, outcome, hit or miss, update, shift — and the misprediction rate divides by the executions, warm-up included; the "state left in the BHT" is the state after the last update, one transition past the last row.
Habit 3: from accuracy to CPI
Quiz 6, third statement: "The introduction of dynamic branch predictors improves the CPI metric." True, by the formula the notes give on p. 541 — copy it onto your A4 sheet, since the course's example sheet has no branch formula at all.
- \(f_b\)
- branch frequency: fraction of executed instructions that are branches
- \(a\)
- prediction accuracy; \(1 - a\) is the misprediction rate
- \(P\)
- misprediction penalty in cycles: 1 in the course pipeline, where the branch is resolved in ID; 7 at least and about 11 on average on the Alpha 21264, around 20 on the deepest pipelines
A better predictor changes only \(a\); the penalty belongs to the pipeline — and that is why the percentage points matter: at \(f_b = 0.2\) the step from 90 % to 97 % accuracy is worth 0.014 CPI with \(P = 1\) and 0.28 with \(P = 20\).
The bridge to speculation
The June 2026 open question pairs "dynamic branch prediction" with "speculative execution". A prediction is only useful if the processor acts on it before the branch resolves — fetching, issuing, even executing the instructions after it. They must not touch registers or memory until the branch is known: their results wait in the reorder buffer; on a misprediction every entry younger than the branch is flushed, nothing architectural is undone, the PC is set right and fetch resumes. Lessons 5 and 6 decide how often that happens; lesson 17 builds the buffer.
Exam-style questions
Explain the main concepts of the correlating branch prediction technique and its benefits with respect to a standard Branch History Table.
Show model answer
A standard BHT predicts each branch from its own past only. A correlating (two-level) predictor also uses the outcomes of the branches executed just before it: an m-bit Global History Register, a shift register holding the last m outcomes (1 = Taken), selects one of 2^m tables of n-bit entries (1-bit, or the 2-bit states Strongly/Weakly Taken, Weakly/Strongly Not Taken), and the k low-order bits of the branch PC select the entry inside the selected table. Equivalently the GHR concatenated with the PC bits forms one index of m + k bits into a single table; gshare XORs the history with the PC bits instead, to spread the branches over the whole table and reduce aliasing. After the branch resolves, the entry is updated and the outcome is shifted into the GHR. The benefit: each (branch, recent context) pair has its own counter, so a branch whose outcome depends on previous branches — or on its own recent pattern, such as a loop exit — is predicted correctly after warm-up, where a per-branch counter flip-flops; H&P show a (2,2) predictor of 8 Kbit mispredicting less than a 2-bit BHT with unlimited entries. The cost is one shift register, 2^m × n × 2^k bits of tables, a longer warm-up (every context must be trained) and aliasing in the pattern table.
The wording is the fourth sub-point of Q2 of the January 2026 paper in the notes (p. 498); in the June 2026 format the same material sits inside the sub-point "dynamic branch prediction and speculative execution" of the 8-point question — about five lines either way. The examiner looks for the three mechanisms (history register, table selection, PC indexing), the update rule, the "separate counter per context" argument and one concrete benefit. Naming gshare's XOR earns the aliasing point; the January 2026 solution in the notes mentions "concatenating or XORing", so both words belong in the answer.
Consider the code BNE R1, R0, L1; ADDUI R1, R0, 1; L1: SUBI R3, R1, 1; BNE R3, R0, L2, where the first branch (b1) is taken if d = R1 is not 0 and the second (b2) is taken if d is not 1. The code is executed with d = 2, 0, 2, 0. (a) Fill the prediction table for a 1-bit predictor per branch, both entries initialised Not Taken. (b) Fill it for a (1,1) correlating predictor whose entries (one per branch and per value of the 1-bit global history) are initialised Not Taken, with the global history initialised Not Taken. (c) Count the mispredictions of each and explain the difference.
Show model answer
(a) 1-bit per branch (prediction = bit before, bit after = outcome):
| d | b1 pred. | b1 outcome | b2 pred. | b2 outcome |
|---|---|---|---|---|
| 2 | NT (miss) | T | NT (miss) | T |
| 0 | T (miss) | NT | T (miss) | NT |
| 2 | NT (miss) | T | NT (miss) | T |
| 0 | T (miss) | NT | T (miss) | NT |
(b) (1,1) predictor, entries written "if last NT / if last T":
| d | GH before b1 | b1 entries | b1 pred. | b1 outcome | GH before b2 | b2 entries | b2 pred. | b2 outcome |
|---|---|---|---|---|---|---|---|---|
| 2 | NT | NT/NT | NT (miss) | T | T | NT/NT | NT (miss) | T |
| 0 | T | T/NT | NT | NT | NT | NT/T | NT | NT |
| 2 | NT | T/NT | T | T | T | NT/T | T | T |
| 0 | T | T/NT | NT | NT | NT | NT/T | NT | NT |
(c) 8 of 8 mispredicted against 2 of 8. The 1-bit entry always holds the previous outcome, and the outcomes alternate, so it is always one step behind. In the (1,1) predictor the global history bit selects a different entry for "after a taken branch" and "after a not-taken branch": in this code b1 not taken implies b2 not taken and b1 taken implies b2 taken, so each context converges after one miss; b1 is predicted from the previous b2, whose outcome encodes the previous value of d. Only the two cold entries miss.
Marks go to the correct shift of the history (it holds the last outcome, whichever branch produced it), to the two cold-entry misses being the only ones, and to the explanation in (c). A frequent slip: predicting b2 from b2's own previous outcome instead of from the entry the history selects.
A (2,2) correlating predictor has 1024 entries per table. How many bits of prediction storage does it use?
Show model answer
that is 1 KB; a plain 2-bit BHT with the same budget would have 4096 entries.
The m history bits multiply the tables, they do not add bits to an entry: 2^m tables, each of 2^k entries of n bits.
Consider the following assembly code executed by a processor with a 1-entry 1-bit Branch History Table initialised as Taken: ADDI R1, R0, 0; ADDI R2, R0, 100; LOOP: BEQ R1, R2, DONE; ADD R5, R5, R4; ADDI R1, R1, 1; J LOOP; DONE:. Assuming only the branch instruction accesses the BHT, how many accesses to the Branch History Table and how many mispredictions? (Single answer)
Show model answer
Answer 1. Executions of BEQ: R1 = 0, 1, …, 100 → 101 accesses. Predict Taken at R1 = 0: outcome Not Taken, miss, bit → NT. R1 = 1 … 99: predict NT, outcome NT, 99 hits. R1 = 100: predict NT, outcome Taken, miss. Two mispredictions.
The midterm's quiz, recomputed. The two misses are the two changes of direction the 1-bit entry sees — one artificial (initialisation), one real (exit).
During the execution of a program, the number of mispredictions depends on the initialization and the size of the Branch History Table (BHT). True or False? Motivate your answer.
Show model answer
True. (1) Initialisation: the initial state of the entries decides whether the first executions of each branch are predicted right — a 2-bit entry initialised Strongly Not Taken mispredicts the first two taken executions of a loop branch, initialised Strongly Taken it mispredicts none; these start-up misses count in the misprediction rate. (2) Size: the BHT is indexed by the low-order PC bits without tags, so with a small table different branches map to the same entry (aliasing) and interfere, each spoiling the other's state; a larger table reduces the collisions.
Two separate reasons, each with its mechanism, is what the extra "motivate" point pays for. Adding that the counter type (1 bit or 2) and the program's patterns also matter does not hurt.
A loop of 10 iterations, whose body contains no other branch, is executed many times. Which predictor can reach 100 % accuracy on its loop branch after warm-up, exit included? (Single answer)
Show model answer
Answer 3. The exit is predictable because it comes at a fixed position; only a history long enough to distinguish "nine taken in a row" from the earlier positions can represent it, which is what a local (or, with no other branch in the body, global) history of at least 9 bits does. Counters of any size and static rules cannot.
The examiner is checking the difference between bias (what a counter stores) and pattern (what a history register stores).
Check yourself
In Table 2 the (1,1) predictor also fixes b1, although b1 comes first and nothing precedes it in the code. Why?
With the notes' convention, after the outcomes Not Taken then Taken (in this order) a 2-bit GHR holds…
A loop of 6 iterations is executed many times. Which predictors can learn its exit after warm-up? Select all that apply.
The question behind the question: bias (a counter) against pattern (a history). Only enough history bits capture a pattern, and global history only counts as "this branch's" when nothing else in the body dilutes it.
gshare XORs the history with the PC bits instead of concatenating them. What does that buy, with the same index width?
Two branches share an entry of an untagged BHT; two addresses share a set of a tagged cache. In which case can the program compute a wrong result?
In the arena the (2,2) predictor needs two passes of the H&P stream to become perfect, where the (1,1) needs one. What is the reason?
Inside a loop body, a branch is taken exactly when the branch three instructions earlier was taken. Which kind of history can see that?
Key take-aways
- A per-branch counter answers "what did this branch do last time?"; it is blind to other branches and to patterns, so two branches testing an alternating variable give 0 of 8 right, and a loop exit is missed every pass.
- A correlating, or two-level, predictor keeps a separate counter for each (branch, recent context): an m-bit Global History Register selects one of \(2^m\) tables of n-bit entries, the k low-order PC bits select the row — equivalently one table indexed by GHR ‖ PC bits, with \(2^m \cdot n \cdot 2^k\) bits in all; the plain 2-bit BHT is the (0,2) member.
- The history register shifts left and takes the newest outcome on the right (notes: 01 = last Taken, penultimate Not Taken); every exam table must state its convention and keep the "state before, prediction, outcome, update, shift" order.
- History can be global (one register, sees other branches, gets diluted by them) or local (one register per branch, selected by the PC); a local history of h ≥ N − 1 bits makes an N-iteration loop exit perfectly predictable after warm-up, which no counter can do.
- gshare indexes the PHT with history ⊕ PC bits: every branch reaches every entry and two branches never collide under the same history, so aliasing drops — it does not vanish, and the warm-up per context remains.
- Aliasing is an index collision; with a tag (cache, BTB) it costs a miss and never correctness, without a tag (BHT, PHT) it costs a wrong prediction that the pipeline catches — so size and initialisation both change the misprediction count.
- Count executions of the branch, not iterations: a top-tested loop of N iterations accesses the BHT N + 1 times; the predictor changes \(a\) in \(\text{CPI} = \text{CPI}_{\text{ideal}} + f_b (1 - a) P\), never \(P\).
What to watch and read
-
2 Bit History Predictor
Georgia Tech HPCA (Udacity), Milos Prvulovic3 min
A whiteboard clip of the local two-level idea: a per-branch history selecting a counter. Watch it after Table 4, before the arena.
-
Branch prediction
Dan Luu≈ 25 min
The whole ladder from static rules to two-level global and local, gshare, agree and hybrid predictors, with an illustrative accuracy-to-CPI table. Read it to place this lesson's predictors on the map.
-
Improving the Accuracy of Dynamic Branch Prediction Using Branch Correlation
Pan, So and Rahmeh, ASPLOS 19929 pages
The origin of the (m, n) predictor and of the if–if correlation example; the "up to 11 % at the cost of one shift register" sentence is on its first page.
-
Two-Level Adaptive Training Branch Prediction
Yeh and Patt, MICRO 199111 pages
The paper behind the BHR / PHT vocabulary of the notes' §2.6.5 and the 97 % figure quoted above; skim the figures of the two levels.
-
Combining Branch Predictors
Scott McFarling, DEC WRL TN-36, 199329 pages
Where gshare gets its name and its XOR, next to bimodal, local and the combined predictor with a chooser that the Alpha 21264 later built in silicon.