fence
lyszt.net aborda fence e outras instruções RISC-V com mais detalhes.
Descrição
As instruções FENCE são usadas para ordenar E/S de dispositivos e acessos à memória conforme vistos por outros harts RISC-V e dispositivos externos ou coprocessadores. Qualquer combinação de entrada de dispositivo (I), saída de dispositivo (O), leituras de memória (R) e escritas de memória (W) pode ser ordenada em relação a qualquer combinação das mesmas. Informalmente, nenhum outro hart RISC-V ou dispositivo externo pode observar qualquer operação no conjunto successor após um FENCE antes de qualquer operação no conjunto predecessor anterior ao FENCE. memorymodel fornece uma descrição precisa do modelo de consistência de memória RISC-V.
As instruções FENCE também ordenam leituras e escritas de memória feitas pelo hart conforme observadas por leituras e escritas de memória feitas por um dispositivo externo. No entanto, as instruções FENCE não ordenam observações de eventos feitas por um dispositivo externo usando qualquer outro mecanismo de sinalização.
A EEI definirá quais operações de E/S são possíveis e, em particular, quais endereços de memória, quando acessados por instruções de load e store, serão tratados e ordenados como operações de entrada de dispositivo e saída de dispositivo, respectivamente, em vez de leituras e escritas de memória. Por exemplo, dispositivos de E/S mapeados em memória normalmente serão acessados com loads e stores não armazenados em cache que são ordenados usando os bits I e O em vez dos bits R e W. Extensões do conjunto de instruções também podem descrever novas instruções de E/S que também serão ordenadas usando os bits I e O em uma instrução FENCE.
Codificação do modo Fence
O campo de modo FENCE fm define a semântica da instrução FENCE. Um FENCE (com fm=0000) ordena todas as operações de memória em seu conjunto predecessor antes de todas as operações de memória em seu conjunto successor.
Uma instrução FENCE.TSO é codificada como uma instrução FENCE com fm=1000, predecessor=RW e successor=RW. FENCE.TSO ordena todas as operações de load em seu conjunto predecessor antes de todas as operações de memória em seu conjunto successor, e todas as operações de store em seu conjunto predecessor antes de todas as operações de store em seu conjunto successor. Isso deixa as operações de store non-AMO no conjunto predecessor do FENCE.TSO sem ordenação em relação aos loads non-AMO em seu conjunto successor.
Os campos não utilizados nas instruções FENCE--rs1 and rd--são reservados para fences de granularidade mais fina em extensões futuras. Para compatibilidade futura, as implementações base devem ignorar esses campos#, e o software padrão deve zerar esses campos. Da mesma forma, muitas configurações de fm e de conjunto predecessor/successor também são reservadas para uso futuro. As implementações base devem tratar todas essas configurações reservadas como instruções FENCE (com fm=0000), e o software padrão deve usar apenas configurações não reservadas.