Оптимальный способ передачи нескольких ассемблерных инструкций из одной ИК инструкции LLVM - PullRequest
0 голосов
/ 05 сентября 2018

Я реализую серверную часть 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 с неявным операндом (например, аккумулятором). машины). Если будет доступна реализация такого бэкэнда с открытым исходным кодом, я был бы очень признателен за ссылку на него.

...