С любовью к вам, Yandex.Direct
Размещение рекламы на форуме способствует его дальнейшему развитию
Не обязательно на спеке. Например для ОС и ФС.
Разобрался я с этим 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 битных (и более) чисел с помощью имеющихся регистров.
Последний раз редактировалось EARL; 02.11.2012 в 18:14.
Это действительно радует.
---------- Post added at 18:29 ---------- Previous post was at 18:27 ----------
Портирование системного ПО с других платформ зачастую упирается в отсутствие поддержки компилятором long (32 бита). Простейший пример - библиотеки ФАТ32. Именно портирование, а не писание с нуля - реальный шанс поиметь на Спеке (или Орионе или еще чем-то) какое-то новое ПО. Просто в силу того, что уже никто не выдаст нужное количество человекочасов, сколько нужно для написания чего-то серьезного с нуля - уже не тот запал.
Последний раз редактировалось Error404; 02.11.2012 в 18:32.
Лучше сделать и жалеть, чем не сделать и жалеть.
Некоторые из моих поделок тут: https://github.com/serge-404
SfS, я думаю все операции с float все равно лучше делать в виде отдельной библиотеки. А на счет формата float, то в любом случае это будет IEEE 754, т.е. как раз стандартный, а не то что используется в бейсике.
На данный момент уже могут компилироваться многие программы работающие с 8 битной арифметикой. Имеются некоторые недоделки в плане условий (if). Для примера приведу код вычисления crc8:
А вот что мы получаем на выходе (входные данные передаются через HL - указатель на массив, A - длина массива):Код:unsigned char test(unsigned char *a, unsigned char size) { unsigned char crc = 0xFF; unsigned char i; while (size--) { crc ^= *a++; for (i = 0; i < 8; i++) crc = crc & 0x80 ? (crc<<1) ^ 0x31 : crc<<1; } return crc; }
Конечно не всё идеально, но crc8 вычисляется правильно. Если у кого-то есть свои примеры и интересно во что они скомпилируются, кидайте, покажу. Но замечу еще раз, что пока работа полностью реализована только для 8 битной арифметики, т.е. int пока в вычислениях использовать не получится. В ближайшее время займусь как раз реализацией 16 битной арифметики. Пока из нового все.Код:; BB#0: ; %entry ld b, a ld c, -1 jp .BB0_3 .BB0_2: ; %while.cond.loopexit ; in Loop: Header=BB0_3 Depth=1 inc hl .BB0_3: ; %while.cond.loopexit ; =>This Loop Header: Depth=1 ; Child Loop BB0_5 Depth 2 ld a, b cp 0 jp z, .BB0_1 ; BB#4: ; %while.body ; in Loop: Header=BB0_3 Depth=1 ld a, (hl) xor c ld e, a ld d, 0 dec b .BB0_5: ; %for.body ; Parent Loop BB0_3 Depth=1 ; => This Inner Loop Header: Depth=2 ld a, e and -128 ld hx, a sla e ld a, e xor 49 ld c, a ld a, hx cp 0 jp nz, .BB0_7 ; BB#6: ; %for.body ; in Loop: Header=BB0_5 Depth=2 ld c, e .BB0_7: ; %for.body ; in Loop: Header=BB0_5 Depth=2 inc d ld a, d cp 8 ld e, c jp z, .BB0_2 jp .BB0_5 .BB0_1: ; %while.end ld a, c ret![]()
Интересный проект.
Интересно как будет выглядеть декодер mp3 в Z80 асме ).
P.S. а х86 фронт-энд вы случайно не планируете сделать ) ?
shurik-ua, front-end'ов для llvm существует уже не мало. Начиная от clang или gcc+DragonEgg заканчивая Lua.
Уже результат. Таки инты надо)
Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)