Вопрос

Я хочу проверить некоторые изменения архитектуры на уже существующей архитектуре (x86) с использованием симуляторов. Однако, чтобы правильно проверить их и запустить тесты, мне, возможно, придется внести некоторые изменения в набор инструкций, есть ли способ добавить эти изменения в GCC или любого другого компилятора?

Это было полезно?

Решение

Простое решение:

Одним из общих подходов является добавление встроенной сборки и напрямую кодировать байты инструкции.

Например:

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

Другие советы

Вы можете добавить новые инструкции или изменить существующие, изменяя группу файлов в GCC под названием «Описание машины». Образец инструкции в <target>.md Файл, какой -то код в <target>.c Файл, предикаты, ограничения и т. Д. Все это лежат в $GCCHOME/gcc/config/<target>/ папка. Все эти вещи, использующие на шаге кода генерации ASM от RTL. Вы также можете изменить случаи излучения инструкций путем изменения некоторых других общих исходных файлов GCC, изменить генерацию дерева SSA, генерацию RTL, но все это немного сложно. Простое объяснение, что произошло:

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

Это выполнимо, и я сделал это, но это утомительно. Это в основном процесс порта компилятора на новую платформу, используя существующую платформу в качестве модели. Где -то в GCC есть файл, который определяет набор инструкций, и он проходит различные процессы во время компиляции, которые генерируют дальнейший код и данные. С тех пор, как я это сделал 20+ лет, поэтому я забыл все детали, извините.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top