mastermind, нет, не в курсе. Если разбирался с этим, то думаю стоить обменяться контактами. Поможешь понять что это и с чем едят :)
Вид для печати
mastermind, нет, не в курсе. Если разбирался с этим, то думаю стоить обменяться контактами. Поможешь понять что это и с чем едят :)
Всерьез не разбирался, но знаю что это либа (часть llvm) для эмуляции неподдерживаемых напрямую (на каком-либо процессоре) операций. Насколько я понимаю, она просто генерит ir-код используя доступные на процессоре операции. (т.е. полезно для быстрой реализации всяких умножений/делений, операций с разрядностью больше 8 и т.д.).
Чтоб найти примеры использования просто поищи RTLIB в коде существующих таргетов.
(ну контакты тоже сейчас скину в личку на всякий случай, хотя думаю что лучше на форуме все обсуждать, может это будет способствовать всеобщему brainstorming-у ;) )
Имеется код сравнения двух чисел:
CC - флаг условия.Код:LD A,arg1
CP arg2
JP (CC),label
arg1, arg2 - числа для сравнения вида arg1 [условие] arg2, где условие может быть одним из всевозможных вариантов (>, <, ==, !=, >=, <=).
Также сравниваемые значения могут быть двух типов: знаковые и беззнаковые.
Для обоих типов:
== - Z
!= - NZ
Для беззнаковых:
< - C
>= - NC
Для знаковых:
< - M (для знаковых)
> - P (для знаковых)
Требуется помощь в составлении полной таблицы условия - флаги.:)
Знаю, что для всех условий в Z80 не найдутся флаги, поэтому найти нужно хотя бы половину, а остальные можно будет инвертировать.
Код:LD A,arg1
CP arg2
JP (CC),cont
JP label
cont:
Не обязательно на спеке. Например для ОС и ФС.
Разобрался я с этим RTLIB.:) Вообщем эта штука немного другое делает. Если в двух словах, то она для неподдерживаемых архитектурой команд вставляет вызовы функций с заданными именами. Т.е. можно будет написать библиотеку где будут эти функции и просто линковать скомпилированную программу с этой библиотекой. Например Z80 никак не поддерживает команду умножения и деления, а в llvm есть такие команды.:)
После компиляции получается вот что:Код:define i8 @test(i8 %a, i8 %b)
{
%res = mul i8 %a, %b
ret i8 %res
}
Аргументы передаются в регистрах A, B. Функция возвращает результат в регистре A.Код:call _mathLib_MULi8
ret
Однако llvm все же радует кое чем. Например если архитектура имеет только 16 битные регистры, то llvm сам умеет создавать цепочку команд для вычисления 32 битных (и более) чисел с помощью имеющихся регистров.
Это действительно радует.
---------- Post added at 18:29 ---------- Previous post was at 18:27 ----------
Портирование системного ПО с других платформ зачастую упирается в отсутствие поддержки компилятором long (32 бита). Простейший пример - библиотеки ФАТ32. Именно портирование, а не писание с нуля - реальный шанс поиметь на Спеке (или Орионе или еще чем-то) какое-то новое ПО. Просто в силу того, что уже никто не выдаст нужное количество человекочасов, сколько нужно для написания чего-то серьезного с нуля - уже не тот запал.