¿En qué se diferencia una rama anulada de una rama regular?
-
03-07-2019 - |
Pregunta
Para la Asamblea SPARC en particular, ¿en qué se diferencian las ramas anuladas de las ramas normales?
Siempre pensé que es necesario anular las instrucciones de bifurcación cuando necesito llenar el espacio de retraso de nop para las instrucciones de bifurcación. Sin embargo, no creo que esté en lo correcto en esta parte, porque puede llenar el nop sin anular la rama.
Solución
La instrucción de rama anulada hace que la instrucción en el intervalo de retardo, la instrucción después de la rama, se ignore si no se toma la rama.
¿Por qué sería esto importante? Porque normalmente, la instrucción después de la rama se ejecuta, incluso si se toma la rama. Esto se debe a que hay dos contadores de programa, PC y NPC. PC, que indica que la instrucción que se está ejecutando, se actualiza a NPC, que es PC + 4, al mismo tiempo que NPC se actualiza al objetivo de la instrucción de bifurcación. Entonces, debido al tiempo de estos eventos, la siguiente instrucción tiene que cargarse. En lugar de simplemente tirar ese ciclo, es más rentable usar ese ciclo si podemos. Entonces solo haríamos que esa instrucción sea parte del ciclo.
loop: someOp
someOtherOp
branch loop ;
delayslotOp ; will actually be executed, before someOp, after branch
Si no podemos usar la ranura de instrucciones después de la bifurcación, entonces colocamos un nop allí y no hacemos nada en ese ciclo.
Entonces, ¿por qué entonces tener diferentes instrucciones con opciones de ramificación anuladas y no anuladas? Para darnos la opción de lo que sucede al salir del bucle. Si hemos hecho que la ranura de retraso forme parte de la actividad del bucle, es posible que no queramos que se ejecute esa operación al salir del bucle. Por lo tanto, agregaríamos " a " hasta el final de la instrucción de rama.
Otros consejos
De acuerdo con el Manual de arquitectura SPARC (v9) :
3.2.3 Transferencia de control
[...]
La mayoría de las instrucciones de transferencia de control se retrasan; es decir, la instrucción que sigue inmediatamente a la instrucción de transferencia de control en secuencia lógica se despacha antes la transferencia de control a la dirección de destino se ha completado.
[...]
La instrucción que sigue a una instrucción de transferencia de control retrasada se llama una instrucción de demora . Un poco en una instrucción de transferencia de control retrasada (el bit de anulación) puede hacer que se anule la instrucción de retraso (que es decir, no tener ningún efecto) si no se toma la rama.
6.3.4 Instrucciones de transferencia de control (CTI)
[...]
Nota de programación : el bit de anulación aumenta la probabilidad de que un el compilador puede encontrar una instrucción útil para llenar el espacio de retraso después de un rama, reduciendo así el número de instrucciones ejecutadas por un programa. Por ejemplo, el bit de anulación se puede usar para mover una instrucción desde un bucle para llenar la ranura de retraso de la rama que se cierra el lazo. Del mismo modo, el bit de anulación se puede usar para mover una instrucción ya sea de la rama "else" o "then" de un programa "ifthen- else" bloquee a la ranura de retraso de la rama que selecciona entre ellos. Ya que Se proporciona un conjunto completo de condiciones, un compilador puede organizar el código (posiblemente invirtiendo el sentido de la condición) para que una instrucción desde la rama "else" o la rama "then" se puede mover a la ranura de retraso.
El siguiente código muestra dos ramas, en la primera la instrucción de retraso siempre se ejecuta, en la segunda la instrucción de retraso se anula si no se toma la rama:
cmp %i3, %i0
ble %icc, -0x5c
ld [%l0 - 0x4], %i5 ; executed whether the branch is taken or not
...
cmp %l1, 0x80
bl,a %icc, +0x40
ld [%fp + 0x7c7], %g2 ; annulled if the branch is not taken, executed otherwise