Записывать напрямую в буфер глобальной истории (GHB) или BTB в предсказателе ветвления ARM Cortex A8?

Мне интересно работать непосредственно с содержимым BTB (целевого буфера ветки) и GHB на Cortex A8. В руководстве ARM говорится что-то вроде:

Чтобы записать одну запись в массив GHB на стороне инструкций, например:

LDR R0, =0x3333AAAA;            
MCR p15, 0, R0, c15, c1, 0;     Move R0 to I-L1 Data 0 Register
LDR R1, =0x0000020C;            
MCR p15, 0, R1, c15, c5, 2;     Write I-L1 Data 0 Register to GHB

Чтобы прочитать одну запись в массиве GHB на стороне инструкции, например:

LDR R1, =0x0000020C;      
MCR p15, 0, R1, c15, c7, 2;     Read GHB into I-L1 Data 0 Register
MRC p15, 0, R0, c15, c1, 0;     Move I-L1 Data 0 Register to R0

Меня просто интересует формат данных. Предположительно содержимое GHB составляет 2 бита, верно? Итак, суть в том, чтобы придумать некоторый индекс для определенного из 4096 значений, загрузить этот индекс в регистр, а затем прочитать искомое значение в регистр (в примере r0).

Но мне непонятно, что это за формат. Я читал из других источников, что:

GHB индексируется 10-битной историей направления последних десяти ответвлений и 4 битами PC.

Может ли кто-нибудь помочь объяснить это немного подробнее и/или предоставить допустимый формат для фактических индексов, которые можно использовать для чтения/записи? Я собираюсь попробовать это на реальном оборудовании в ближайшее время, и, предположительно, я должен получить только 00, 01, 10 или 11 из регистра I-L1 Data 0, независимо от того, какой индекс я загружаю в r1 (как в приведенном выше примере). ), но любые дополнительные объяснения приветствуются.

(Если вы хотите дать ту же информацию о том, как индексировать BTB, это тоже было бы здорово! Инструкции для этого приведены ниже)

Чтобы записать одну запись в массив BTB на стороне инструкции, например:

LDR R0, =0x01234567;            
MCR p15, 0, R0, c15, c1, 0;     Move R0 to I-L1 Data 0 Register
LDR R2, =0x0DDFFFFF;            
MCR p15, 0, R2, c15, c1, 1;     Move R0 to I-L1 Data 1 Register
LDR R1, =0x40000408;            
MCR p15, 0, R1, c15, c5, 3;     Write I-L1 Data 0 or 1 Register to BTB

Чтобы прочитать одну запись в массиве BTB на стороне инструкции, например:

LDR R1, =0x40000408;            
MCR p15, 0, R1, c15, c7, 3;     Read BTB into I-L1 Data 0 or 1 Register
MRC p15, 0, R0, c15, c1, 0;     Move I-L1 Data 0 Register to R0
MRC p15, 0, R2, c15, c1, 1;     Move I-L1 Data 1 Register to R2

Спасибо!


person user770901    schedule 11.09.2014    source источник