Pergunta

Às vezes eu escrevo funções de montagem muito curtos como

function SeniorBit(Value: LongWord): Integer;
asm
        OR    EAX,EAX
        JZ    @@Done
        BSR   EAX,EAX
        INC   EAX
@@Done:
end;

que parece ser os melhores candidatos para inlining:

function SeniorBit(Value: LongWord): Integer; inline;
compilador

mas Delphi não o permite. Por quê?


Atualizado:

Graças a ldsandon, existe uma href="http://qc.embarcadero.com/wc/qcmain.aspx?d=9283" rel="nofollow relatório aberto de idade 5,5 anos em QC . O relatório contem as algumas propostas (como a extensão da Directiva asm) para simplificar o asm inlining para o compilador. Eu preferiria a introduzir a directiva "nu" no nível de procedimento / função que diz ao compilador que ele não tem para criar um quadro de pilha para o procedimento e, opcionalmente, o que registros (entre EAX, EDX e ECX) deve ser preservada.

Se a tarefa geral de procedimentos inlining eficientes com código BASM é difícil (e pode ser unnessessary) uma boa idéia é permitir que inlining para os casos mais importantes (como função nua com o uso registo explicitamente declarado).

Foi útil?

Solução

Veja Quality Central denunciar # 9283 (e voto para ele). Basicamente, o problema é o compilador deve ser capaz de entender o que registra a preservar antes do código embutido e o que restaurar depois. Enquanto as alças do compilador a registrá-lo é fácil, quando o uso não está sob é o controle não é. Seu exemplo é bastante simples, mas o compilador deve ser capaz de lidar com casos mais complexos. O relatório está em estado aberto, espero que o novo compilador será capaz de código BASM em linha também.

Outras dicas

Você não pode mão em linha trabalhada assembly de código.

Seria muito difícil permitir inlining dessas peças de montador; com inlining normal de todos os tipos de efeitos sobre o uso do registo, as variáveis ??locais etc estão lá que o compilador não pode fazer com linha de montagem.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top