Конечно, состояние проверяется каждый раз. Но к тому времени, когда это проверено, это далеко в трубопровод ЦП. Между тем, другие инструкции также вошли в конвейер и находятся на разных этапах исполнения.
Обычно за условием немедленно следует условная инструкция ветвления, которая либо разветвляется, если условие оценивается как TRUE, либо проваливается, если условие оценивается как FALSE. Это означает, что есть два разных потока команд, которые могут быть загружены в конвейер после инструкции условия и инструкции ветвления, в зависимости от того, оценивается ли условие как ИСТИНА или ЛОЖЬ. К сожалению, сразу после загрузки инструкции условия и инструкции ветвления ЦП еще не знает, к какому условию будет относиться условие, но ему все равно придется продолжать загружать данные в конвейер. Таким образом, он выбирает один из двух наборов инструкций, основываясь на предположении относительно того, как будет оцениваться условие.
Позже, когда инструкция условия перемещается вверх по конвейеру, наступает время ее оценки. В это время процессор выясняет, была ли его догадка правильной или неправильной.
Если предположение оказывается верным, тогда ветвь переместилась в правильное место, и правильные инструкции были загружены в конвейер. Если оказывается, что предположение было неверным, то все инструкции, которые были загружены в конвейер после команды условного перехода, были неправильными, их необходимо отбросить, и выборка инструкций должна начаться снова с правильного места.
поправка
В ответ на комментарий StarWeaver, чтобы дать представление о том, что должен делать процессор, чтобы выполнить одну инструкцию:
Рассмотрим что-то столь же простое, о MOV AX,[SI+10]
чем мы, люди, наивно думаем, как о «загрузке AX словом в SI плюс 10». Грубо говоря, процессор должен:
- передать содержимое ПК («регистр счетчика программ») на адресную шину;
- прочитать код операции инструкции с шины данных;
- инкремент ПК;
- декодировать код операции, чтобы понять, что с ним делать;
- передать содержимое ПК на адресную шину;
- прочитать операнд инструкции (в данном случае 10) из шины данных;
- инкремент ПК;
- подать операнд и SI в сумматор;
- выдать результат сумматора на адресную шину;
- читать AX с шины данных.
Это колоссальные 10 шагов. Некоторые из этих шагов будут оптимизированы даже в непоточных ЦП, например, ЦП почти всегда будет увеличивать ПК параллельно со следующим шагом, что легко сделать, потому что ПК является очень, очень специальным регистром, который никогда не использовался для какой-либо другой работы, поэтому нет возможности конфликта между различными частями ЦП за доступ к этому конкретному регистру. Но, тем не менее, у нас осталось 8 шагов для такой простой инструкции, и обратите внимание, что я уже предполагаю некоторую степень сложности от имени процессора, например, я предполагаю, что не понадобится целый дополнительный шаг для сумматор, чтобы фактически выполнить сложение, прежде чем из него можно будет прочитать результат,
Теперь предположим, что существуют более сложные режимы адресации, например MOV AX, [DX+SI*4+10]
, и даже более сложные инструкции, например, MUL AX, operand
которые фактически выполняют циклы внутри ЦП для вычисления своего результата.
Итак, моя точка зрения заключается в том, что метафора «атомарного уровня» далеко не подходит для уровня команд ЦП. Это может быть подходящим для уровня шага конвейера, если вы не хотите заходить слишком далеко до фактического уровня логических элементов.