Domanda

A volte scrivo funzioni di montaggio molto brevi come

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

che sembra essere i migliori candidati per inline:

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

ma Delphi compilatore non lo permette. Perché?


Aggiornamento:

Grazie a ldsandon, esiste un 5,5 anni di età rel="nofollow aperto riferire QC . Il rapporto containes alcune proposte (come l'estensione direttiva ASM) per semplificare la gestione inline asm per il compilatore. Io preferirei di introdurre la direttiva "nudo" a livello procedura / funzione che dice al compilatore che non ha bisogno di creare uno stack frame per la procedura ed eventualmente quali registra (tra EAX, edx e ECX) dovrebbero essere conservati.

Se il compito generale di procedure efficienti inline con il codice BASM è difficile (e può essere unnessessary) una buona idea è quella di consentire inlining per i casi più importanti (come la funzione nudo con l'utilizzo registro esplicitamente dichiarato).

È stato utile?

Soluzione

Si veda Relazione sulla qualità centrale # 9283 (e votare per esso). Fondamentalmente il problema è il compilatore dovrebbe essere in grado di comprendere ciò registri per conservare prima del codice in linea e cosa ripristinare dopo. Fino a quando il compilatore gestisce il Registro è facile, quando l'utilizzo non è sotto il controllo è non lo è. Il vostro esempio è piuttosto semplice, ma il compilatore deve essere in grado di gestire i casi più complessi. Il rapporto è in stato aperto, spero che il nuovo compilatore sarà in grado di inline codice BASM pure.

Altri suggerimenti

Non si può artigianale in linea codice assembly.

Sarebbe molto difficile per consentire inlining di questi pezzi di assembler; con inlining normale tutti i tipi di effetti dell'uso registro, le variabili locali ecc sono lì che il compilatore non può fare con assembly inline.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top