Articles of x86

Por que esse código SSE é 6 vezes mais lento sem o VZEROUPPER no Skylake?

Eu tenho tentado descobrir um problema de desempenho em um aplicativo e finalmente reduzi-lo a um problema muito estranho. A parte de código a seguir é executada 6 vezes mais lentamente em uma CPU Skylake (i5-6500) se a instrução VZEROUPPER estiver comentado. Testei os CPUs Sandy Bridge e Ivy Bridge e as duas versões rodam […]

Instruções SSE: quais CPUs podem fazer operações de memory atômica de 16B?

Considere uma única instrução SSE de access à memory (uma única leitura ou gravação única, não leitura + gravação) em uma CPU x86. A instrução está acessando 16 bytes (128 bits) de memory e a localização da memory acessada é alinhada a 16 bytes. O documento “Artigo sobre pedido de memory de arquitetura Intel® 64” […]

Por que não há um registro que contém os bytes mais altos do EAX?

%AX = (%AH + %AL) Então, por que não %EAX = (%SOME_REGISTER + %AX) para algum registro %SOME_REGISTER ?

Como funciona o $ no NASM, exatamente?

message db “Enter a digit “, 0xA,0xD Length equ $- message É usado para obter o tamanho de uma string? Como funciona internamente?

Para que serve o registro “FS” / “GS”?

Então eu sei o que os seguintes registros e seus usos devem ser: CS = segmento de código (usado para IP) DS = Segmento de Dados (usado para MOV) ES = Segmento de Destino (usado para MOVS, etc.) SS = Segmento de Pilha (usado para SP) Mas quais são os seguintes registros destinados a serem […]

Quais são as melhores seqüências de instruções para gerar constantes vetoriais em tempo real?

“Melhor” significa poucas instruções (ou menos, se alguma instrução decodificar para mais de um uop). O tamanho do código de máquina em bytes é um desempatador para contagem de insensas igual. A geração constante é, por sua própria natureza, o começo de uma nova cadeia de dependência, portanto, é incomum que a latência importe. Também […]

É seguro ler além do final de um buffer na mesma página em x86 e x64?

Muitos methods encontrados em algoritmos de alto desempenho poderiam ser (e são) simplificados se tivessem permissão para ler uma pequena quantidade após o fim dos buffers de input. Aqui, “pequena quantidade” geralmente significa até W – 1 bytes após o final, onde W é o tamanho da palavra em bytes do algoritmo (por exemplo, até […]

O que significa “rep ret”?

Eu estava testando algum código no Visual Studio 2008 e notei o security_cookie . Eu posso entender o ponto, mas não entendo qual é o objective dessa instrução. rep ret /* REP to avoid AMD branch prediction penalty */ Claro que eu posso entender o comentário 🙂 mas o que é este exaclty de prefixo […]

Problemas com ADC / SBB e INC / DEC em loops apertados em algumas CPUs

Estou escrevendo um tipo BigInteger simples no Delphi. Ele consiste principalmente em uma matriz dinâmica de TLimb, em que um TLimb é um inteiro não assinado de 32 bits e um campo de tamanho de 32 bits, que também contém o bit de sinal para o BigInteger. Para adicionar dois BigIntegers, eu crio um novo […]

Alocação, preenchimento e alinhamento de pilha

Eu tenho tentado entender melhor como os compiladores geram código de máquina e, mais especificamente, como o GCC lida com a pilha. Ao fazê-lo, tenho escrito programas C simples, compilando-os em assembly e tentando o meu melhor para entender o resultado. Aqui está um programa simples e a saída é gerada: asmtest.c : void main() […]