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