Forth и другие саморасширяющиеся системы программирования Locations of visitors to this page
Текущее время: Чт мар 28, 2024 15:17

...
Google Search
Forth-FAQ Spy Grafic

Часовой пояс: UTC + 3 часа [ Летнее время ]




Ответить
Имя пользователя:
Заголовок:
Текст сообщения:
Введите текст вашего сообщения. Длина сообщения в символах не более: 60000

Размер шрифта:
Цвет шрифта
Настройки:
BBCode ВКЛЮЧЕН
[img] ВЫКЛЮЧЕН
[flash] ВЫКЛЮЧЕН
[url] ВКЛЮЧЕН
Смайлики ВЫКЛЮЧЕНЫ
Отключить в этом сообщении BBCode
Не преобразовывать адреса URL в ссылки
Вопрос
Теперь гостю придется вводить здесь пароль. Не от своей учетной записи, а ПАРОЛЬ ДЛЯ ГОСТЯ, получить который можно после регистрации на форуме через ЛС.:
Этот вопрос предназначен для выявления и предотвращения автоматических регистраций.
   

Обзор темы - Вздрогнули: Описание soft-процессоров серии EQUINOX
Автор Сообщение
  Заголовок сообщения:   Ответить с цитатой
Цитата:
вот такой текст:
WingLion писал(а):
В форте каждое высокоуровневое слово требует исполнения NEXT, если и само NEXT будет высокоуровневым, то задержка окажется существенной.
за "какую-нибудь оценку" сойдет?

Угу, как это я пропустил ...

Цитата:
голый IF выполняется быстрее чем префиксный IF. Вот только для "голого" вершину стека придется специально "готовить" (варить, солить или жарить), а это уже будет медленнее, чем IF с прямым указанием условия для перехода

ну да
Сообщение Добавлено: Сб дек 05, 2009 17:45
  Заголовок сообщения:   Ответить с цитатой
вопрос писал(а):
Какая-нибудь оценка прироста производительности вследствие такой оптимизации как NEXT и вызов за 1 такт производилась?


вот такой текст:

WingLion писал(а):
В форте каждое высокоуровневое слово требует исполнения NEXT, если и само NEXT будет высокоуровневым, то задержка окажется существенной.

: NEXT R> DUP 1+ >R EXECUTE ; - грубо - 5 тактов, а в железе NEXT исполняется за 2 такта,
Если в каждом высокоуровневом слове в среднем 5-7 слов, то получается 15-25 тактов выигрыша на каждое слово. Мелочь, конечно, но душу греет. Wink
Кроме того, железный NEXT позволяет делать очень коротенькие слова вплоть до 1 CELL на слово, т.е. в одном слове три команды + NEXT, а в потоке адресной интерпретации только ссылка на адрес, где это слово с командами лежит. Т.е. хороший выигрыш не только по тактам, но и по занимаемому объему, что довольно важно для ограниченной внутренней памяти ПЛИС.


за "какую-нибудь оценку" сойдет?

вопрос писал(а):
это, я понимаю, тоже несколько быстрее, чем просто IF


голый IF выполняется быстрее чем префиксный IF. Вот только для "голого" вершину стека придется специально "готовить" (варить, солить или жарить), а это уже будет медленнее, чем IF с прямым указанием условия для перехода
Сообщение Добавлено: Сб дек 05, 2009 17:27
  Заголовок сообщения:   Ответить с цитатой
Цитата:
Это пока проект.
Увлекательно ... Большая "куча" возможностей. Какая-нибудь оценка прироста производительности вследствие такой оптимизации как NEXT и вызов за 1 такт производилась?
0. - IF Z
1. - IF NZ
2. - IF больше 0
3. - IF меньше 0
это, я понимаю, тоже несколько быстрее, чем просто IF
Сообщение Добавлено: Сб дек 05, 2009 16:45
  Заголовок сообщения:   Ответить с цитатой
вопрос писал(а):
а какие 16 условий Question


три бита модификатора для IF (все для TOP) - коды (ориентировочно):
0. - IF Z
1. - IF NZ
2. - IF больше 0
3. - IF меньше 0
4. - IF не больше 0 (меньше или равно)
5. - IF не меньше 0 (больше или равно)
6. - IF старший бит TOP = 1
7. - IF младший бит TOP = 1

Четвертый бит модификатора IF - использовать следующий ниббл из потока команд, как смещение для условного перехода (от -7 до +7).
код смещения 0 - означает условное исполнение следующего ниббла (получатся условный RET, условный NEXT и т.п.)

п.с. Это пока проект. Возможно все будет по другому.
Сообщение Добавлено: Сб дек 05, 2009 14:13
  Заголовок сообщения:   Ответить с цитатой
Цитата:
IF префиксной. Тогда можно сделать до 16 условий. Или 8 условий плюс признак короткого ветвления с переходом по 16-битному смещению.
а какие 16 условий :?:
Сообщение Добавлено: Сб дек 05, 2009 13:10
  Заголовок сообщения:   Ответить с цитатой
in4 писал(а):
А можно даже больше таких команд, используя как адрес все оставшиеся биты CELL-а!

Пока еще думаю об этом. Экономия будет только для подпрограммного кода, а его преимущества при наличии железного адресного интерпретатора кажутся сомнительными.


in4 писал(а):
Но, может, и другие операции со стеком возврата добавить - для циклов, для косвеной адресации через верхушку RS... А еще один-два индексных регистра с автоинкрементом, воможность байтовой адресации, литералы к команде...

Сильно усложнять процессор тоже не хочется. Для байтового доступа пока сделана только команда BSWAP - перестановка байтов в слове, понадобится больше - буду думать.
С индексными регистрами тоже могут возникнуть вопросы - а где коды команд для них брать?

in4 писал(а):
А не от 2х четверок? Wink Или так нельзя, тогда почему? (Даже при CELL=8бит данные могут быть и 2х-байтные, 2 CELL на данное. Еще можно сделать 2 вида литерала, один из которых берет байт но с расширением знака - экономия Wink )


Восьмибитный вариант процессора по какой-то причине у меня не заработал сразу в общей схеме (через установку параметра в исходнике - WIDTH=8 ). И я еще не разбирался почему.
Но, думаю такой вариант процессора имеет право на существование. Для каких-нибудь мелких контроллеров. И по объему, он наверняка уместится в очень маленькую ПЛИС-ку.


in4 писал(а):
Просто на рисунке сделано по-другому и может вызвать запинки и ненужные вопросы. Хотя это м.б. и тест на понимание, типа входного контроля читающего, как посмотреть...


Рисунок надо бы просто переделать. А то он делался раньше, еще для другого процессора (о нем можно уже забыть).


in4 писал(а):
Имелось ввиду использовать этот термин в описании проца. Wink
(Сейчас не используется и ячейки называются длинными фразами "группа команд" (=CELL), "группами, упакованными в машинное слово"(=CELL-ами), "среди загруженных команд"(=в CELL) и т.п.)


Описание буду править полностью, когда доделаю целевой компилятор и на нем (процессоре) заработает полноценный форт.
Тогда можно будет внести исправления, что появятся в процессе отладки. Да и описание самой встроенной системы с форт-процессором добавить.


in4 писал(а):
Кстати, не хочешь бОльше условий добавить?
Проверку на отрицательное, по переносу (если флаг переноса делать не хочешь, тогда почему?) Как без переноса делать D+ ?


Думаю о том, чтобы сделать команду IF префиксной. Тогда можно сделать до 16 условий. Или 8 условий плюс признак короткого ветвления с переходом по 16-битному смещению.
На префиксность еще и LIT просится для организации коротких и длинных литералов.
Сообщение Добавлено: Сб дек 05, 2009 12:07
  Заголовок сообщения:   Ответить с цитатой
WingLion писал(а):
А я подумываю о том, чтобы использовать оставшееся пространство для коротких вызовов, например, сделать так, что если за командой CALL следует не нулевой ниббл, то исполняется одна из 15 подпрограмм с фиксированным адресом. Подобно INT #nn в Z80.
А можно даже больше таких команд, используя как адрес все оставшиеся биты CELL-а! ;)

WingLion писал(а):
Хм... вот, прямо тут сразу и идейка появилась для новой команды! ) R+@ которая выполняет R> DUP 1+ >R @ для вытаскивания такого операнда (за 2 такта).
Думаю, такое слово будет полезно. В процессоре оно будет исполняться очень быстро, и в железе оно не много места потребует, потому что R> DUP 1+>R фактически уже делается для NEXT.
Хорошо бы... ;) Но, может, и другие операции со стеком возврата добавить - для циклов, для косвеной адресации через верхушку RS... А еще один-два индексных регистра с автоинкрементом, воможность байтовой адресации, литералы к команде... ;)

WingLion писал(а):
Кроме того, железный NEXT позволяет делать очень коротенькие слова вплоть до 1 CELL на слово, т.е. в одном слове три команды + NEXT, а в потоке адресной интерпретации только ссылка на адрес, где это слово с командами лежит.
После этого^ в сочетании с др. объяснениями - проникся... ;)

WingLion писал(а):
этот рисунок сильно упрощен. Надо подразумевать, что в CELL может быть от 3 до 16 четверок в CELL
А не от 2х четверок? ;) Или так нельзя, тогда почему? (Даже при CELL=8бит данные могут быть и 2х-байтные, 2 CELL на данное. Еще можно сделать 2 вида литерала, один из которых берет байт но с расширением знака - экономия ;) )

WingLion писал(а):
При исполнении команд, сначала исполняется самая правая (младшая) четверка бит, сдвиг в регистре команды происходит на 4 бита 'вправо'.
Просто на рисунке сделано по-другому и может вызвать запинки и ненужные вопросы. Хотя это м.б. и тест на понимание, типа входного контроля читающего, как посмотреть... ;)

WingLion писал(а):
in4 писал(а):
Может, ввести термин CELL для обозначения адресуемой единицы памяти (и одновременно группы команд в ней)?

Ну странновато звучит предложение ввести термин, который уже давно как бы стандартен
Имелось ввиду использовать этот термин в описании проца. ;)
(Сейчас не используется и ячейки называются длинными фразами "группа команд" (=CELL), "группами, упакованными в машинное слово"(=CELL-ами), "среди загруженных команд"(=в CELL) и т.п.)

Кстати, не хочешь бОльше условий добавить?
Проверку на отрицательное, по переносу (если флаг переноса делать не хочешь, тогда почему?) Как без переноса делать D+ ?
Сообщение Добавлено: Сб дек 05, 2009 11:21
  Заголовок сообщения:   Ответить с цитатой
in4 писал(а):
Согласен. А еще для эффективности остаток CELL луше заполнять NOP-ами

собственно, особого смысла в этом нет, потому что после первого же CALL в процессоре NOP (загрузка группы команд из адреса, куда вызов произошел) выполняется автоматом.
А я подумываю о том, чтобы использовать оставшееся пространство для коротких вызовов, например, сделать так, что если за командой CALL следует не нулевой ниббл, то исполняется одна из 15 подпрограмм с фиксированным адресом. Подобно INT #nn в Z80.

in4 писал(а):
Да. Но если CALL сделать последней командой, то предыдущие команды CELL-а могут еще много чего сделать. Например, загрузить 3 литерала! Wink
А если подряд несколько CALL-ов, то да, один CALL на CELL

Да, так и есть. Кстати, слово, вызванное через адресный интерпретатор, вполне может достать адрес со стека возвратов, взять несколько слов, расположенных после своего адреса в потоке интерпретации и вернуть на стек возвратов модифицированный адрес, т.е. параметры для слова могут следовать за его адресом непосредственно.
Хм... вот, прямо тут сразу и идейка появилась для новой команды! ;)) R+@ которая выполняет R> DUP 1+ >R @ для вытаскивания такого операнда (за 2 такта).
Думаю, такое слово будет полезно. В процессоре оно будет исполняться очень быстро, и в железе оно не много места потребует, потому что R> DUP 1+>R фактически уже делается для NEXT.

in4 писал(а):
Будет ли выгода от аппаратной адресной интерпретации? Были ли сделаны оценки эффективности?


В форте каждое высокоуровневое слово требует исполнения NEXT, если и само NEXT будет высокоуровневым, то задержка окажется существенной.

: NEXT R> DUP 1+ >R EXECUTE ; - грубо - 5 тактов, а в железе NEXT исполняется за 2 такта,
Если в каждом высокоуровневом слове в среднем 5-7 слов, то получается 15-25 тактов выигрыша на каждое слово. Мелочь, конечно, но душу греет. ;)
Кроме того, железный NEXT позволяет делать очень коротенькие слова вплоть до 1 CELL на слово, т.е. в одном слове три команды + NEXT, а в потоке адресной интерпретации только ссылка на адрес, где это слово с командами лежит. Т.е. хороший выигрыш не только по тактам, но и по занимаемому объему, что довольно важно для ограниченной внутренней памяти ПЛИС.



in4 писал(а):
Вопрос по рисунку http://winglion.ru/equinox/forth-code.png
Там изображен проц с 12-битовым CELL .

этот рисунок сильно упрощен. Надо подразумевать, что в CELL может быть от 3 до 16 четверок в CELL

in4 писал(а):
Где младшие разряды и в какой последовательности будет идти интерпретация? В примере для 16-разрядного CELL (из текста) старшие разряды были слева, а младшие справа.


'младшие' и 'старшие' ('левые' и 'правые') - это формальные названия. Если микросхему развернуть на 180 градусов (хотел написать Цельсия ;) ) порядок изменится, но суть памяти - нет.

Так и тут "как вы слово назовете, так оно и поплывет". В смысле, в железе есть некий условный порядок бит, который совпадает с порядком бит в обычном представлении чисел.

При исполнении команд, сначала исполняется самая правая (младшая) четверка бит, сдвиг в регистре команды происходит на 4 бита 'вправо'.

Пример в регистр команд загрузилось слово 573F -> исполняется последовательность команд F -> 3 -> 7 -> 5 пример безотносительно к тому, что делается в реальном процессоре.

in4 писал(а):
Может, ввести термин CELL для обозначения адресуемой единицы памяти (и одновременно группы команд в ней)?


Ну :shuffle; странновато звучит предложение ввести термин, который уже давно как бы стандартен ;)



in4 писал(а):
адресный


Thx!
Сообщение Добавлено: Сб дек 05, 2009 08:23
  Заголовок сообщения:   Ответить с цитатой
WingLion писал(а):
in4 писал(а):
для 16-битного варианта процессора, до 8 операндов для 32-хбитного и до 16 операндов для 64битного.

Вот тут не понял, в чем вопрос. В описании изначально 3 варианта процессора 16,32 и 64-битные.

Цитата:
для 16-битного варианта процессора, до 8 операндов для 32-хбитного и до 16 операндов для 6итного.

WingLion писал(а):
4 CALL в одной CELL не имеют смысла, так как достаточно одного для вызова адресного интерпретатора.
Согласен. А еще для эффективности остаток CELL луше заполнять NOP-ами
WingLion писал(а):
Если же надо исполнить несколько подпрограмм (заканчивающихся на RET) подряд, тогда каждый CALL займет дополнительный CELL
Да. Но если CALL сделать последней командой, то предыдущие команды CELL-а могут еще много чего сделать. Например, загрузить 3 литерала! ;)
А если подряд несколько CALL-ов, то да, один CALL на CELL :(

WingLion писал(а):
Разве что небольшое неудобство, что каждую подпрограмму надо в форт-слово оформлять, чтобы использовать ее вызов через адресный интерпретатор.
Будет ли выгода от аппаратной адресной интерпретации? Были ли сделаны оценки эффективности?

Вопрос по рисунку http://winglion.ru/equinox/forth-code.png
Там изображен проц с 12-битовым CELL .
Где младшие разряды и в какой последовательности будет идти интерпретация? В примере для 16-разрядного CELL (из текста) старшие разряды были слева, а младшие справа.
Цитата:
Команды загружаются в процессор группами, упакованными в машинное слово, и исполняются последовательно от младшей тетрады бит к старшей.


Может, ввести термин CELL для обозначения адресуемой единицы памяти (и одновременно группы команд в ней)? Вроде через это будет проще изложить...

Цитата:
слово MyWORD оформленное для исполнения через адрсный
адресный
Сообщение Добавлено: Сб дек 05, 2009 02:37
  Заголовок сообщения:   Ответить с цитатой
in4 писал(а):
Можно ли сделать чтение следующего адреса не через фиктивную команду, а от счетчика нибблов? Мне почему-то кажется что так будет проще, но если есть серьезные возражения, объясните, пожалуйста!


Из всех вариантов, какие я перебирал при разработке форт-процессоров с малой битностью команды этот наиболее простой. Счетчик нибблов только мешает и усложняет дешифрацию, а вместе с этим уменьшает общую скорость работы процессора.
Сообщение Добавлено: Пт дек 04, 2009 21:57
  Заголовок сообщения:   Ответить с цитатой
in4, спасибо за вычитку!

in4 писал(а):
для 16-битного варианта процессора, до 8 операндов для 32-хбитного и до 16 операндов для 64битного.


Вот тут не понял, в чем вопрос. В описании изначально 3 варианта процессора 16,32 и 64-битные.

in4 писал(а):
Переходить ведь можно только на границы CELL (группы из нескольких команд в соответствии с разрядностью процессора, для E16 - размер CELL 16 бит)?

да. Промежуточные адреса для процессора формально и не существуют.

in4 писал(а):
Так в одной CELL может ли быть 4 CALL подряд? Куда тогда будет RET?

4 CALL в одной CELL не имеют смысла, так как достаточно одного для вызова адресного интерпретатора.
Если же надо исполнить несколько подпрограмм (заканчивающихся на RET) подряд, тогда каждый CALL займет дополнительный CELL


in4 писал(а):
На картинке также есть NEXT-RET, что это?


адрес перехода на код с двумя командами: RDROP и NEXT - на рисунке это видно.

in4 писал(а):
И, после некоторых раздумий, рисунок показался обычным адресным интерпретатором прямого ШК, как из Ноздрунова...


фактически так и есть. Прямой шитый код с реализацией адресного интерпретатора не в программе, а в железе.

in4 писал(а):
Только тогда текст вокруг не совсем понятен..

Надо бы понять, что именно непонятно...



in4 писал(а):
Использование NEXT предполагает знание в подпрограмме того, что за ее вызовом обязательно следует адрес следующей подпрограммы, а это серьезное ограничение использования подпрограмм!
Ведь при обычном программировании за адресом продпрограммы может быть код, готовящий параметры для вызова следующей подпрограммы!


Ограничений особо и не видно. Разве что небольшое неудобство, что каждую подпрограмму надо в форт-слово оформлять, чтобы использовать ее вызов через адресный интерпретатор.


in4 писал(а):
Ведь при обычном программировании за адресом продпрограммы может быть код, готовящий параметры для вызова следующей подпрограммы!


туда возврат происходит по RET. Если именно это и надо в конкретном месте, надо вызывать подпрограмму, заканчивающуюся на RET.
Если же в конкретном месте надо ее использовать в потоке адресной интерпретации, то вызывать надо не саму подпрограмму, а ее клон (с оберткой из CALL и NEXT)

п.с. Описание поправил как сумел.
Сообщение Добавлено: Пт дек 04, 2009 21:55
  Заголовок сообщения:   Ответить с цитатой
И про NOP
Можно ли сделать чтение следующего адреса не через фиктивную команду, а от счетчика нибблов? Мне почему-то кажется что так будет проще, но если есть серьезные возражения, объясните, пожалуйста!
Сообщение Добавлено: Пт дек 04, 2009 06:01
  Заголовок сообщения:   Ответить с цитатой
Извиняюсь за некоторый сумбур. Текст письма редактировался несколько раз параллельно с разглядыванием рисунка... ;)
К чему стал смотреть - появилась нужда в витруальном проце. А тут Форум напомнил про E16... ;)

Теперь вопросы.
Переходить ведь можно только на границы CELL (группы из нескольких команд в соответствии с разрядностью процессора, для E16 - размер CELL 16 бит)?

Цитата:
Объем кода уменьшается за счет отсутствия кодов команды CALL перед каждым адресом в последовательности вызовов.
Так в одной CELL может ли быть 4 CALL подряд? Куда тогда будет RET?
Пока похоже только на границу CELL? Значит, в одной CELL может быть только последняя(в смысле исполнения команд из CELL) CALL? И если она в начале, остальной код из CELL выполняется или нет? Скорее нет, но если выполняется, то когда?

На картинке также есть NEXT-RET, что это?

И, после некоторых раздумий, рисунок показался обычным адресным интерпретатором прямого ШК, как из Ноздрунова... ;) И приведенная цитата как раз про него... ;) Только тогда текст вокруг не совсем понятен... :roll: Точно переработать не надо? ;)

Да, предложенная техника использования NEXT вызывает вопросы. Использование NEXT предполагает знание в подпрограмме того, что за ее вызовом обязательно следует адрес следующей подпрограммы, а это серьезное ограничение использования подпрограмм!
Ведь при обычном программировании за адресом продпрограммы может быть код, готовящий параметры для вызова следующей подпрограммы!
Сообщение Добавлено: Пт дек 04, 2009 05:37
  Заголовок сообщения:   Ответить с цитатой
Внимательно вычитываю описание E16 ;) Эти места мне не очень понравились... :(
Цитата:
и исполняются последовательно от младшей тетрады бит к старшей
Добавить точку в конце предложения
Цитата:
для 16-битного варианта процессора, до 8 операндов для 32-хбитного и до 16 операндов для 64битного.
3 разных описания х-битного ;)
Цитата:
таким образом в младших битах регистра сдвига каждый такт оказывается какая-либо команда
м. "на каждом такте"? Но спорить сильно не буду... ;) просто чтение запнулось и захотелось как-то попроще... ;)
Цитата:
команд и, таким образом обеспечивает непрерывное поступление команд
или убрать запятую, или поставить еще, выделив "таким образом"
Цитата:
Префиксные команды состоят из двух четверок
Команды с префиксами - "префиксные" м. иметь и др. значения :( ; четверок бит
Цитата:
Исполнение префиксных команд
команд с префиксами - "префиксные" м. иметь и др. значения :(
Цитата:
исполняется команда следующая за префиксом
команда, следующая
Цитата:
командой CALL. вслед за которой
точку на запятую
Цитата:
Каждая программа, исполняемое адресным интерпретатором
исполняемая (заметил, а потом стал искать сначала и получилось, стал вычитывать... ;) )
Сообщение Добавлено: Пт дек 04, 2009 04:26
  Заголовок сообщения:   Ответить с цитатой
вопрос писал(а):
Я хочу уточнить - NEXT в данном случае соответтствует (для Интел) jmp или точнее "jmp исполняемое параллельно" ?

NEXT соответствует параллельному исполнению двух команд RET и тут же CALL без чтения кода команды из адреса, куда вернулись.
Этот механизм пояснен здесь: http://winglion.ru/equinox/#3
Сообщение Добавлено: Пт дек 04, 2009 01:04

Часовой пояс: UTC + 3 часа [ Летнее время ]


Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
phpBB сборка от FladeX // Русская поддержка phpBB