Domanda

Voglio testare alcune modifiche all'architettura su un'architettura già esistente (X86) usando i simulatori. Tuttavia, per testarli correttamente ed eseguire benchmark, potrei dover apportare alcune modifiche al set di istruzioni, esiste un modo per aggiungere queste modifiche a GCC o a qualsiasi altro compilatore?

È stato utile?

Soluzione

Soluzione semplice:

Un approccio comune è quello di aggiungere il gruppo inline e codificare direttamente i byte di istruzione.

Per esempio:

int main()
{
    asm __volatile__ (".byte 0x90\n");
    return 0;
}

compila (gcc -o3) in:

00000000004005a0 <main>:
  4005a0:       90                      nop
  4005a1:       31 c0                   xor    %eax,%eax
  4005a3:       c3                      retq

Quindi sostituisci 0x90 con i tuoi byte Inst. Naturalmente non vedrai le istruzioni effettive su un objdump normale e il programma probabilmente non eseguirà sul tuo sistema (a meno che tu non usi una delle combinazioni NOP), ma il simulatore dovrebbe riconoscerla se è correttamente implementato lì.

Si noti che non ci si può aspettare che il compilatore ottimizza bene per te quando non conosce queste istruzioni e dovresti prenderti cura e lavorare con le opzioni Clobber/Input/Output in linea se cambia lo stato (registri, memoria), a Garantire la correttezza. Usa le ottimizzazioni solo se è necessario.


Soluzione complicata

L'approccio alternativo è quello di implementarlo nel tuo compilatore: può essere fatto in GCC, ma come affermato nei commenti LLVM è probabilmente uno dei migliori con cui giocare, poiché è progettato come piattaforma di sviluppo del compilatore, ma è ancora molto complicato Poiché LLVM è più adatto alle fasi di ottimizzazione IR ed è un po 'meno amichevole quando si cerca di modificare i backend specifici del target.
Tuttavia, è fattibile e devi farlo se prevedi anche di far decidere il tuo compilatore quando emettere queste istruzioni. Suggerirei di iniziare dalla prima opzione, per vedere se il tuo simulatore funziona anche con questa aggiunta e solo poi trascorrere del tempo sul lato del compilatore.

Se e quando decidi di implementarlo in LLVM, la tua scommessa migliore è definirlo come una funzione intrinseca, c'è relativamente più documentazione al riguardo qui - http://llvm.org/docs/extendingllvm.html

Altri suggerimenti

È possibile aggiungere nuove istruzioni o modificare esistenti modificando il gruppo di file in GCC chiamato "Descrizione della macchina". Modelli di istruzione in <target>.md file, qualche codice in <target>.c File, predicati, vincoli e così via. Tutti questi si pone $GCCHOME/gcc/config/<target>/ cartella. Tutte queste cose che utilizzano il codice ASM di generazione di RTL. È inoltre possibile modificare i casi di istruzioni emettenti modificando alcuni altri file di origine GCC generali, modificare la generazione di alberi SSA, la generazione di RTL, ma tutto questo un po 'complicato. Una semplice spiegazione cosa è successo:

https://www.cse.iitb.ac.in/grc/slides/cgotut-gcc/topic5-md-intro.pdf

È fattibile e l'ho fatto, ma è noioso. È fondamentalmente il processo di porting il compilatore su una nuova piattaforma, utilizzando una piattaforma esistente come modello. Da qualche parte in GCC c'è un file che definisce il set di istruzioni e passa attraverso vari processi durante la compilation che generano ulteriori codice e dati. Sono passati oltre 20 anni da quando l'ho fatto, quindi ho dimenticato tutti i dettagli, scusa.

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