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 наоборот) сдается мне что пользы больше будет forther писал(а): А че DUP и SWAP под нож не пустили?
Да вы что этож одни из самых "популярных" примитивов. Нельзя так на святое... |
Автор: | 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 такая вот схемотехника |
Автор: | 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 серию уже и забыл. Это про КМОП було 561ЛА7 4х2И-НЕ Экономить электроинергию однако надо |
Автор: | 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/ |