Немного поздновато, конечно. Но, тем не менее.
Сам столкнулся вчера с такой проблемой:
Да, во-первых, данные со стэка медленно забираются, а во-вторых, если в процедуре много работы с ними (особенно в циклах), то программа из за косвенной адресации через индексные регистры замедляется чрезвычайно! Ведь любая операция съедает 19 тактов, и это на 1 байт данных(!).
Решил проблему так:
взял вместо Си-исходника, сгенерённый SDCC asm-исходник. Добавил в конце п/п пустые переменные, соответствующие аргументам функции. В начале процедуры добавил копирование аргументов со стека через LDI/LDIR.
Соответственно, вручную пришлось править весь исходник, но оно того стоило: теперь работает в разы быстрее.
Думаю также с локальными переменными поступить.
Последний раз редактировалось Sergey; 05.09.2013 в 11:14.
С уважением,
Gris / Red Triangle.
_____________________________________
ZX-EVO/TS-Labs config/NGS/HDD/SD-card
Amiga A1200/Blizzard 1230@50/32/60GB
Amiga A1200/Apollo 1260@66/32/60GB
UnAmiga (C5) AGA GM7123 VideoDAC
Sergey, на данный момент генерируется код, работающий со стеком через индексные регистры. В последствии можно будет сделать опцию и добавить какой-нибудь другой алгоритм передачи параметров.
В описанном тобой способе есть свои минусы. Например не получится реализовать рекурсивные функции, однако, в некоторых случаях это приемлемо и даст хороший прирост скорости
ZX Evolution 4096 Rev.C + NeoGS 4096 Rev.C + PAL Coder Rev.C + FDD 3.5/HDD/CDROM
Reverse U8
Это понятно. Также ещё этот метод не подойдёт для ПЗУ.
Думаю, опцию можно реализовать как "__naked" в SDCC.
Кстати, если что, готов в бетатестеры.
---------- Post added at 16:07 ---------- Previous post was at 16:00 ----------
Ах да, чуть не забыл: реквестирую инструкцию препроцессора для выравнивания кода/данных на границу слова. В SDCC такой фичи очень не хватает, ведь DMA в TS-Config работает только с четными адресами.
С уважением,
Gris / Red Triangle.
_____________________________________
ZX-EVO/TS-Labs config/NGS/HDD/SD-card
Amiga A1200/Blizzard 1230@50/32/60GB
Amiga A1200/Apollo 1260@66/32/60GB
UnAmiga (C5) AGA GM7123 VideoDAC
вчера скачал всё репозитории.
llvm собрался, а вот clang не захотел
С любовью к вам, Yandex.Direct
Размещение рекламы на форуме способствует его дальнейшему развитию
Странно. У меня с помощью cmake все собирается. Проблемы могут быть как раз только при использовании ../configure.
Нужен лог сборки, чтобы понять в чем проблема.
Можешь написать мне на почту или в аську, разберемся.
ZX Evolution 4096 Rev.C + NeoGS 4096 Rev.C + PAL Coder Rev.C + FDD 3.5/HDD/CDROM
Reverse U8
сейчас не могу и когда смогу не знаю. наверное я гдето сам прокосячил. но если доберусь - напишу.
В общем поглядел.
Собираю llvm:
# cmake -DCMAKE_INSTALL_PREFIX=/home/salex/app-clang-z80/ ..
# make -j6
# make install
Всё пучком, инсталлирует.
Далее собираю clang
#cmake -DCLANG_PATH_TO_LLVM_BUILD=/home/salex/app-clang-z80/ -DCMAKE_INSTALL_PREFIX=/home/salex/app-clang-z80/ ..
# make
Получаю:
make[2]: *** Нет правила для сборки цели `/home/salex/app-clang-z80/bin/llvm-tblgen', требуемой для `include/clang/Driver/Options.inc.tmp'. Останов.
make[1]: *** [include/clang/Driver/CMakeFiles/ClangDriverOptions.dir/all] Ошибка 2
make: *** [all] Ошибка 2
И ещё - многопоточная сборка для сlang вообще не работает почемуто. (Ключ make -j6)
Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)