Jump to content
Sign in to follow this  
fredericopissarra

Seu compilador não usa algumas instruções tradicionais. Por quê?

Recommended Posts

Já reparou que o GCC (e o VC++, bem como outros compiladores) não usam instruções tradicionais como INC, DEC e LOOP?

INC e DEC são bem fáceis de entender e, por conseguinte, são intuitivas: Elas incrementam e decrementam, respectivamente, um registrador ou conteúdo de memória. Já a instrução LOOP salta para um endereço se RCX (x86-64) ou ECX (i386) não forem 0, decrementando esse registrador antes de cada salto. O nome da função é intuitivo também...

O motivo do não-uso dessas instruções é que elas são mais lentas que as equivalentes... ADD e SUB, com o operando fonte imediato 1, é 1 ou 2 ciclos mais rápida que INC e DEC porque essas últimas não preservam o flag de Carry (CF). Elas efetivamente fazem um ciclo de leitura-modificação-escrita nos flags... E LOOP é mais lento que a sequência: SUB ECX,1/JNZ ... Essas duas instruções podem ser "fundidas" (micro-fusão), gastando, em certos casos, menos que 1 ciclo...

Outro detalhe é que o seu compilador sempre prefere lidar com registradores de 32 bits (EAX, EBX, ...) ao invés de 8, 16 ou 64. Ele só lidará com registradores menores se não tiver jeito e, maiores, se estiver lidando com cálculo de endereços efetivos (porque a instrução não exigirá um prefixo 0x67)... Tenha em mente que seu processador, mesmo tendo uma extensão de 64 bits, é, ainda, de 32... Para acessar pedaços dos registradores é necessário algum mascaramento interno que consumirá algum tempinho (ou seja, MOV AX,2 é mais lento que MOV EAX,2, por exemplo). Por isso, em C, sempre que possível, use os tipos int ou unsigned int ao invés de char, short e long (ou long long)...

Este é outro motivo pelo qual, às vezes, você vê o uso de instruções como MOVSX e MOVZX para estender um dos aliases de registradores, como:

movsx eax,al

Que parece não fazer muito sentido... trata-se apenas da conversão de um char num int.

Seu compilador também não usa outras instruções como XLAT e JECXZ pelo mesmo motivo (lentidão).

  • Agradecer 1
  • Curtir 3

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Sign in to follow this  

  • Recently Browsing   0 members

    No registered users viewing this page.

×
×
  • Create New...