Нет, хотя релиз всё еще не вышел. Я решил перейти на использование trunk ветки разработки llvm и перешел с subversion на git. Т.е. сейчас уже работаю дальше)) Чуть позже будет ссылка на репозиторий на github'е.
Нет, хотя релиз всё еще не вышел. Я решил перейти на использование trunk ветки разработки llvm и перешел с subversion на git. Т.е. сейчас уже работаю дальше)) Чуть позже будет ссылка на репозиторий на github'е.
С любовью к вам, Yandex.Direct
Размещение рекламы на форуме способствует его дальнейшему развитию
Как продвигается проект?
Лучше сделать и жалеть, чем не сделать и жалеть.
Некоторые из моих поделок тут: https://github.com/serge-404
За прошедшие пару месяцев я перешел на разработку в trunk ветку LLVM. Часть кода была переписана, другая часть изменена. Была добавлена генерация машинного кода, который сейчас можно увидеть в ассемблерных листингах, а в дальнейшем будет возможность получать бинарные файлы. В целом сейчас имеются пожалуй два основных вопроса, которые нужно решить:
- Реализовать инструкции для работа с памятью (чтение/запись данных). Здесь основная проблема сейчас в том, что у Z80 есть много команд для чтения/записи данных, но сами опкоды имеют разный формат и при этом они еще используют лишь определенные регистры. Например команды чтения:
Тут с точки зрения простоты реализации для LLVM лучше всего было бы иметь команды вида LD rp,(nn), т.е. где нет явно определенных операндов.Код:LD A,(BC/DE) LD r,(HL) LD r,(IX/IY+offset) LD A,(nn) LD HL,(nn) LD rp,(nn)
- Как использовать альтернативный набор регистров и стоит ли это делать вообще.
В остальном уже сейчас можно получать рабочий код, правда на данный момент он будет местами громоздкий и не эффективный, но это уже дело оптимизации, которая будет следующим этапом.
Весь проект находится здесь: https://github.com/earl1k/llvm-z80
По поводу альтернативных регистров я как-то ломал голову. Идеи такие (в идеале нужно как-то что-то из этого комбинировать наверное):
1. Определить альтернативные регистры наряду с обычными и потом специальным проходом(-ами) расставлять ΕΧΧ и т.п., разруливать использование регистров из разных наборов в одной операции, группировать операции по набору используемых регистров (возможно имеющийся в llvm механизм scheduling как-то можно для этого заюзать) и пр. Что-то подобное, если я правильно помню, сделано в X86-бэкенде для FP-операций.
2. Разные наборы регистров - в разных классах, соответственно разные наборы [идентичных] операций для них. (псевдоинструкции пользующие альт. регистры, которые впоследствии преобразуются в обычные) Громоздко или/и нужно дублирующие операции автогенерировать. Проблема расстановки ΕΧΧ и т.п., группировки операций для минимизации кол-ва ΕΧΧ также остается.
3. Псевдо-32-бит регистры, (HLHL и т.д.) см. например примеры в псевдокоде на http://www.andreadrian.de/oldcpu/Z80..._cruncher.html
4. Некий вариант п. 1 или 2 с собственным register allocator, учитывающим наличие двух наборов.
Собственно, задачи правильной расстановки операций ΕΧΧ и группировки регистровых операций для минимизации их кол-ва, необходимо решать в любом случае.
Последний раз редактировалось mastermind; 19.02.2013 в 19:01.
mastermind, я тоже обдумывал разные варианты. Мне как раз кажется наиболее лучшим вариантом будет 1-ый или 3-ий вариант, который ты описал.
Для 1-го случая надо разобраться получше как работает scheduling, думаю он поможет группировать команды таким образом, чтобы минимизировать кол-во переключения наборов регистров через EXX.
Для реализации 3-го варианта достаточно просто добавить псевдоинструкции и потом их вручную разворачивать.
Кстати, насчет rtlib, вот это видел?: http://compiler-rt.llvm.org/
Вроде оно в целом на C написано с вариациями оптимизированного кода на асме для разных процессоров. Т.е. по идее для начала можно тупо заюзать и для Z80, оптимизациями можно и позже заняться.The current feature set of compiler-rt is:
Full support for the libgcc interfaces on supported targets.
High performance hand tuned implementations of commonly used functions like __floatundidf in assembly that are dramatically faster than the libgcc implementations.
A target-independent implementation of the Apple "Blocks" runtime interfaces.
О libgcc:
http://gcc.gnu.org/onlinedocs/gccint/Libgcc.html
Т.е. софтовая реализация умножений, делений, fp-операций и т.п.Most of the routines in libgcc handle arithmetic operations that the target processor cannot perform directly. This includes integer multiply and divide on some machines, and all floating-point and fixed-point operations on other machines. libgcc also includes routines for exception handling, and a handful of miscellaneous operations.
mastermind, это уже видел) Прикрутим обязательно и посмотрим что выйдет
Рад, что тема еще не забыта. Работа над проектом идет, правда в последнее время совсем нет времени на него.
Вот по этой ссылочке есть примерный roadmap с указанием того, что уже реализовано и что планируется реализовать в ближайшее время: https://github.com/earl1k/llvm-z80/wiki/Roadmap
Поддерживаю. Пора обновляться и смотреть что нового добавилось и изменилось в LLVM, ведь в прошлом месяце вышла новая версия этой замечательной системы. Вот только возьмусь за это где-то в конце августа-сентябре, т.к. через неделю отпуск и на работе надо дела кое-какие утрясти.
ZX Evolution 4096 Rev.C + NeoGS 4096 Rev.C + PAL Coder Rev.C + FDD 3.5/HDD/CDROM
Reverse U8
Вернулся из отпуска. Обновил репозиторий объединив имеющиеся наработки со свежей веткой LLVM.
Репозиторий: https://github.com/earl1k/llvm-z80
ZX Evolution 4096 Rev.C + NeoGS 4096 Rev.C + PAL Coder Rev.C + FDD 3.5/HDD/CDROM
Reverse U8
Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)