Простое решение:
Одним из общих подходов является добавление встроенной сборки и напрямую кодировать байты инструкции.
Например:
int main()
{
asm __volatile__ (".byte 0x90\n");
return 0;
}
компилируется (GCC -O3) в:
00000000004005a0 <main>:
4005a0: 90 nop
4005a1: 31 c0 xor %eax,%eax
4005a3: c3 retq
Так что просто замените 0x90 на байты Inst. Конечно, вы не увидите фактическую инструкцию по обычному objdump, и программа, вероятно, не будет работать в вашей системе (если вы не используете одну из комбинаций NOP), но симулятор должен распознать его, если она будет правильно реализована.
Обратите внимание, что вы не можете ожидать, что компилятор будет хорошо оптимизировать для вас, когда она не знает этой инструкции, и вам следует позаботиться и работать с встроенными параметрами Clobber/Input/Output Обеспечить правильность. Используйте оптимизацию, только если вам нужно.
Сложный решение
Альтернативный подход состоит в том, чтобы реализовать это в вашем компиляторе - он может быть сделан в GCC, но, как указано в комментариях LLVM, вероятно, является одним из лучших, с которыми он может играть, так как он разработан в качестве платформы разработки компилятора, но он все еще очень сложный Поскольку LLVM лучше всего подходит для этапов оптимизации ИК и несколько менее дружелюбен при попытке изменить ориентированные на целевые бэкэнды.
Тем не менее, это выполнимо, и вы должны сделать это, если вы также планируете, чтобы ваш компилятор решил, когда выпустить эту инструкцию. Я бы посоветовал начать с первого варианта, чтобы увидеть, работает ли ваш симулятор с этим дополнением, и только тогда провести время на стороне компилятора.
Если и когда вы решите реализовать это в LLVM, лучше всего определить его как внутреннюю функцию, здесь есть относительно больше документации по этому поводу - здесь - http://llvm.org/docs/extendingllvm.html