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.

¿Fue útil?

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.

Esta página tiene algunos buenos ejemplos.

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
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top