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 ]
Заголовок сообщения: 

Скорость исполнения автоматически снизится из-за сложного декодера :evil:

Автор:  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/