2010-03-10 13 views
7

volte scrivo funzioni di montaggio molto brevi comePerché il compilatore Delphi non ha funzioni di assemblaggio inline?

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 consentono. Perché?


Aggiornato:

Grazie a ldsandon, esiste un 5,5 anni di età aperto report on QC. Il report contiene alcune proposte (come l'estensione della direttiva asm) per semplificare l'allineamento ASM per il compilatore. Preferirei introdurre la direttiva "naked" sul livello procedura/funzione che dice al compilatore che non deve creare uno stack frame per la procedura e facoltativamente quali registri (tra eax, edx ed ecx) dovrebbero essere preservati.

Se il compito generale delle efficienti procedure di inlining con codice BASM è difficile (e potrebbe essere non necessario), una buona idea è quella di abilitare l'inlining per i casi più importanti (come la funzione naked con l'uso dichiarato del registro esplicitamente).

+0

È necessario aggiungere la convenzione di chiamata registro dopo il risultato (ad es.: Integer; register;) per assicurarsi che la funzione funzioni anche quando viene utilizzata una convenzione di chiamata diversa durante la compilazione. –

+2

Se si desidera discutere la possibilità FUTURE del compilatore di supportare le funzioni di assemblatore in linea, forse QC o una bacheca è il posto migliore per farlo. Ho provato a rispondere che al momento non è davvero possibile inline una funzione con un blocco asm in quanto implementazione. Potresti pensare che sia una buona idea (hey mi piace il montaggio e penso che sarebbe bello). Ma è così il posto dove discutere le richieste di funzionalità per i compilatori ?? Ho pensato che volevi la risposta sul tuo problema a portata di mano: perché non posso metterlo in riga. –

+0

@Ritsaert Hornstra: perché pensi che SO non sia il posto dove discutere le richieste di funzionalità per i compilatori? È chiaramente la domanda di programmazione, e dove devono essere le risposte su come implementare la cosa nel modo migliore e [possibilmente domanda retorica] perché la cosa non è ancora stata implementata. – kludg

risposta

10

Vedere Report di qualità centrale n. 9283 (e votare per questo). Fondamentalmente il problema è che il compilatore dovrebbe essere in grado di capire quali registri conservare prima del codice inline e cosa ripristinare dopo. Finché il compilatore gestisce il registro è facile, quando l'uso non è sotto controllo non lo è. L'esempio è piuttosto semplice, ma il compilatore deve essere in grado di gestire casi più complessi. Il report è in stato aperto, spero che anche il nuovo compilatore sarà in grado di incorporare il codice BASM.

5

Non è possibile inline codice assembly assemblato a mano.

Sarebbe molto difficile consentire l'inserimento di questi pezzi di assemblatore; con la normale inclinazione di tutti i tipi di effetti sull'uso del registro, le variabili locali ecc. sono lì che il compilatore non può fare con l'assembly inline.

+0

Non riesco a vedere alcun problema con l'inlining della funzione di assemblaggio sopra. In realtà sembra ancora più semplice dell'inaugurazione di una pura funzione pascal. – kludg

+4

Se pensi che sia semplice, EMbarcadero dovrebbe assumerti come il loro nuovo guru del compilatore :-). Non scherzando: è difficile. Un compilatore esegue diverse fasi (non conosco il compilatore Delphi dall'interno però) testo (lexing) token (parsing) sintassi tree (ottimizzazioni) sintassi tree -> ... -> (codegen) codice macchina. Ora un pezzo di inline assemply è molto difficile da analizzare nella fase di ottimizzazione in cui si lavora con un albero di sintassi astratto. –

+0

Non vedo perché? È una semplice scansione lineare da fronte a retro per trovare i registri allocati/modificati. Alcune euristiche (come l'impostazione di uno stack frame se BP è utilizzato). Notare che se vengono rilevati costrutti dispari (come adressing% esp), l'inlining può essere disabilitato. Sarebbe già bello avere le basi per funzionare. –

Problemi correlati