Forth http://fforum.winglion.ru/ |
|
упихнуть в 4 бита 35 команд http://fforum.winglion.ru/viewtopic.php?f=3&t=2352 |
Страница 1 из 2 |
Автор: | mOleg [ Вс дек 20, 2009 01:37 ] |
Заголовок сообщения: | упихнуть в 4 бита 35 команд |
в результате общения с in4 в irc канале родилась идея, как можно упихать в 4 бита 35 команд без потери плотности кода и скорости исполнения. Идея заключается в том, что каждая команда является так же префиксом для следующей, в результате чего получается некий 35-мерный граф переходов. каждая из 35 таблиц команд формируется исходя из статистических рассчетов вероятности появления следующей команды. Чтобы представить себе более наглядно, можно нарисовать следующую картинку: имеется 35 комнат, каждая из которых хранит какое-то устройство, из каждой комнаты имеется переход в 16 других, в некотором редком случае попасть в нужную комнату можно пройдя всего одну другую (нейтральную) комнату. вот 8) |
Автор: | dynamic-wind [ Вс дек 20, 2009 22:10 ] |
Заголовок сообщения: | |
Скорость исполнения автоматически снизится из-за сложного декодера |
Автор: | mOleg [ Вс дек 20, 2009 22:17 ] |
Заголовок сообщения: | |
dynamic-wind писал(а): Скорость исполнения автоматически снизится из-за сложного декодера
Я не думаю, что он будет таким уж сложным и медленным, он будет скорее БОЛЬШИМ, что не очень приятно при реализации в ПЛИСе. |
Автор: | dynamic-wind [ Вс дек 20, 2009 22:40 ] |
Заголовок сообщения: | |
Вообще-то да, если вместо 4-входовой ПЛМ поставить 8-входовую, разницы в быстродействии практически никакой. А БОЛЬШИМ будет кодогенератор, которому надо знать, что каждая команда имеет опкод, зависящий от предыдущего, и что некоторые "маловероятные" команды нельзя закодировать после данной. |
Автор: | mOleg [ Вс дек 20, 2009 22:43 ] |
Заголовок сообщения: | |
dynamic-wind писал(а): и что некоторые "маловероятные" команды нельзя закодировать после данной.
можно, но через специальный нейтральный префикс (nop). |
Автор: | вопрос [ Вс дек 20, 2009 22:58 ] |
Заголовок сообщения: | |
конкретную схему можно как-то нарисовать? |
Автор: | in4 [ Пн дек 21, 2009 00:59 ] |
Заголовок сообщения: | |
mOleg писал(а): как можно упихать в 4 бита 35 команд без потери плотности кода и скорости исполнения. Там в общем случае даже больше возможностей получается - суперинструкции даже можно сделать. Но без нормального средства анализа я в эту область не полезу!
А вот более простой вариант можно реализовать! Идея в том, чтобы использовать некоторые последовательности команд, которые не имеют смысла для 4х битного кода, упакованного в байты. Например, если первая команда (в смысле исполнения, а не кодирования в байте!) RET или JMP , то следующая команда никогда не будет выполена! (Вариант, когда выполнение переходов откладывается до окончания команды, возможно, будем рассматривать позже и обсуждать в другой ветке. ) Таким образом, байт с командами RET : XXX можно рассматривать как команду с префиксом! И добавить еще 15(!) других команд! (Считая, что RET : NOP - это одна команда со смыслом RET ). Аналогично для JMP и CALL . Если в основном наборе есть IF , то и он тоже может быть таким же! Получается, что отдельные коды для префиксов можно и не выделять! Такое использование "кодового пространства" будет занимать меньше места в коде, чем даже макроподстановка невошедших в примитивы слов с использованем последовательностей реализованных примитивов. |
Автор: | вопрос [ Пн дек 21, 2009 01:07 ] |
Заголовок сообщения: | |
как получилась цифра 35? |
Автор: | mOleg [ Пн дек 21, 2009 01:13 ] |
Заголовок сообщения: | |
вопрос писал(а): как получилась цифра 35?
приблизительное количество форт-примитивов для комфортной работы. в принципе может быть и больше, только тогда выше шанс промаха (удлиннения команды за счет лишнего префикса) |
Автор: | mOleg [ Пн дек 21, 2009 01:16 ] |
Заголовок сообщения: | |
in4 писал(а): Таким образом, байт с командами RET : XXX можно рассматривать как команду с префиксом! И добавить еще 15(!) других команд!
не катит. Это будет именно префикс, я говорил про совсем другое. |
Автор: | in4 [ Пн дек 21, 2009 01:17 ] |
Заголовок сообщения: | |
В варианте с использованием последовательностей команд как префикса для одной такой команды: 16 + 15 =31 , для 2х: 16 + 2*15 =46 |
Автор: | WingLion [ Пн дек 21, 2009 01:19 ] |
Заголовок сообщения: | |
in4 писал(а): Получается, что префиксы можно не выделять!
Если говорить точнее, в таком случае получается, что IF, JMP и CALL - попросту префиксные команды! п.с. a вот RET:XXX - действительно интересно Можно даже сразу объединить CALL и RET пoд один код команды RET:0 - это RET, RET:1 - CALL RET:2 - RET-CALL = NEXT RET:3 - CALL #NN = короткий CALL по индексу (а таблица индексов (16 шт) прямо в памяти с адреса 0x00000000) в этот же список можно и JMP с IF вставить. RET:4 - IF RET:5 - JMP = LIT R> RET RET:6 - EXECUTE = R> RET Получается совсем здорово - высвобождается целых два кода! Короче, отличная мысля для 4-хбитника! |
Автор: | WingLion [ Пн дек 21, 2009 01:33 ] |
Заголовок сообщения: | |
А еще, можно сделать прямое кодирование для исполнения подобной префиксной команды. Просто назначить, что RET:XXX = последовательность (подпрограмма) от 4-х до 8-и ("простых" 4-хбитных) команд (заранее записанная в некий 32-разрядный регистр) |
Автор: | in4 [ Пн дек 21, 2009 01:35 ] |
Заголовок сообщения: | |
WingLion писал(а): Если говорить точнее, в таком случае получается, что IF, JMP и CALL - попросту префиксные команды! Только если они "первые" в группе А так - обычные WingLion писал(а): RET:3 - CALL #NN = короткий CALL по индексу А для этого лучше выделить несколько кодов, при этом одно из битовых полей команды будет индексом #NN
|
Автор: | WingLion [ Пн дек 21, 2009 01:38 ] |
Заголовок сообщения: | |
in4 писал(а): Только если они "первые" в группе Wink А так - обычные Wink
однако, более точно, если они НЕ ПОСЛЕДНИЕ в группе. |
Страница 1 из 2 | Часовой пояс: UTC + 3 часа [ Летнее время ] |
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group http://www.phpbb.com/ |