Como é um diferente ramo anulado de um ramo regular?
-
03-07-2019 - |
Pergunta
Para Montagem SPARC particularmente, como são diferentes ramos de galhos regulares anulado?
Eu sempre pensei que as instruções de anulação da filial é necessária quando eu preciso para preencher o slot de atraso nop para instruções de desvio. No entanto, eu não acho que eu estou correto sobre esta parte, porque você pode preencher o nop sem anular o ramo.
Solução
A instrução de desvio anulou faz com que a instrução no delay slot - a instrução após o ramo -. A ser ignorado se o ramo não é levado
Por que isso seria importante? Porque normalmente, a instrução após o ramo é executado, mesmo se o ramo é tomada. Isso ocorre porque existem dois contadores de programa, PC e NPC. PC, que indica a instrução a ser executada, é atualizado para NPC, que é PC + 4, ao mesmo tempo que NPC está sendo atualizado para o alvo da instrução de desvio. Então, por causa do calendário destes eventos, a próxima instrução tem de ser carregado. Ao invés de apenas jogar esse ciclo de distância, é mais rentável para usar esse ciclo se pudermos. Nós, então, apenas fazer essa parte de instrução do loop.
loop: someOp
someOtherOp
branch loop ;
delayslotOp ; will actually be executed, before someOp, after branch
Se não podemos usar o slot de instrução após o ramo, então nós furar um nop lá dentro, e não fazer nada sobre esse ciclo.
Então, por que, então, instruções diferentes com opções branch anulados e não anulados? Para nos dar a escolha do que acontece na saída do loop. Se fizemos a parte slot de atraso da atividade de loop, que pode não querer que op executado ao sair do loop. Por isso, gostaria de acrescentar "um" para o fim da instrução de desvio.
Outras dicas
De acordo com a SPARC Arquitetura Manual (v9) :
3.2.3 Transfer Control [...]
A maioria das instruções de transferência de controle estão atrasadas; isto é, a instrução imediatamente após a instrução de transferência de controlo na sequência lógica é despachado antes a transferência de controle para o endereço de destino é concluída.
[...]
A instrução após uma instrução de transferência de controle atrasada é chamado uma instrução atraso . Um pouco em uma instrução de transferência de controle de atraso (O bit anular) pode causar a instrução demora para ser anulada (que é, não ter nenhum efeito) se o ramo não é tomada.
<> forte 6.3.4 instruções de controlo de transferência (-CTIs)
[...]
Nota Programação : O bit anular aumenta a probabilidade de que um compilador pode encontrar uma instrução útil para preencher o slot de atraso depois de um ramo, reduzindo assim o número de instruções executadas por um programa. Por exemplo, o bit anular pode ser usado para mover uma instrução a partir de dentro de um ciclo para preencher o espaço de atraso do ramo que fecha o laço. Da mesma forma, o bit anular pode ser usado para mover uma instrução a partir de qualquer “coisa” ou sucursal de uma “ifthen- mais” programa “e depois” bloquear para o slot de atraso do ramo que selecciona entre eles. Desde a um conjunto completo de condições são fornecidos, um compilador pode organizar o código (Possivelmente inverter o sentido da condição), de modo que uma instrução a partir de qualquer ramo “mais” ou “depois” ramo pode ser movido para o delay slot.
Os seguintes mostra o código dois ramos, na primeira instrução atraso é sempre executada, no segundo a instrução atraso é anulada se o ramo não é tomada:
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