Кажется, вы предполагаете, что есть только один физический регистр EIP, который используется всем ядром процессора.
Это не работает, потому что каждая инструкция, которая может вызвать исключение, должна знать свой собственный адрес. Или, когда поступает внешнее прерывание, ЦП может решить обработать прерывание после любой инструкции, сделав это архитектурным EIP. В длинном режиме (x86-64) есть также режимы относительной адресации RIP, поэтому call
- не единственная инструкция, для которой в качестве данных требуется текущий счетчик программ.
Простой конвейерный ЦП может иметь EIP для каждого этапа конвейера.
Современные суперскалярные нестандартные x86 связывают EIP (или RIP) с каждой действующей инструкцией (или, возможно, с каждым uop; но многопользовательские инструкции имеют все свои uop, связанные друг с другом, поэтому инструкция не может частично уйти в отставку.)
В отличие от других частей архитектурного состояния (например, EFLAGS, EAX и т. Д.) Значение статически известно после декодирования. Фактически даже раньше, чем непосредственные ценности; Границы команд обнаруживаются на этапе предварительного декодирования (или отмечаются в кэше L1i), так что несколько инструкций могут быть поданы на несколько декодеров параллельно.
Ранняя стадия выборки / декодирования может просто отслеживать адреса 16-байтовых или 32-байтовых блоков выборки, но после декодирования я предполагаю, что во внутреннем представлении uop есть поле адреса. Это может быть просто небольшое смещение по сравнению с предыдущими (для экономии места) для инструкций без ветвления, поэтому, если это когда-либо понадобится, его можно вычислить, но мы подробно рассмотрим детали реализации здесь. Выполнение вне очереди поддерживает иллюзию выполнения инструкций в программном порядке, и они действительно выдают и удаляют по порядку (ввод / выход из части ядра, выполняемой вне очереди).
Связано: Регистры x86: регистры MBR / MDR и инструкций аналогичны неправильное предположение, основанное на просмотре игрушечных процессоров. Также нет регистра «текущей инструкции», содержащего байты машинного кода. См. Дополнительные ссылки в моем ответе, чтобы узнать больше о процессорах OoO / pipelines.
Предсказание ветвления должно сработать до того, как блок будет даже декодирован. т.е. учитывая, что мы только что получили блок по адресу abc, нам нужно предсказать, какой блок выбрать следующим. то есть предсказание должно предсказывать наличие переходов в 16-байтовом блоке инструкций, которые будут декодироваться параллельно.
По теме: Почему Intel изменила статический механизм прогнозирования ветвлений за эти годы?
person
Peter Cordes
schedule
21.08.2018