Las instrucciones antes (en el orden del programa) de la falta de memoria caché de datos fluirán por la tubería de forma normal. (Una excepción inusual sería una canalización basada en empuje, tal como la utilizan algunos VLIW anteriores. Tales operaciones subsiguientes requerían que las operaciones anteriores se redujeran por las tuberías).
Para una falta de memoria caché en una tienda, el valor almacenado se puede colocar en un búfer que permite que la tienda se complete a pesar de la falta de memoria caché. (Esto es posible porque el búfer no requiere ningún dato de la memoria, que generalmente se logra al tener un bit válido para cada unidad almacenable [típicamente byte].)
Muchos procesadores que utilizan la ejecución en orden permiten a las instrucciones después de una carga para ejecutar y completar, incluso otra carga, si las siguientes instrucciones no son datos dependientes de la carga ( o, por supuesto, después de una instrucción que depende de los datos). Esto se puede lograr mediante el uso de un marcador que marque la disponibilidad de cada registro.
Para un procesador fuera de orden, las instrucciones después de una instrucción que depende de la instrucción de carga que falta en la memoria caché se pueden ejecutar completamente y los resultados se pueden almacenar en registros de cambio de nombre (o en una cola de almacenamiento para almacenar en memoria), pero no se pueden confirmar. / p>
Las instrucciones de flujo de control, como las ramas y los saltos indirectos, son especiales ya que las siguientes instrucciones dependen del resultado, pero a menudo la predicción se puede usar para ocultar esta dependencia. Aunque se ha estudiado la predicción del valor de los errores de carga, el beneficio es relativamente limitado dado el costo.
En teoría a veces también sería posible ejecutar de manera especulativa parcialmente instrucciones dependientes. Por ejemplo:
lw r3, [r5]; // load word
add r3, r3, #50; // r3 = r3 + 50
slt r6, r3, #1000; // (r3<1000)?r6=1:r6=0
bez r6 LABEL; // if r6=0 goto LABEL
addi r3, r3, #10; // r3 = r3 + 10
LABEL:
En teoría, el hardware podría especular que la rama no se toma y agregar 50 y 10 para que 60 se agregue al valor cuando esté disponible. Este tipo de optimización se ha propuesto para cachés de rastreo (instrucciones).
Algunas instrucciones también pueden dividirse en operaciones de componentes que no dependen del valor aún no disponible para permitir la ejecución parcial de la instrucción. Por ejemplo, la división que utiliza un mecanismo de Newton-Raphson puede generar el recíproco mientras el dividendo no está disponible.