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.

Foi útil?

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.

Esta página tem alguns exemplos agradáveis.

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
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top