Я реализую серверную часть LLVM для процессора на основе аккумулятора. В настоящее время я, кажется, застрял в решении, как правильно сопоставить инструкции IR с ISA.
Примером может служить инструкция LLVM IR:
% c = добавить% a% b
Что должно быть напечатано как несколько машинных инструкций:
load a
add b
store c
Что я видел до сих пор, так это то, что можно сопоставить комбинированные операции IR LLVM в одной операции машинного кода (т. Е. [(set i32:$dst, (add (mul i32:$src1, i32:$src2), i32:$src3))]>
), но я не смог найти аналогичную конструкцию для ' другое направление.
В настоящее время решение, которое я вижу, состоит в том, чтобы определить псевдоинструкции с шаблонами, соответствующими IR LLVM, а затем развернуть их в пользовательском коде C ++. Я бы предпочел этого не делать, поскольку это полностью обойдёт цель использования файлов TableGen, а также потребует большого количества пользовательского кода.
У меня есть догадка, что должна быть возможность указывать такие конструкции в файлах .td, но я не смог найти ничего в бэкэндах верхнего уровня.
Насколько я могу судить, все доступные бэкэнды в восходящем направлении LLVM являются машинами регистр-регистр - мне не удалось найти бэкэнд LLVM с неявным операндом (например, аккумулятором). машины). Если будет доступна реализация такого бэкэнда с открытым исходным кодом, я был бы очень признателен за ссылку на него.