2012-01-04 12 views
5

Desidero scrivere alcuni assembly ARM in linea nel mio codice C. Per questo codice, ho bisogno di usare un registro o due più di quelli dichiarati come input e output per la funzione. So come usare la lista dei clobber per dire a GCC che userò alcuni registri extra per eseguire il mio calcolo.Ottimizzazione dei registri utilizzati quando si utilizza l'assemblaggio ARM in linea in GCC

Tuttavia, sono sicuro che GCC gode della libertà di mescolare i registri utilizzati per l'ottimizzazione. Cioè, ho la sensazione che sia una cattiva idea usare un registro fisso per i miei calcoli.

Qual è il modo migliore per utilizzare un registro aggiuntivo che non è né input né output del mio assembly inline, senza utilizzare un registro fisso?

P.S. Stavo pensando che l'uso di una variabile di output fittizia potrebbe fare il trucco, ma non sono sicuro di quale tipo di strani effetti avranno ...

+0

Scommetto che questo * è * possibile abbastanza direttamente, ma lascerò che un guru di C risponda a questo. :-) – Noldorin

+1

So che puoi usare gli alias di registro e lasciare che il compilatore scelga i registri che vuole usare, ma non può ricordare la sintassi per quello. Oppure si potrebbe mordere il proiettile e basta scrivere un file .s e assemblarlo separatamente per una maggiore flessibilità. –

+1

@ Michaelicorgan Grazie per l'input. So che i registri di input e output funzionano in questo modo, ma non l'ho visto utilizzato per i registri temporanei. La seconda soluzione fa il contrario di ciò di cui ho bisogno, rimuove ancora più opzioni di ottimizzazione (il designazione dei registri di input e output) ... – Madcowswe

risposta

5

Ok, ho trovato una fonte che supporta l'idea di utilizzando uscite fittizi, invece dei registri duri:

4.8 registri temporanei: La gente a volte erroneamente utilizzano clobbers per i registri temporanei. Il modo corretto è per creare un'uscita fittizia e utilizzare "= r" o "= & r" in base alla sovrapposizione consentita con gli ingressi. GCC alloca un registro per il valore fittizio. La differenza è che GCC può scegliere un registro conveniente, quindi ha più flessibilità.

da pagina 20 di this pdf.

Per chi è interessato a maggiori informazioni sull'assemblaggio in linea con GCC this, il sito Web si è rivelato molto istruttivo.

+0

Su AArch64 la scorsa settimana ho trovato che gcc ha generato un codice migliore per rabboccare e tailing il mio assembly quando ho hard-coded (come in realtà ho scritto 'aggiungi w2,% [input1],% [input2]') i temporaries e li ha danneggiati rispetto al trucco che hai menzionato (come 'aggiungi% [fakeoutputastemp],% [input1],% [input2]'). YMMV naturalmente. Il mio caso: http://stackoverflow.com/questions/28325569/can-pretty-variable-names-be-used-for-registers-in-gcc-inline-assembly. Se si conosce la convenzione di chiamata, è possibile selezionare reg di regimi che non causano il push di un arg e che non sono troppo alti. – ahcox

Problemi correlati