Forth http://fforum.winglion.ru/ |
|
Поменять значения 2-х VALUE переменных http://fforum.winglion.ru/viewtopic.php?f=19&t=1202 |
Страница 4 из 5 |
Автор: | chess [ Пн мар 17, 2008 19:13 ] |
Заголовок сообщения: | |
Forthware писал(а): Да, конечно, но результат для SPF получисля более эффективным чем ваш код на ассме. А на других Фортах ваш код вообще не работает в отличии от этого.
На других фортах будет другой ассм+форт, который в случае необходимости всегда даст в общем случае лучший код, как впрочем и на SPF. Пока ни в одном форте кроме peephole-оптимизации той или иной глубины ничего другого не видел. |
Автор: | Forthware [ Пн мар 17, 2008 19:41 ] |
Заголовок сообщения: | |
chess писал(а): всегда даст в общем случае лучший код, как впрочем и на SPF. Однако вы такого кода для SPF пока не привели (код слова VSWAP). chess писал(а): Пока ни в одном форте кроме peephole-оптимизации той или иной глубины ничего другого не видел. Да неужели? Ну вот, запускаем VFX и смотрим:
Код: : VSWAP ( "v1 v2" -- ) Это вам ничего не напоминает?
>IN @ PAD 2 0 DO BL WORD COUNT CHARS TUCK 3 PICK SWAP MOVE + BL OVER C! CHAR+ LOOP SWAP >IN ! 2 0 DO S" TO " CHARS TUCK 3 PICK SWAP MOVE + BL WORD COUNT CHARS TUCK 3 PICK SWAP MOVE + LOOP PAD SWAP OVER - EVALUATE ; IMMEDIATE ok 1 value v1 2 value v2 ok : test vswap v1 v2 ; ok see test TEST ( 004ABD30 8B15E0BC4A00 ) MOV EDX, [004ABCE0] ( 004ABD36 8B0D10BD4A00 ) MOV ECX, [004ABD10] ( 004ABD3C 890DE0BC4A00 ) MOV [004ABCE0], ECX ( 004ABD42 891510BD4A00 ) MOV [004ABD10], EDX ( 004ABD48 C3 ) NEXT, ( 25 bytes, 5 instructions ) ok |
Автор: | Forthware [ Пн мар 17, 2008 19:58 ] |
Заголовок сообщения: | |
В отличии от SPF и VFX, Swift имеет очень слабый оптимизатор, поэтому результат компиляции моего варианта далек от идеала: Код: : test1 vswap v1 v2 ; ok Очевидно что мглобы быть лучше. Однако, как я говорил раньше, попытка исправить ситуацию прямым вмешательством с помощью @ и ! выглядит еще хуже. Вот ваша реализация без ассемблера:test1 ok v1 . v2 . 1 2 ok see test1 46E5DF 4 # EBP SUB 83ED04 46E5E2 EBX 0 [EBP] MOV 895D00 46E5E5 6C4A4 [EDI] EBX MOV 8B9FA4C40600 46E5EB 4 # EBP SUB 83ED04 46E5EE EBX 0 [EBP] MOV 895D00 46E5F1 6C4C4 [EDI] EBX MOV 8B9FC4C40600 46E5F7 EBX 6C4A4 [EDI] MOV 899FA4C40600 46E5FD 0 [EBP] EBX MOV 8B5D00 46E600 4 # EBP ADD 83C504 46E603 EBX 6C4C4 [EDI] MOV 899FC4C40600 46E609 0 [EBP] EBX MOV 8B5D00 46E60C 4 # EBP ADD 83C504 46E60F RET C3 ok Код: : VSWAP1 ( xt1 xt2 -- ) >BODY SWAP >BODY 2DUP @ SWAP @ ROT ! SWAP ! ; ok
: VSWAP2 ' ' STATE @ IF POSTPONE 2LITERAL POSTPONE VSWAP1 ELSE VSWAP1 THEN ; IMMEDIATE ok : test2 vswap2 v1 v2 ; ok see test2 46E6CF 8 # EBP SUB 83ED08 46E6D2 EBX 4 [EBP] MOV 895D04 46E6D5 6C49F # 0 [EBP] MOV C745009FC40600 46E6DC 6C4BF # EBX MOV BBBFC40600 46E6E1 46E62F ( VSWAP1 ) JMP E949FFFFFF ok see vswap1 46E62F 5 [EDI] [EBX] EBX LEA 8D5C1F05 46E633 0 [EBP] EAX MOV 8B4500 46E636 EBX 0 [EBP] MOV 895D00 46E639 EAX EBX MOV 8BD8 46E63B 5 [EDI] [EBX] EBX LEA 8D5C1F05 46E63F 8 # EBP SUB 83ED08 46E642 EBX 4 [EBP] MOV 895D04 46E645 8 [EBP] EAX MOV 8B4508 46E648 EAX 0 [EBP] MOV 894500 46E64B 0 [EBX] EAX MOV 8B03 46E64D 0 [EBP] EBX MOV 8B5D00 46E650 EAX 0 [EBP] MOV 894500 46E653 0 [EBX] EBX MOV 8B1B 46E655 4 [EBP] EAX MOV 8B4504 46E658 EBX 0 [EAX] MOV 8918 46E65A 0 [EBP] EBX MOV 8B5D00 46E65D 8 # EBP ADD 83C508 46E660 0 [EBP] EAX MOV 8B4500 46E663 EBX 0 [EAX] MOV 8918 46E665 4 [EBP] EBX MOV 8B5D04 46E668 8 # EBP ADD 83C508 46E66B RET C3 ok |
Автор: | Forthware [ Пн мар 17, 2008 20:42 ] |
Заголовок сообщения: | |
А где можно взять ~chess\assm\sp-assm.f ? Спасибо. |
Автор: | forther [ Пн мар 17, 2008 21:56 ] |
Заголовок сообщения: | |
in4 писал(а): forther писал(а): in4 писал(а): Нет заморочек с предыдущим левым переносом Нет никакого левого переноса. В системе команд 8-битового PIC16F877- микроконтроллера нет команды "сложить/вычесть с переносом". Для сложения и вычитания 16-битных чисел приходится применять дополнительные команды, корректирующие перенос. В случае с XOR такой необходимости нет! А как раз для таких контроллеров с памятью ~128..256..384 байтов на всё - предложенная задача особенно актуальна. Алгоритм будет работать и без переноса, если вы примените вычитание/сложение отдельно к каждому байту. Вам же не сам результат вычитания нужен. |
Автор: | chess [ Вт мар 18, 2008 10:09 ] |
Заголовок сообщения: | |
Forthware писал(а): Однако вы такого кода для SPF пока не привели (код слова VSWAP). Привожу: Код: REQUIRE IDN ~chess\assm\sp-assm.f 1 VALUE V1 2 VALUE V2 : VSWAP ' >BODY DUP ' >BODY DUP >CS C=@, SWAP >CS D=@, >CS @=D, >CS @=C, ; IMMEDIATE : TST VSWAP V1 V2 ; STARTLOG SEE TST TST V1 . V2 . ЛОГ CODE TST 5A5BA0 8B0DF55A5A00 MOV ECX , 5A5AF5 ( V2+5 ) 5A5BA6 8B15D55A5A00 MOV EDX , 5A5AD5 ( V1+5 ) 5A5BAC 8915F55A5A00 MOV 5A5AF5 ( V2+5 ) , EDX 5A5BB2 890DD55A5A00 MOV 5A5AD5 ( V1+5 ) , ECX 5A5BB8 C3 RET NEAR END-CODE 2 1 Ok Forthware писал(а): А где можно взять ~chess\assm\sp-assm.f ? Здесь: http://www.chess2007.nm.ru/~chess.zip Forthware писал(а): Это вам ничего не напоминает?
Может быть это и не peephole-оптимизация, исходников-то нет - продукт однако коммерческий сказать ничего не могу. Однако до такого оптимизатор СПФ легко доработать можно. Насчет оптимизации. Сначала нужно убедиться, что форт-система грамотно поставлена на аппаратную платформу, а потом уже смотреть как сделать оптимизатор. В СПФ похоже форт-система поставлена на IA-32 не совсем правильно. Кстати по коду от VFX похоже аналогично - так как код и данные рядом находятся. |
Автор: | Forthware [ Вт мар 18, 2008 12:02 ] |
Заголовок сообщения: | |
forther писал(а): Алгоритм будет работать и без переноса, если вы примените вычитание/сложение отдельно к каждому байту. Возможно in4 имел ввиду решение на форте, которое использует слова + и -. Реализация этих слов в 16 битном форте на 8 битном процессоре использует перенос.chess писал(а): Благодарю.chess писал(а): исходников-то нет - продукт однако коммерческий сказать ничего не могу. И не сможете, поскольку даже приобретя самый дорогой пакет содержащий исходники оптимизатора за ~$6000, вы подписываете договор о неразглашении, запрещающий вам рассказывать как оно устроено. chess писал(а): Однако до такого оптимизатор СПФ легко доработать можно. Вот видите, а вы говорите что незнаете фортов с нормальной оптимизацией. VFX уже компилирует мой вариант идеально, и вы согласны что СПФ тоже легко до такого доработать. chess писал(а): Сначала нужно убедиться, что форт-система грамотно поставлена на аппаратную платформу, а потом уже смотреть как сделать оптимизатор. Ну мы вроде не оптимизаторы обсуждаем а варианты решения задачи garbler. Попробую подытожить.
1. Ваш вариант без ассма: Код: : VSWAP1 ( xt1 xt2 -- ) >BODY SWAP >BODY 2DUP @ SWAP @ ROT ! SWAP ! ; : VSWAP2 ' ' STATE @ IF POSTPONE 2LITERAL POSTPONE VSWAP1 ELSE VSWAP1 THEN ; IMMEDIATE Преимущества: - есть VSWAP1 берущий в качестве аргументов xt переменных. Недостатки: - код зависит от реализации VALUE, поэтому не переносим; - генерирует очень неэффективный код на любых реализациях Форта; 2. Мой последний вариант: Код: : VSWAP ( "v1 v2" -- ) >IN @ PAD 2 0 DO BL WORD COUNT CHARS TUCK 3 PICK SWAP MOVE + BL OVER C! CHAR+ LOOP SWAP >IN ! 2 0 DO S" TO " CHARS TUCK 3 PICK SWAP MOVE + BL WORD COUNT CHARS TUCK 3 PICK SWAP MOVE + LOOP PAD SWAP OVER - EVALUATE ; IMMEDIATE Преимущества: - независит от реализации VALUE на конкретом Форте, может быть использован практически везде, без изменений; - генерирует максимально эффективный код, на который способен компилятор, без вмешательства ассемблера. - соответствует стандарту ANSI94 Недостатки: - использует PAD. 3. Ваш ассемблерный вариант: Код: : VSWAP
' >BODY DUP ' >BODY DUP >CS C=@, SWAP >CS D=@, >CS @=D, >CS @=C, ; IMMEDIATE Преимущества: - генерирует максимально эффективный код (эффективнее за мой вариант); Недостатки: - применим только на SPF; - использует не только Форт (это недостаток, поскольку в задаче было сказано: "усложнение задачи: решение должно быть совместимым со стандартом (одним из)."). Вот, гдето так. |
Автор: | whiteTigr [ Вт мар 18, 2008 12:41 ] |
Заголовок сообщения: | |
Вот лично мне больше нравится первый вариант. Он выглядит короче и читабельнее. Совместимость со стандартом - переносить нужно не код, а алгоритмы. Если нужна максимальная скорость, то писать нужно в ассемблере (добавить новое слово в СвойФорт). Ваш вариант получился нечитаемым, и если его нужно будет перенести в форт несовместимый со стандартом, то придется попотеть. К тому же Вы сами говорили, что совместимости со стандартом в разных фортах сейчас никакой... |
Автор: | Forthware [ Вт мар 18, 2008 13:44 ] |
Заголовок сообщения: | |
whiteTigr писал(а): Вот лично мне больше нравится первый вариант. Он выглядит короче и читабельнее. Это понятно, поэтому мой первый вариант решения был аналогичным (http://fforum.winglion.ru/viewtopic.php?p=13293#13293). Но он не соответствует последнему условию задачи (опциональному). К тому же, подобное решение, в виду своей тривиальности, не может представлять какого либо интереса, тем более для программиста имеющего СвойФорт, IMHO. whiteTigr писал(а): Ваш вариант получился нечитаемым, Да, это правда. Мне следовало изложить идею отдельно, так было бы понятнее. whiteTigr писал(а): К тому же Вы сами говорили, что совместимости со стандартом в разных фортах сейчас никакой... Требование соответствия стандарту было обусловлено в задаче.
|
Автор: | Forthware [ Вт мар 18, 2008 14:15 ] |
Заголовок сообщения: | |
Вот более простая реализация, с пояснениями. Надеюсь так будет кому то понятней. Код: : VSWAP ( "v1 v2" -- ) >IN @ >R 2 0 DO BL WORD COUNT EVALUATE LOOP S" TO " PAD SWAP CMOVE R> >IN ! 2 0 DO BL WORD COUNT TUCK PAD 3 CHARS + SWAP CMOVE 3 + PAD SWAP EVALUATE LOOP ; IMMEDIATE Код: : VSWAP ( "v1 v2" -- )
\ сохраняем положение входного потока >IN @ >R \ выполняем 2 следующих слова 2 0 DO BL WORD COUNT EVALUATE LOOP \ записываем "ТО " в PAD S" TO " PAD SWAP CMOVE \ восстанавливаем положение входного потока (чтобы еще раз выбрать два следующих слова) R> >IN ! \ копируем следующее слово в PAD, после "TO " и выполняем содержимое PAD (для 2-х следующих слов) 2 0 DO BL WORD COUNT TUCK PAD 3 CHARS + SWAP CMOVE 3 + PAD SWAP EVALUATE LOOP ; IMMEDIATE \ слово немедленного исполнения \ Если введена строка: "VSWAP V1 V2" то с помощью EVALUATE будет исполнено "V1 V2 TO V1 TO V2". \ Если система находится в состоянии компиляции, то эта последовательность будет скомпилирована. |
Автор: | WingLion [ Вт мар 18, 2008 19:45 ] |
Заголовок сообщения: | |
О-ох! Вот уж точно, иллюстрация на тему, как надо удалять гланды через задний проход! |
Автор: | white_TigR [ Вт мар 18, 2008 20:20 ] |
Заголовок сообщения: | |
Forthware писал(а): подобное решение, в виду своей тривиальности, не может представлять какого либо интереса, тем более для программиста имеющего СвойФорт
"Гениальный программист - это тот, который с помощью тупого кода пишет гениальные вещи, а не наоборот" (с) |
Автор: | Forthware [ Вт мар 18, 2008 20:26 ] |
Заголовок сообщения: | |
WingLion писал(а): Вот уж точно, иллюстрация на тему, как надо удалять гланды через задний проход! Знаете, Антонов всегда говорил, что не красивый самолет не может хорошо летать. Тем не менее, все его проекты проходили летные испытания а не конкурсы красоты, и именно техническое превосходство делало их первыми в мире, а не внешний вид.
|
Автор: | WingLion [ Вт мар 18, 2008 21:05 ] |
Заголовок сообщения: | |
Если бы Антонов приделывал к своим самолетам гребной винт, и ставил на него колеса от К700, чтобы он по болотам мог ездить, то такой самолет не взлетел бы. Это я к тому, что накрутки вокруг этого уже свапа кажутся не просто дикими, а дико сумасшедшими. |
Автор: | Forthware [ Вт мар 18, 2008 22:13 ] |
Заголовок сообщения: | |
WingLion писал(а): Это я к тому, что накрутки вокруг этого уже свапа кажутся не просто дикими, а дико сумасшедшими. Такая поставлена задача. А на практике, по моему, проще просто писать V1 V2 TO V1 TO V2 где надо, и ничего не выдумывать.
|
Страница 4 из 5 | Часовой пояс: UTC + 3 часа [ Летнее время ] |
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group http://www.phpbb.com/ |