История изменений
Исправление numas13, (текущая версия) :
Почему «не останется и следа». Они же были сложены в очередь команд. Эта очередь не очищается. Возможно её можно переиспользовать (по крайней мере на глубину в один вызов).
Сделать можно много чего. Вопрос в сложности реализации и полученной пользы.
Предсказатель нужен, если переход условный. Для безусловного его наличие ни на что не влияет.
Предсказатель нужен в любом случае. Я уже писал об том, ты видимо не обратил внимания.
A: op
I: ibranch label >> goto L
label:
L: op
# Без предсказателя или если он не знает про ibranch
A F0 F1 S D B R
0 A
1 I A
2 I A
3 I A
4 I A
5 I A
6 I A << label не готов
7 L I
8 L I
9 L I
10 L I
11 L I << lebel готов
12 L I
13 L
# Предсказатель знает про ibranch
A F0 F1 S D B R
0 A
1 I A << предсказатель уже встречал ibranch
2 L I A << начинается загрузка с label
3 L I A
4 L I A
5 L I A
6 L I A << label готов
7 L I
8 L
Честно, не понял, чем он от ibranch отличается. Кроме того, что занимает регистр ctpr.
Он не зависит от простоев в backend (в твоей реализации). То есть работает как подсказка аппаратуре, что через N тактов (зависит от длины конвейера) будет безусловный переход (не обязательно). Своего рода управляемый delay slots. Он не обязательно должен занимать ctpr, а может работать в том же конвейере. Но если есть предсказатель, то пользы от него будет не так много.
J: jump_delay label << 5 delay slots
A: op
B: op
C: op
D: op
E: op
label:
L: op
A F0 F1 S D B R
0 J
1 A J
2 B A J
3 C B A J
4 D C B A J
5 E D C B A J << CPU увидел jump
6 L E D C B A J << fetch from label
7 L E D C B A
8 L E D C B
9 L E D C
10 L E D
11 L E
12 L
Собственно так деды делали подготовленные переходы в махровые времена. Хотя может всё ещё где-то и используют в каких-то DSP. Я не знаю. :)
Исходная версия numas13, :
Почему «не останется и следа». Они же были сложены в очередь команд. Эта очередь не очищается. Возможно её можно переиспользовать (по крайней мере на глубину в один вызов).
Сделать можно много чего. Вопрос в сложности реализации и полученной пользы.
Предсказатель нужен, если переход условный. Для безусловного его наличие ни на что не влияет.
Предсказатель нужен в любом случае. Я уже писал об том, ты видимо не обратил внимания.
A: op
I: ibranch label >> goto L
label:
L: op
# Без предсказателя или если он не знает про ibranch
A F0 F1 S D B R
0 A
1 I A
2 I A
3 I A
4 I A
5 I A
6 I A << label не готов
7 L I
8 L I
9 L I
10 L I
11 L I << lebel готов
12 L I
13 L
# Предсказатель знает про ibranch
A F0 F1 S D B R
0 A
1 I A << предсказатель уже встречал ibranch
2 L I A << начинается загрузка с label
3 L I A
4 L I A
5 L I A
6 L I A << label готов
7 L I
8 L
Честно, не понял, чем он от ibranch отличается. Кроме того, что занимает регистр ctpr.
Он не зависит от простоев в backend (в твоей реализации). То есть работает как подсказка аппаратуре, что через N тактов (зависит от длины конвейера) будет безусловный переход. Своего рода управляемый delay slots. Он не обязательно должен занимать ctpr, а может работать в том же конвейере. Но если есть предсказатель, то пользы от него будет не так много.
J: jump_delay label << 5 delay slots
A: op
B: op
C: op
D: op
E: op
label:
L: op
A F0 F1 S D B R
0 J
1 A J
2 B A J
3 C B A J
4 D C B A J
5 E D C B A J << CPU увидел jump
6 L E D C B A J << fetch from label
7 L E D C B A
8 L E D C B
9 L E D C
10 L E D
11 L E
12 L
Собственно так деды делали подготовленные переходы в махровые времена. Хотя может всё ещё где-то и используют в каких-то DSP. Я не знаю. :)