Forth
http://fforum.winglion.ru/

И снова - 16 Minimal instructions.
http://fforum.winglion.ru/viewtopic.php?f=3&t=2564
Страница 1 из 3

Автор:  WingLion [ Ср апр 07, 2010 23:41 ]
Заголовок сообщения:  И снова - 16 Minimal instructions.

0 NOP выборка следующей команды (нет операции)
1 ?BRANCH (IFNZ) переход, если на стеке не ноль
2 LIT загрузка непосредственного литерала на стек ( --> data )
3 @ извлечь данное по адресу из стека ( addr --> data=mem[addr])
4 ! сохранить даное в памяти по адресу ( data, addr --> )
5 CALL вызов попрограммы ( вызов адресного интерпретатора)
6 RET возврат из подпрограммы
7 DUP дублирование данного с вершины стека
8 DROP удаление данного с вершины стека
9 SWAP перестановка двух элементов на вершине стека
10 OVER копирование второго элемента стека
11 AR> переместить данное со стека данных на стек возвратов
12 A>R переместить данное со стека возвратов на стек данных
13 NAND поразрядное логическое "И-НЕ" двух верхних элементов стека ( d1 d1 --> d1 nand d2)
: NOT DUP NAND ; поразрядное логическое инвертирование верхнего элемента стека
: OR NOT SWAP NOT NAND ; поразрядное логическое "ИЛИ" двух верхних элементов стека ( d1 d1 --> d1 or d2 )
: AND NAND DUP NAND ; поразрядное логическое "И"
: XOR OVER OVER NAND DUP >R NAND SWAP R> NAND NAND ; поразрядное "Исключающее ИЛИ" ( d1 d1 --> d1 xor d2)
14 ADD сложить два верхних элемента стека (d1 d2 --> d1+d2)
: SUB SWAP NOT ADD NOT ; вычесть верхнее из нижнего (d1 d2 --> d2-d1)
15 2/ разделить верхний элемент стека на 2
: 2* DUP ADD ;
__________
итого 16 команд без префиксов (зеленым обозначено доопределение нужных команд)

9.04.2010 - добавлено зеленое определение SUB

Автор:  forther [ Чт апр 08, 2010 01:43 ]
Заголовок сообщения: 

А че DUP и SWAP под нож не пустили? чтоб 16?
И, кстати, почему AR>/A>R, а не PUSH/POP?

Автор:  _Harry [ Чт апр 08, 2010 03:00 ]
Заголовок сообщения: 

А вот если вместо NOT , N?BRANCH (т.е. ?BRANCH наоборот)
сдается мне что пользы больше будет :shuffle;

forther писал(а):
А че DUP и SWAP под нож не пустили?

Да вы что :shock: этож одни из самых "популярных" примитивов.
Нельзя так на святое... :lol:

Автор:  WingLion [ Чт апр 08, 2010 05:18 ]
Заголовок сообщения: 

forther писал(а):
А че DUP и SWAP под нож не пустили? чтоб 16?


"под нож" пустили NOT, OR и XOR определения которых через NAND специально выдлены в списке, чтобы вопросов не было на их счет.

forther писал(а):
И, кстати, почему AR>/A>R, а не PUSH/POP?


Когда в процессоре два стека, чистые PUSH/POP, без указания куда и откуда эти PUSH/POP, становятся бессмысленными.

a A>R и AR> вместо >R и R> - потому что об этом раньше была договоренность.

_Harry писал(а):
А вот если вместо NOT , N?BRANCH (т.е. ?BRANCH наоборот)
сдается мне что пользы больше будет shuffle


: N?BRANCH DUP NAND ?BRANCH ;
и аналогично, если наоборот:
: ?BRANCH DUP NAND N?BRANCH ;

А NOT в списке примитивов и нет. Зеленым выделено определение нужных примитивов через те что есть.

Второй BRANCH в ужатой системе команд - это роскошь.
В реальной железке должен быть хотя бы один из них, и этого достаточно

Автор:  _Harry [ Чт апр 08, 2010 16:45 ]
Заголовок сообщения: 

WingLion писал(а):
: ?BRANCH DUP NAND N?BRANCH ;

Понятно все что нужно можно сделать на ЛА7 такая вот схемотехника :D

Автор:  Hishnik [ Чт апр 08, 2010 16:49 ]
Заголовок сообщения: 

Очень громоздко вычитание получается. Сначала знак сменить с помощью NAND, а только потом сложить.

Автор:  WingLion [ Чт апр 08, 2010 18:41 ]
Заголовок сообщения: 

nand-а одного для смены знака маловато. Надо еще и инкремент, а это потянет за собой LIT или кучу извратов с NAND...
так что, еще вопрос, стоит ли выделка овчинки?..
_Harry писал(а):
все что нужно можно сделать на ЛА7

на ЛА3 однако :)

Автор:  Hishnik [ Чт апр 08, 2010 18:44 ]
Заголовок сообщения: 

WingLion писал(а):
nand-а одного для смены знака маловато. Надо еще и инкремент, а это потянет за собой LIT или кучу извратов с NAND...
так что, еще вопрос, стоит ли выделка овчинки?..

Так я о чем и говорю. Инверсия, потом +1. А как тогда вообще вычитать?

Автор:  WingLion [ Чт апр 08, 2010 18:57 ]
Заголовок сообщения: 

: SUB SWAP NOT ADD NOT ;
или после подстановки через NAND

: SUB SWAP DUP NAND ADD DUP NAND ;

Автор:  forther [ Чт апр 08, 2010 20:18 ]
Заголовок сообщения: 

WingLion писал(а):
: SUB SWAP NOT ADD NOT ;
или после подстановки через NAND

: SUB SWAP DUP NAND ADD DUP NAND ;


Вот что получается, когда не тупо, а пополоскать (подумать).

Автор:  _Harry [ Чт апр 08, 2010 21:05 ]
Заголовок сообщения: 

WingLion писал(а):
_Harry писал(а):
все что нужно можно сделать на ЛА7

на ЛА3 однако

Ну я про 155 серию уже и забыл.
Это про КМОП було :D 561ЛА7 4х2И-НЕ
Экономить электроинергию однако надо :P

Автор:  Hishnik [ Пт апр 09, 2010 00:58 ]
Заголовок сообщения: 

А если сделать команду RETZ (возврат, если на стеке ноль, иначе удаление числа со стека возвратов), то можно будет убрать
?BRANCH, который определится через LIT >R RETZ. При этом JMP будет >R 0 RETZ. Но это из разряда "очумелые мозжечок и гипоталамус", потому что надо же еще придумать, а что бы такого более полезного впихнуть в освободившийся опкод.

Автор:  WingLion [ Пт апр 09, 2010 05:53 ]
Заголовок сообщения: 

Думаю, наиболее полезным тут будет *, чтобы не изворачиваться для ее реализации программно.
Даже не просто *, a М*, тогда
: * M* DROP ;
: 2/ 0x8000 M* SWAP DROP ;
\ для 32-битного варианта - 0x8000 -> 0x80000000
и освобождается еще один опкод.. ха! ;)
прямое деление в список инструкций добавить, что ли? :))

При жесткой необходимости можно еще освободить и:
: OVER SWAP >R DUP R> SWAP ;

Автор:  Hishnik [ Пт апр 09, 2010 08:52 ]
Заголовок сообщения: 

Есть еще такой резерв, как memory-mapped устройства. Можно что-то сажать в адресное пространство памяти, писать в определенные ячейки операнды, и забирать откуда-нибудь данные. Это для редко используемых, но не выражающихся через базовый набор команд.

Автор:  Hishnik [ Пт апр 09, 2010 14:25 ]
Заголовок сообщения: 

whiteTigr добавил профайлер для форт-процессора. Проверим в нем несколько программ, мы выяснили, что обычные команды (т.е. не переходы и не литералы) составляют 25-30% от общего количества команд, компилируемых в программу. Т.е., сокращая длину команды, мы сокращаем размер вот этих 25% опкодов, оставляя при этом неизменными остальные 75%. При этом число тактов растет, потому что загнать 32-битный литерал по 16-разрядной шине можно за 2 такта, а по 4-битной придется за 8. Так что пока видится в основном доведение компактности до упора, а вот производительность серьезно пострадает.

Страница 1 из 3 Часовой пояс: UTC + 3 часа [ Летнее время ]
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
http://www.phpbb.com/