O que significa “rep; não; ” significa em x86 assembly? É o mesmo que a instrução de “pausa”?


86
  • O que isso rep; nopsignifica?
  • É o mesmo que pauseinstrução?
  • É o mesmo que rep nop(sem o ponto e vírgula)?
  • Qual é a diferença para a nopinstrução simples ?
  • Ele se comporta de maneira diferente nos processadores AMD e Intel?
  • (bônus) Onde está a documentação oficial para essas instruções?

Motivação para esta questão

Depois de alguma discussão nos comentários de outra pergunta , percebi que não sei o que rep; nop;significa em x86 (ou x86-64) assembly. E também não consegui encontrar uma boa explicação na web.

Eu sei que repé um prefixo que significa "repetir as próximas instruções cxvezes" (ou pelo menos era, no antigo conjunto x86 de 16 bits). De acordo com esta tabela de resumo na Wikipedia , parece repsó pode ser usado com movs, stos, cmps, lods, scas(mas talvez essa limitação foi removida em processadores mais recentes). Assim, eu acho rep nop(sem ponto-e-vírgula) repetiria nopos cxtempos de uma operação .

No entanto, depois de mais pesquisas, fiquei ainda mais confuso. Parece que rep; nope pause mapeia exatamente para o mesmo opcode e pausetem um comportamento um pouco diferente do que apenas nop. Alguns e-mails antigos de 2005 diziam coisas diferentes:

  • "tente não queimar muita energia"
  • "é equivalente a 'nop' apenas com codificação de 2 bytes."
  • "é mágico na inteligência. É como 'não, mas deixe o outro irmão HT correr'"
  • "é uma pausa na inteligência e preenchimento rápido no Athlon"

Com essas opiniões diferentes, eu não conseguia entender o significado correto.

Ele está sendo usado no kernel Linux (em ambos i386 e x86_64 ), junto com este comentário: /* REP NOP (PAUSE) is a good thing to insert into busy-wait loops. */Ele também está sendo usado no BeRTOS , com o mesmo comentário.


Respostas:


75

rep; nopé de fato o mesmo que a pauseinstrução (opcode F390). Pode ser usado para montadores que ainda não suportam a pauseinstrução. Em processadores anteriores, isso simplesmente não fazia nada, apenas como nopem dois bytes. Em novos processadores que suportam hyperthreading, ele é usado como uma dica para o processador de que você está executando um spinloop para aumentar o desempenho. Da referência de instrução da Intel :

Melhora o desempenho de loops de espera de rotação. Ao executar um “loop de espera de rotação”, um processador Pentium 4 ou Intel Xeon sofre uma grave penalidade de desempenho ao sair do loop porque detecta uma possível violação da ordem de memória. A instrução PAUSE fornece uma dica ao processador de que a sequência de código é um loop de espera de rotação. O processador usa essa dica para evitar a violação da ordem da memória na maioria das situações, o que melhora muito o desempenho do processador. Por esse motivo, é recomendado que uma instrução PAUSE seja colocada em todos os loops de espera de rotação.


4
O loop de espera de rotação é o mesmo que o loop de espera ocupada ? Essa "melhoria" se aplica apenas a processadores de hyperthreading? (e por quê?)
Denilson Sá Maia

11
Sim, o loop de espera de rotação é igual ao loop de espera ocupada. O benefício também se aplica a CPUs que não suportam hyper-threading. Pode ser considerado como uma limitação do número de instruções (desnecessárias) no pipeline (em vez de tentar fazer muitas iterações do loop em paralelo)
Brendan

1
@Brendan, obrigado! Não entendi nada, até que você falou sobre iterações do loop em paralelo.
Prof. Falken

11
@Brendan, Oh, agora entendi! Esses processadores modernos são superescalares e, portanto, tentarão executar várias instruções ao mesmo tempo. Se este for um loop de espera ocupada, executar mais instruções não o tornará mais rápido, pois ele está apenas esperando por outra condição.
Denilson Sá Maia

1
@Denilson: Sim, o hyperthreading (ou apenas economia de energia sem HT) é um grande benefício, mas o outro é evitar uma especulação incorreta de ordenação de memória ao sair do loop de rotação. Sem pause, seu spin-loop é efetivamente um pipeline-clear mais lento para perceber a mudança de estado da localização da memória escrita por outro núcleo.
Peter Cordes

14

rep nop= F3 90 = a codificação para pause, bem como como ele decodifica em CPUs mais antigas que não suportam pause.


Prefixos (exceto lock) que não se aplicam a uma instrução são ignorados na prática pelas CPUs existentes.

A documentação diz que o uso repcom instruções às quais não se aplica é "reservado e pode causar um comportamento imprevisível" porque futuras CPUs podem reconhecê-lo como parte de alguma nova instrução. Depois de estabelecer qualquer nova codificação de instrução específica usando f3 xx, eles documentam como ela é executada em CPUs mais antigas. (Sim, o espaço do opcode x86 é tão limitado que eles fazem coisas malucas como esta e, sim, torna os decodificadores complicados.)

Nesse caso, isso significa que você pode usar pauseem spinloops sem quebrar a compatibilidade com versões anteriores . CPUs antigas que não conhecem pauseirão decodificá-lo como um NOP sem causar danos, como garantido pela entrada dopause manual ISA da Intel para . Em novas CPUs, você obtém o benefício de economia de energia / facilidade de HT e evita especulação incorreta de ordenação de memória quando a memória que você está girando muda e você sai do ciclo de rotação.


Links para manuais da Intel e toneladas de outras coisas boas na página de informações wiki de tag x86

Outro caso de um repprefixo sem sentido se tornando uma nova instrução em novas CPUs: lzcnté F3 0F BD /r. Em CPUs que não suportam essa instrução (sem o sinalizador de recurso LZCNT em sua CPUID), ele decodifica como rep bsr, que é executado da mesma forma que bsr. Portanto, em CPUs antigas, ele produz 32 - expected_resulte é indefinido quando a entrada era zero.

Mas tzcnte bsffazem a mesma coisa com entradas diferentes de zero, de modo que os compiladores podem usar e usam tzcntmesmo quando não há garantia de que a CPU de destino irá executá-lo como tzcnt. As CPUs AMD têm velocidade tzcnt, lentidão bsfe na Intel são ambas rápidas. Contanto que não importe para a correção (você não está contando com a configuração de sinalizadores ou em deixar o comportamento de destino inalterado no caso de entrada = 0), fazer com que ele seja decodificado como tzcntem CPUs que o suportam é útil.


Um caso de um repprefixo sem sentido que provavelmente nunca decodificará de forma diferente: rep reté usado por padrão pelo gcc ao direcionar CPUs "genéricas" (ou seja, não direcionar uma CPU específica com -marchou -mtune, e não direcionar AMD K8 ou K10). Haverá décadas antes que alguém poderia fazer uma CPU que decodifica rep retcomo algo diferente de ret, porque está presente na maioria dos binários na maioria das distros Linux. Veja o que significa `rep ret`?


3
O repprefixo também foi usado pela Intel para adicionar elisão de bloqueio.
Paul A. Clayton

Prefixos que não se aplicam a uma instrução são ignorados. Mas é mencionado que Repetir Prefixos ( F2He F3H) Reservados e pode resultar em um comportamento imprevisível na Tabela 11-3. Efeito dos prefixos nas instruções SSE, SSE2 e SSE3 . Portanto, a aplicação do prefixo é ignorada para algumas das instruções, não para todas. Então, esse recurso é considerado não documentado?
St.Antario,

2
@ St.Antario: Eles expressam dessa forma porque futuras CPUs podem reconhecê-lo como parte de alguma nova instrução. Em todas as CPUs reais, esse é o caso e, uma vez que eles estabelecem uma codificação usando f3 xx, documentam como ela funciona em CPUs mais antigas.
Peter Cordes

1
Prefixos (exceto lock) que não se aplicam a uma instrução são ignorados na prática pelas CPUs existentes. É documentado que rep movbecausa #UD, por isso repnem sempre é ignorado. Mesmo que não se aplique a uma instrução no sentido em que está especificada na REP/REPE/REPZ/REPNE/REPNZentrada manual.
St.Antario,

2
@ St.Antario: Interessante! Em geral, porém, para instruções mais antigas, os prefixos não aplicáveis ​​são ignorados. Ao introduzir uma nova instrução, é possível adicionar regras mais rígidas, se assim desejar. IDK porque eles escolheriam isso para este caso específico.
Peter Cordes
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.