Базовая легализация LLVM - PullRequest
0 голосов
/ 05 февраля 2020

наша команда в настоящее время создает бэкэнд LLVM для встраиваемых систем. Мы ищем совета относительно лучшего / правильного способа реализации наших классов регистров на этапе легализации. В качестве обзора наш бэкэнд имеет 8-битные, 16-битные, 32-битные и 64-битные классы регистров. Наш набор команд состоит в основном из 8-битных и 16-битных инструкций. 32-битные и 64-битные инструкции обычно используются в операциях доступа к памяти.

Ссылка на бэкэнд LLVM, которую мы использовали, - это AVR. В их реализации 8-битные и 16-битные регистровые классы были добавлены с функцией addRegisterClass (они имеют только до 16-битных регистров) в их TargetLowering. При этом 32-разрядные и 64-разрядные операции автоматически разделяются на эквивалентные 8/16-разрядные операции в группе обеспечения доступности баз данных после этапа легализации.

Для бэкэнда LLVM, который мы сейчас разрабатываем, с одной стороны, добавление 32-битных и 64-битных классов регистров приведет к выводу узлов DAG, содержащих 32/64-битные операции. Это потребует от нас создания псевдо-инструкций в TableGen для расширения до его 8/16-битных эквивалентных операций. С другой стороны, не добавление этих классов регистров будет иметь такое же поведение с AVR.

Мы не знаем о последствиях обоих случаев. Мы проверили это только с операциями загрузки и хранения. Мы не проверили правильность вывода DAG для других операций. Что мы должны учитывать при принятии решения о том, что использовать в нашей реализации?

Заранее большое спасибо за ваши усилия и помощь!

...