По поводу альтернативных регистров я как-то ломал голову. Идеи такие (в идеале нужно как-то что-то из этого комбинировать наверное):
1. Определить альтернативные регистры наряду с обычными и потом специальным проходом(-ами) расставлять ΕΧΧ и т.п., разруливать использование регистров из разных наборов в одной операции, группировать операции по набору используемых регистров (возможно имеющийся в llvm механизм scheduling как-то можно для этого заюзать) и пр. Что-то подобное, если я правильно помню, сделано в X86-бэкенде для FP-операций.
2. Разные наборы регистров - в разных классах, соответственно разные наборы [идентичных] операций для них. (псевдоинструкции пользующие альт. регистры, которые впоследствии преобразуются в обычные) Громоздко или/и нужно дублирующие операции автогенерировать. Проблема расстановки ΕΧΧ и т.п., группировки операций для минимизации кол-ва ΕΧΧ также остается.
3. Псевдо-32-бит регистры, (HLHL и т.д.) см. например примеры в псевдокоде на http://www.andreadrian.de/oldcpu/Z80..._cruncher.html
4. Некий вариант п. 1 или 2 с собственным register allocator, учитывающим наличие двух наборов.
Собственно, задачи правильной расстановки операций ΕΧΧ и группировки регистровых операций для минимизации их кол-ва, необходимо решать в любом случае.




Ответить с цитированием