Базовый BTB довольно прост и эквивалентен
BTBEntry be = BTB[curAddr & BTBBitMask];
nextFetch = be.addr;
, который реализован в виде электроники, которая берет младшие биты curAddr, передает их в память BTB и выдает следующий адрес.
И когда ветвь разрешается, результат записывается обратно в BTB.
Поиск может быть выполнен параллельно с извлечением памяти и должен быть быстрее, поскольку должны быть выполнены дополнительные шаги.
struct BTBEntry {
int addr;
int curAddr; // upper address bits.
}
Чтобы не просто случайно перепрыгнуть в программе из-за сохраненного адреса, не соответствующего curAddr, нам также нужно проверить, является ли адрес, который мы ищем, для правильной ветви.
if ((curAddr & ~BTBBitMask) == be.curAddr)
nextFetch = be.addr; // found in the BTB
else
nextFetch = curAddr + instrutionSize; // not found, take next instruction
Так что это может быть сделано, если BTB достаточно мал и общее время используется меньше, чем выборка инструкции.Но эффект может быть не таким большим, как вы могли бы хотеть.