A regra de ouro vai ser relaxada ligeiramente: ao invés de exigir a
execução de uma instrução por ciclo, será exigido o
início da execução de uma instrução em cada ciclo.
Vamos supor que a execução de uma instrução envolve 2 ou 3 etapas, cada etapa levando um ciclo. As etapas são:
As etapas são executadas por cicuitos separados de hardware, como em uma linha de montagem (``pipelining''). A Figura mostra a idéia.
O hardware permite a execuçaõ simultânea das 3 etapas: busca,
execução, e acesso a memória. Notem que as 3 etapas não se
referem a uma mesma instrução. (O mesmo acontece com uma linha
de montagem de automóveis: os vários estágios em executando
simultânea tratam de vários carros.) Veja a figura do exemplo. No
ciclo 1, a instrução 1 é buscada. No ciclo 2, a
instrução 2 é buscada e a instrução 1 executada. No
ciclo 3, a instrução 3 (marcada L para significar LOAD) é
buscada e a instrução 2 executada. No ciclo 4, a
instrução L é iniciada e, como envolve acesso à memória,
deve levar mais um ciclo para ser completada. No ciclo 5, algo
interessante acontece (marcado pelo círculo). A instrução
4 é executada, embora a instrução L não tenha sido
completada ainda. Isso é possível desde que a instrução
4 não utilize o registrador que está sendo carregado pela
instrução L.
É trabalho do compilador descobrir alguma instrução (a instrução 4 no exemplo) para poder preender o ``buraco'' deixado por instruções LOAD e STORE.