Автор |
Сообщение |
|
|
Заголовок сообщения: |
Re: Еще один способ работы с параметрами на стеке |
|
|
Чтобы в полной мере использовать стек данных и как стек и как место для локальных переменных пришлось сделать стек данных очень большим. При этом указатель стека должен стать 32 разрядно-адресуемым. Только для иллюстрации: Код: CODE DUP 552320 8D6DFC LEA EBP , FC [EBP] 552323 894500 MOV 0 [EBP] , EAX 552326 C3 RET NEAR END-CODE ( 7 bytes, 3 instructions )
CODE LDup 60ADCB 8DADFCFFFFFF LEA EBP , FFFFFFFC ( LDup+FF9F5231 ) [EBP] 60ADD1 89042D00000000 MOV 0 [EBP] , EAX 60ADD8 C3 RET NEAR END-CODE ( 14 bytes, 3 instructions )
Чтобы в полной мере использовать стек данных и как стек и как место для локальных переменных пришлось сделать стек данных очень большим. При этом указатель стека должен стать 32 разрядно-адресуемым. Только для иллюстрации: [code]CODE DUP 552320 8D6DFC LEA EBP , FC [EBP] 552323 894500 MOV 0 [EBP] , EAX 552326 C3 RET NEAR END-CODE ( 7 bytes, 3 instructions )
CODE LDup 60ADCB 8DADFCFFFFFF LEA EBP , FFFFFFFC ( LDup+FF9F5231 ) [EBP] 60ADD1 89042D00000000 MOV 0 [EBP] , EAX 60ADD8 C3 RET NEAR END-CODE ( 14 bytes, 3 instructions ) [/code]
|
|
|
|
Добавлено: Вт июл 25, 2023 16:02 |
|
|
|
|
|
Заголовок сообщения: |
Re: Еще один способ работы с параметрами на стеке |
|
|
Fasm был интересен 15 лет назад. Сейчас даже и не совсем понятно, что на таком трансляторе можно будет вразумительное сделать.
Fasm был интересен 15 лет назад. Сейчас даже и не совсем понятно, что на таком трансляторе можно будет вразумительное сделать.
|
|
|
|
Добавлено: Сб янв 07, 2023 18:32 |
|
|
|
|
|
Заголовок сообщения: |
Re: Еще один способ работы с параметрами на стеке |
|
|
Hishnik писал(а): А spf еще жив? Архитектурно он не пережил даже перехода DOS -> Windows. Все вот эти "стандарт де-факто" и "надо либы какие-нибудь продвигать" - уже трепыхания рыбы, которая неплохо плавала, но попыталась вылезти на сушу и плавать там, помахивая плавниками "де-факто". ЕМНИП, Win64FasmForth это тот же СПФ только он пилится под 64 бита Максимовым
[quote="Hishnik"]А spf еще жив? Архитектурно он не пережил даже перехода DOS -> Windows. Все вот эти "стандарт де-факто" и "надо либы какие-нибудь продвигать" - уже трепыхания рыбы, которая неплохо плавала, но попыталась вылезти на сушу и плавать там, помахивая плавниками "де-факто".[/quote] ЕМНИП, Win64FasmForth это тот же СПФ только он пилится под 64 бита Максимовым
|
|
|
|
Добавлено: Сб янв 07, 2023 17:20 |
|
|
|
|
|
Заголовок сообщения: |
Re: Еще один способ работы с параметрами на стеке |
|
|
А spf еще жив? Архитектурно он не пережил даже перехода DOS -> Windows. Все вот эти "стандарт де-факто" и "надо либы какие-нибудь продвигать" - уже трепыхания рыбы, которая неплохо плавала, но попыталась вылезти на сушу и плавать там, помахивая плавниками "де-факто".
А spf еще жив? Архитектурно он не пережил даже перехода DOS -> Windows. Все вот эти "стандарт де-факто" и "надо либы какие-нибудь продвигать" - уже трепыхания рыбы, которая неплохо плавала, но попыталась вылезти на сушу и плавать там, помахивая плавниками "де-факто".
|
|
|
|
Добавлено: Сб янв 07, 2023 16:25 |
|
|
|
|
|
Заголовок сообщения: |
Re: Еще один способ работы с параметрами на стеке |
|
|
F-MAP писал(а): Victor__v писал(а): Цитата: ELSE S" nfd" SFIND IF EXECUTE ELSE 2DROP ?SLITERAL THEN Переопределяемое слово (VECT)? Функция по перебору массива с обработчиками? Не, давайте тянуть потенциально бажное решение из SPF Что так хаять spf, предложи свое решение, чем махать лаптями.. О, аргументация "сперва добейся") Очаровательно. То что я машу лаптями, как-то меняет тот факт, что реализация расширения NOTFOUND в СПФ потенциально багоопасная и тормознутая при этом? И свое предложение у меня есть. В своем форте реализовано и работает. viewtopic.php?f=58&t=3273
[quote="F-MAP"][quote="Victor__v"][quote]ELSE S" nfd" SFIND IF EXECUTE ELSE 2DROP ?SLITERAL THEN[/quote] :hey; :hey; :hey; Переопределяемое слово (VECT)? Функция по перебору массива с обработчиками? Не, давайте тянуть потенциально бажное решение из SPF :)[/quote] Что так хаять spf, предложи свое решение, чем махать лаптями..[/quote]
О, аргументация "сперва добейся") Очаровательно. То что я машу лаптями, как-то меняет тот факт, что реализация расширения NOTFOUND в СПФ потенциально багоопасная и тормознутая при этом?
И свое предложение у меня есть. В своем форте реализовано и работает. http://fforum.winglion.ru/viewtopic.php?f=58&t=3273
|
|
|
|
Добавлено: Сб янв 07, 2023 11:46 |
|
|
|
|
|
Заголовок сообщения: |
Re: Еще один способ работы с параметрами на стеке |
|
|
Victor__v писал(а): Цитата: ELSE S" nfd" SFIND IF EXECUTE ELSE 2DROP ?SLITERAL THEN Переопределяемое слово (VECT)? Функция по перебору массива с обработчиками? Не, давайте тянуть потенциально бажное решение из SPF Что так хаять spf, предложи свое решение, чем махать лаптями..
[quote="Victor__v"][quote]ELSE S" nfd" SFIND IF EXECUTE ELSE 2DROP ?SLITERAL THEN[/quote] :hey; :hey; :hey; Переопределяемое слово (VECT)? Функция по перебору массива с обработчиками? Не, давайте тянуть потенциально бажное решение из SPF :)[/quote] Что так хаять spf, предложи свое решение, чем махать лаптями..
|
|
|
|
Добавлено: Пт янв 06, 2023 20:17 |
|
|
|
|
|
Заголовок сообщения: |
Re: Еще один способ работы с параметрами на стеке |
|
|
Цитата: ELSE S" nfd" SFIND IF EXECUTE ELSE 2DROP ?SLITERAL THEN Переопределяемое слово (VECT)? Функция по перебору массива с обработчиками? Не, давайте тянуть потенциально бажное решение из SPF
[quote]ELSE S" nfd" SFIND IF EXECUTE ELSE 2DROP ?SLITERAL THEN[/quote] :hey; :hey; :hey; Переопределяемое слово (VECT)? Функция по перебору массива с обработчиками? Не, давайте тянуть потенциально бажное решение из SPF :)
|
|
|
|
Добавлено: Чт янв 05, 2023 17:58 |
|
|
|
|
|
Заголовок сообщения: |
Re: Еще один способ работы с параметрами на стеке |
|
|
Ну и как, с 2008 года оно получило широкое распространение? Цитата: The canonical Forth virtual machine is weak in several areas. 1) It does not execute C well, which is important for commercial exploitation of silicon stack machines. 2) It is weak for DSP operations, which restricts performance in embedded applications without changes to the VM or much increased compiler complexity, 3) Without index operations, it is cumbersome to deal with complex data structures whose base address is passed as an argument to a word. 1) А что вообще можно сказать про Си в отрыве от промежуточного представления, в которое компилируется исходный текст? Стековая машина - вполне рабочее промежуточное представление, естественно, с присущими недостатками. 2) DSP вообще не для процессоров, это для аппаратных ускорителей. По крайней мере, для специализированных расширений. Оптимизировать такты на DSP - изначально провальное занятие, там должен быть один такт на отвод фильтра, со всеми сопутствующими операциями, производимыми параллельно. 3) А потом будет передаваться три аргумента. А потом четыре. Почему тогда так мало регистров? Давайте уже блок на 32 РОН и 8 индексных, м?
Ну и как, с 2008 года оно получило широкое распространение? [quote] The canonical Forth virtual machine is weak in several areas. 1) It does not execute C well, which is important for commercial exploitation of silicon stack machines. 2) It is weak for DSP operations, which restricts performance in embedded applications without changes to the VM or much increased compiler complexity, 3) Without index operations, it is cumbersome to deal with complex data structures whose base address is passed as an argument to a word.[/quote]
1) А что вообще можно сказать про Си в отрыве от промежуточного представления, в которое компилируется исходный текст? Стековая машина - вполне рабочее промежуточное представление, естественно, с присущими недостатками. 2) DSP вообще не для процессоров, это для аппаратных ускорителей. По крайней мере, для специализированных расширений. Оптимизировать такты на DSP - изначально провальное занятие, там должен быть один такт на отвод фильтра, со всеми сопутствующими операциями, производимыми параллельно. 3) А потом будет передаваться три аргумента. А потом четыре. Почему тогда так мало регистров? Давайте уже блок на 32 РОН и 8 индексных, м?
|
|
|
|
Добавлено: Пн янв 02, 2023 22:40 |
|
|
|
|
|
Заголовок сообщения: |
Re: Еще один способ работы с параметрами на стеке |
|
|
предлагалось расширить виртуальную машину форт регистрами A,B,X и Y https://www.complang.tuwien.ac.at/anton/euroforth/ef08/papers/pelc.pdfинтересно проверить Вашу гипотезу иной реализацией , например с другим процессором (ARM) или где идет компиляция в WebAssembly или другой язык.
предлагалось расширить виртуальную машину форт регистрами A,B,X и Y [url]https://www.complang.tuwien.ac.at/anton/euroforth/ef08/papers/pelc.pdf[/url] интересно проверить Вашу гипотезу иной реализацией , например с другим процессором (ARM) или где идет компиляция в WebAssembly или другой язык.
|
|
|
|
Добавлено: Пн янв 02, 2023 22:21 |
|
|
|
|
|
Заголовок сообщения: |
Re: Еще один способ работы с параметрами на стеке |
|
|
chess писал(а): Число инструкций на треть где-то уменьшилось. Реализация такой оптимизазации тривиальна. ps. Эксперименты с фортом на манипуляторах подводят к полному пересмотру концепции стекового языка как в части экономии времени при создании надежных программ, так и в части повышения эффективности кода программ. Может имеет смысл оформить полученные результаты в виде статьи и разместить её, к примеру, на площадке типа Хабр?
[quote="chess"]Число инструкций на треть где-то уменьшилось. Реализация такой оптимизазации тривиальна. ps. Эксперименты с фортом на манипуляторах подводят к полному пересмотру концепции стекового языка как в части экономии времени при создании надежных программ, так и в части повышения эффективности кода программ.[/quote] Может имеет смысл оформить полученные результаты в виде статьи и разместить её, к примеру, на площадке типа Хабр? :shuffle;
|
|
|
|
Добавлено: Сб дек 31, 2022 16:46 |
|
|
|
|
|
Заголовок сообщения: |
Re: Еще один способ работы с параметрами на стеке |
|
|
В виртуальной машине форта на манипуляторах трактовка стека параметров расширена, а именно, стек рассматривается как массив и как стек одновременно. Поэтому число команд виртуальной машины также расширено операциями между ячейками стека. В этом случае возможна 'ручная' оптимизация кода без выхода на ассемблер. Код: \ обычный вариант определения площади треугольника m: s3 | a b c | a b + c + 2x / | p | p p a - * p b - * p c - * sqrt ;m SEE s3 3 4 5 s3 .s
\ оптимизированный вариант с использованием операций между ячейками m: s3c | a b c | c | p | p b c+ p a c+ p 2x c/ a p c- b p c- c p c- p a c* p b c* p c c* NEGATE sqrt ;m
SEE s3c 3 4 5 s3c .s
\ обычный вариант суммы квадратов трех чисел m: ssq3 | a b c | a a * b b * + c c * + ;m SEE ssq3 1 2 3 ssq3 .
\ оптимизированный вариант с использованием операций между ячейками m: ssq3c | a b c | a a c* b b c* c c c* c b c+ c a c+ ;m SEE ssq3c 1 2 3 ssq3c .
лог Код: CODE s3 6293DF 8945FC MOV FC [EBP] , EAX 6293E2 8B4504 MOV EAX , 4 [EBP] 6293E5 034500 ADD EAX , 0 [EBP] 6293E8 0345FC ADD EAX , FC [EBP] 6293EB 8945F8 MOV F8 [EBP] , EAX 6293EE B802000000 MOV EAX , # 2 6293F3 8BC8 MOV ECX , EAX 6293F5 8B45F8 MOV EAX , F8 [EBP] 6293F8 99 CDQ 6293F9 F7F9 IDIV ECX 6293FB 8945F8 MOV F8 [EBP] , EAX 6293FE 8945F4 MOV F4 [EBP] , EAX 629401 8B45F8 MOV EAX , F8 [EBP] 629404 2B4504 SUB EAX , 4 [EBP] 629407 F76DF4 IMUL F4 [EBP] 62940A 8945F4 MOV F4 [EBP] , EAX 62940D 8B45F8 MOV EAX , F8 [EBP] 629410 2B4500 SUB EAX , 0 [EBP] 629413 F76DF4 IMUL F4 [EBP] 629416 8945F4 MOV F4 [EBP] , EAX 629419 8B45F8 MOV EAX , F8 [EBP] 62941C 2B45FC SUB EAX , FC [EBP] 62941F F76DF4 IMUL F4 [EBP] 629422 8D6DF8 LEA EBP , F8 [EBP] 629425 E89DDBFEFF CALL 616FC7 ( sqrt ) 62942A 8D6D10 LEA EBP , 10 [EBP] 62942D C3 RET NEAR END-CODE ( 79 bytes, 27 instructions )
6
CODE s3c 62943F 8945FC MOV FC [EBP] , EAX 629442 034500 ADD EAX , 0 [EBP] 629445 034504 ADD EAX , 4 [EBP] 629448 C7C102000000 MOV ECX , # 2 62944E 99 CDQ 62944F F7F9 IDIV ECX 629451 294504 SUB 4 [EBP] , EAX 629454 294500 SUB 0 [EBP] , EAX 629457 2945FC SUB FC [EBP] , EAX 62945A 0FAF4504 IMUL EAX , 4 [EBP] 62945E 0FAF4500 IMUL EAX , 0 [EBP] 629462 0FAF45FC IMUL EAX , FC [EBP] 629466 F7D8 NEG EAX 629468 8D6DFC LEA EBP , FC [EBP] 62946B E857DBFEFF CALL 616FC7 ( sqrt ) 629470 8D6D0C LEA EBP , C [EBP] 629473 C3 RET NEAR END-CODE ( 53 bytes, 17 instructions )
6
лог CODE ssq3 629487 8945FC MOV FC [EBP] , EAX 62948A 8B5D04 MOV EBX , 4 [EBP] 62948D 0FAF5D04 IMUL EBX , 4 [EBP] 629491 8BC3 MOV EAX , EBX 629493 8945F8 MOV F8 [EBP] , EAX 629496 8B5D00 MOV EBX , 0 [EBP] 629499 0FAF5D00 IMUL EBX , 0 [EBP] 62949D 8BC3 MOV EAX , EBX 62949F 0345F8 ADD EAX , F8 [EBP] 6294A2 8945F8 MOV F8 [EBP] , EAX 6294A5 8B5DFC MOV EBX , FC [EBP] 6294A8 0FAF5DFC IMUL EBX , FC [EBP] 6294AC 8BC3 MOV EAX , EBX 6294AE 0345F8 ADD EAX , F8 [EBP] 6294B1 8D6D08 LEA EBP , 8 [EBP] 6294B4 C3 RET NEAR END-CODE ( 46 bytes, 16 instructions ) 14
CODE ssq3c 6294C7 8B5D04 MOV EBX , 4 [EBP] 6294CA 0FAF5D04 IMUL EBX , 4 [EBP] 6294CE 895D04 MOV 4 [EBP] , EBX 6294D1 8B5D00 MOV EBX , 0 [EBP] 6294D4 0FAF5D00 IMUL EBX , 0 [EBP] 6294D8 895D00 MOV 0 [EBP] , EBX 6294DB F7E8 IMUL EAX 6294DD 034500 ADD EAX , 0 [EBP] 6294E0 034504 ADD EAX , 4 [EBP] 6294E3 8D6D08 LEA EBP , 8 [EBP] 6294E6 C3 RET NEAR END-CODE ( 32 bytes, 11 instructions ) 14 Число инструкций на треть где-то уменьшилось. Реализация такой оптимизазации тривиальна. ps. Эксперименты с фортом на манипуляторах подводят к полному пересмотру концепции стекового языка как в части экономии времени при создании надежных программ, так и в части повышения эффективности кода программ.
В виртуальной машине форта на манипуляторах трактовка стека параметров расширена, а именно, стек рассматривается как массив и как стек одновременно. Поэтому число команд виртуальной машины также расширено операциями между ячейками стека. В этом случае возможна 'ручная' оптимизация кода без выхода на ассемблер.
[code]\ обычный вариант определения площади треугольника m: s3 | a b c | a b + c + 2x / | p | p p a - * p b - * p c - * sqrt ;m SEE s3 3 4 5 s3 .s
\ оптимизированный вариант с использованием операций между ячейками m: s3c | a b c | c | p | p b c+ p a c+ p 2x c/ a p c- b p c- c p c- p a c* p b c* p c c* NEGATE sqrt ;m
SEE s3c 3 4 5 s3c .s
\ обычный вариант суммы квадратов трех чисел m: ssq3 | a b c | a a * b b * + c c * + ;m SEE ssq3 1 2 3 ssq3 .
\ оптимизированный вариант с использованием операций между ячейками m: ssq3c | a b c | a a c* b b c* c c c* c b c+ c a c+ ;m SEE ssq3c 1 2 3 ssq3c . [/code] лог [code]CODE s3 6293DF 8945FC MOV FC [EBP] , EAX 6293E2 8B4504 MOV EAX , 4 [EBP] 6293E5 034500 ADD EAX , 0 [EBP] 6293E8 0345FC ADD EAX , FC [EBP] 6293EB 8945F8 MOV F8 [EBP] , EAX 6293EE B802000000 MOV EAX , # 2 6293F3 8BC8 MOV ECX , EAX 6293F5 8B45F8 MOV EAX , F8 [EBP] 6293F8 99 CDQ 6293F9 F7F9 IDIV ECX 6293FB 8945F8 MOV F8 [EBP] , EAX 6293FE 8945F4 MOV F4 [EBP] , EAX 629401 8B45F8 MOV EAX , F8 [EBP] 629404 2B4504 SUB EAX , 4 [EBP] 629407 F76DF4 IMUL F4 [EBP] 62940A 8945F4 MOV F4 [EBP] , EAX 62940D 8B45F8 MOV EAX , F8 [EBP] 629410 2B4500 SUB EAX , 0 [EBP] 629413 F76DF4 IMUL F4 [EBP] 629416 8945F4 MOV F4 [EBP] , EAX 629419 8B45F8 MOV EAX , F8 [EBP] 62941C 2B45FC SUB EAX , FC [EBP] 62941F F76DF4 IMUL F4 [EBP] 629422 8D6DF8 LEA EBP , F8 [EBP] 629425 E89DDBFEFF CALL 616FC7 ( sqrt ) 62942A 8D6D10 LEA EBP , 10 [EBP] 62942D C3 RET NEAR END-CODE ( 79 bytes, 27 instructions )
6
CODE s3c 62943F 8945FC MOV FC [EBP] , EAX 629442 034500 ADD EAX , 0 [EBP] 629445 034504 ADD EAX , 4 [EBP] 629448 C7C102000000 MOV ECX , # 2 62944E 99 CDQ 62944F F7F9 IDIV ECX 629451 294504 SUB 4 [EBP] , EAX 629454 294500 SUB 0 [EBP] , EAX 629457 2945FC SUB FC [EBP] , EAX 62945A 0FAF4504 IMUL EAX , 4 [EBP] 62945E 0FAF4500 IMUL EAX , 0 [EBP] 629462 0FAF45FC IMUL EAX , FC [EBP] 629466 F7D8 NEG EAX 629468 8D6DFC LEA EBP , FC [EBP] 62946B E857DBFEFF CALL 616FC7 ( sqrt ) 629470 8D6D0C LEA EBP , C [EBP] 629473 C3 RET NEAR END-CODE ( 53 bytes, 17 instructions )
6
лог CODE ssq3 629487 8945FC MOV FC [EBP] , EAX 62948A 8B5D04 MOV EBX , 4 [EBP] 62948D 0FAF5D04 IMUL EBX , 4 [EBP] 629491 8BC3 MOV EAX , EBX 629493 8945F8 MOV F8 [EBP] , EAX 629496 8B5D00 MOV EBX , 0 [EBP] 629499 0FAF5D00 IMUL EBX , 0 [EBP] 62949D 8BC3 MOV EAX , EBX 62949F 0345F8 ADD EAX , F8 [EBP] 6294A2 8945F8 MOV F8 [EBP] , EAX 6294A5 8B5DFC MOV EBX , FC [EBP] 6294A8 0FAF5DFC IMUL EBX , FC [EBP] 6294AC 8BC3 MOV EAX , EBX 6294AE 0345F8 ADD EAX , F8 [EBP] 6294B1 8D6D08 LEA EBP , 8 [EBP] 6294B4 C3 RET NEAR END-CODE ( 46 bytes, 16 instructions ) 14
CODE ssq3c 6294C7 8B5D04 MOV EBX , 4 [EBP] 6294CA 0FAF5D04 IMUL EBX , 4 [EBP] 6294CE 895D04 MOV 4 [EBP] , EBX 6294D1 8B5D00 MOV EBX , 0 [EBP] 6294D4 0FAF5D00 IMUL EBX , 0 [EBP] 6294D8 895D00 MOV 0 [EBP] , EBX 6294DB F7E8 IMUL EAX 6294DD 034500 ADD EAX , 0 [EBP] 6294E0 034504 ADD EAX , 4 [EBP] 6294E3 8D6D08 LEA EBP , 8 [EBP] 6294E6 C3 RET NEAR END-CODE ( 32 bytes, 11 instructions ) 14[/code] Число инструкций на треть где-то уменьшилось. Реализация такой оптимизазации тривиальна. ps. Эксперименты с фортом на манипуляторах подводят к полному пересмотру концепции стекового языка как в части экономии времени при создании надежных программ, так и в части повышения эффективности кода программ.
|
|
|
|
Добавлено: Сб дек 31, 2022 00:46 |
|
|
|
|
|
Заголовок сообщения: |
Re: Еще один способ работы с параметрами на стеке |
|
|
Сравнил манипуляторы, задаваемые в форме определений с локальными переменными с форт-определениями (при включенном оптимизаторе) в части скорости кода. Иногда форт проигрывает: Код: \ форт : MAXMIN1 >R MAX R> MIN ; SEE MAXMIN1 : MAXMIN2 -ROT MAX MIN ; SEE MAXMIN2 SEE MAX SEE MIN
\ манипуляторы m: MAXMINm | a b c | a b MAX c MIN ;m SEE MAXMINm лог Код: CODE MAXMIN1 629287 50 PUSH EAX 629288 8B4500 MOV EAX , 0 [EBP] 62928B 8D6D04 LEA EBP , 4 [EBP] 62928E E8DD90F2FF CALL 552370 ( MAX ) 629293 8945FC MOV FC [EBP] , EAX 629296 58 POP EAX 629297 8D6DFC LEA EBP , FC [EBP] 62929A E8ED90F2FF CALL 55238C ( MIN ) 62929F C3 RET NEAR END-CODE ( 25 bytes, 9 instructions )
CODE MAXMIN2 6292B7 8B5504 MOV EDX , 4 [EBP] 6292BA 894504 MOV 4 [EBP] , EAX 6292BD 8B4500 MOV EAX , 0 [EBP] 6292C0 895500 MOV 0 [EBP] , EDX 6292C3 E8A890F2FF CALL 552370 ( MAX ) 6292C8 E8BF90F2FF CALL 55238C ( MIN ) 6292CD C3 RET NEAR END-CODE ( 23 bytes, 7 instructions )
CODE MAX 552370 8B5500 MOV EDX , 0 [EBP] 552373 3BD0 CMP EDX , EAX 552375 0F4FC2 CMOVG EAX , EDX 552378 8D6D04 LEA EBP , 4 [EBP] 55237B C3 RET NEAR END-CODE ( 12 bytes, 5 instructions )
CODE MIN 55238C 8B5500 MOV EDX , 0 [EBP] 55238F 3BD0 CMP EDX , EAX 552391 0F4CC2 CMOVL EAX , EDX 552394 8D6D04 LEA EBP , 4 [EBP] 552397 C3 RET NEAR END-CODE ( 12 bytes, 5 instructions )
CODE MAXMINm 6292E3 8945FC MOV FC [EBP] , EAX 6292E6 8B4500 MOV EAX , 0 [EBP] 6292E9 8B5504 MOV EDX , 4 [EBP] 6292EC 3BD0 CMP EDX , EAX 6292EE 0F4FC2 CMOVG EAX , EDX 6292F1 8B55FC MOV EDX , FC [EBP] 6292F4 3BD0 CMP EDX , EAX 6292F6 0F4CC2 CMOVL EAX , EDX 6292F9 8D6D08 LEA EBP , 8 [EBP] 6292FC C3 RET NEAR END-CODE ( 26 bytes, 10 instructions ) В вариантах на форте 19 и 17 инструкций, а на манипуляторах 10. Как правило манипуляторы дают сравнимое с фортом+оптимизатор быстродействие семантически эквивалентных определений, но позволяют писать эти определения так же быстро как и с помощью локальных переменных.
Сравнил манипуляторы, задаваемые в форме определений с локальными переменными с форт-определениями (при включенном оптимизаторе) в части скорости кода.
Иногда форт проигрывает: [code]\ форт : MAXMIN1 >R MAX R> MIN ; SEE MAXMIN1 : MAXMIN2 -ROT MAX MIN ; SEE MAXMIN2 SEE MAX SEE MIN
\ манипуляторы m: MAXMINm | a b c | a b MAX c MIN ;m SEE MAXMINm [/code] лог [code]CODE MAXMIN1 629287 50 PUSH EAX 629288 8B4500 MOV EAX , 0 [EBP] 62928B 8D6D04 LEA EBP , 4 [EBP] 62928E E8DD90F2FF CALL 552370 ( MAX ) 629293 8945FC MOV FC [EBP] , EAX 629296 58 POP EAX 629297 8D6DFC LEA EBP , FC [EBP] 62929A E8ED90F2FF CALL 55238C ( MIN ) 62929F C3 RET NEAR END-CODE ( 25 bytes, 9 instructions )
CODE MAXMIN2 6292B7 8B5504 MOV EDX , 4 [EBP] 6292BA 894504 MOV 4 [EBP] , EAX 6292BD 8B4500 MOV EAX , 0 [EBP] 6292C0 895500 MOV 0 [EBP] , EDX 6292C3 E8A890F2FF CALL 552370 ( MAX ) 6292C8 E8BF90F2FF CALL 55238C ( MIN ) 6292CD C3 RET NEAR END-CODE ( 23 bytes, 7 instructions )
CODE MAX 552370 8B5500 MOV EDX , 0 [EBP] 552373 3BD0 CMP EDX , EAX 552375 0F4FC2 CMOVG EAX , EDX 552378 8D6D04 LEA EBP , 4 [EBP] 55237B C3 RET NEAR END-CODE ( 12 bytes, 5 instructions )
CODE MIN 55238C 8B5500 MOV EDX , 0 [EBP] 55238F 3BD0 CMP EDX , EAX 552391 0F4CC2 CMOVL EAX , EDX 552394 8D6D04 LEA EBP , 4 [EBP] 552397 C3 RET NEAR END-CODE ( 12 bytes, 5 instructions )
CODE MAXMINm 6292E3 8945FC MOV FC [EBP] , EAX 6292E6 8B4500 MOV EAX , 0 [EBP] 6292E9 8B5504 MOV EDX , 4 [EBP] 6292EC 3BD0 CMP EDX , EAX 6292EE 0F4FC2 CMOVG EAX , EDX 6292F1 8B55FC MOV EDX , FC [EBP] 6292F4 3BD0 CMP EDX , EAX 6292F6 0F4CC2 CMOVL EAX , EDX 6292F9 8D6D08 LEA EBP , 8 [EBP] 6292FC C3 RET NEAR END-CODE ( 26 bytes, 10 instructions )[/code]
В вариантах на форте 19 и 17 инструкций, а на манипуляторах 10. Как правило манипуляторы дают сравнимое с фортом+оптимизатор быстродействие семантически эквивалентных определений, но позволяют писать эти определения так же быстро как и с помощью локальных переменных.
|
|
|
|
Добавлено: Ср дек 28, 2022 21:31 |
|
|
|
|
|
Заголовок сообщения: |
Re: Еще один способ работы с параметрами на стеке |
|
|
Для формирования предельно оптимального по скорости форт-кода сделал 'стековый' ассемблер( плюс три строчки в текст транспилятора ) Код: m{ \ Сумма квадратов трех чисел : SumSq | n1 n2 n3 | A{ ebx n1 mov ecx n2 mov eax eax imul ebx ebx imul ecx ecx imul eax ebx add eax ecx add }A T> n1 ; }m SEE SumSq 1 2 3 SumSq .s лог Код: CODE SumSq 628AC7 8B5D04 MOV EBX , 4 [EBP] 628ACA 8B4D00 MOV ECX , 0 [EBP] 628ACD F7E8 IMUL EAX 628ACF 0FAFDB IMUL EBX , EBX 628AD2 0FAFC9 IMUL ECX , ECX 628AD5 03C3 ADD EAX , EBX 628AD7 03C1 ADD EAX , ECX 628AD9 8D6D08 LEA EBP , 8 [EBP] 628ADC C3 RET NEAR END-CODE ( 22 bytes, 9 instructions )
14 T.е. можно делать ассемблерные вставки, но конечно проще такие вставки делать прямо в манипуляторной форме: /[3{b1:c2:aa*bb*cc*ab+ac+}'1. Короче и обзорность лучше.
Для формирования предельно оптимального по скорости форт-кода сделал 'стековый' ассемблер( плюс три строчки в текст транспилятора ) [code]m{ \ Сумма квадратов трех чисел : SumSq | n1 n2 n3 | A{ ebx n1 mov ecx n2 mov eax eax imul ebx ebx imul ecx ecx imul eax ebx add eax ecx add }A T> n1 ; }m SEE SumSq 1 2 3 SumSq .s[/code] лог [code]CODE SumSq 628AC7 8B5D04 MOV EBX , 4 [EBP] 628ACA 8B4D00 MOV ECX , 0 [EBP] 628ACD F7E8 IMUL EAX 628ACF 0FAFDB IMUL EBX , EBX 628AD2 0FAFC9 IMUL ECX , ECX 628AD5 03C3 ADD EAX , EBX 628AD7 03C1 ADD EAX , ECX 628AD9 8D6D08 LEA EBP , 8 [EBP] 628ADC C3 RET NEAR END-CODE ( 22 bytes, 9 instructions )
14[/code] T.е. можно делать ассемблерные вставки, но конечно проще такие вставки делать прямо в манипуляторной форме: /[3{b1:c2:aa*bb*cc*ab+ac+}'1. Короче и обзорность лучше.
|
|
|
|
Добавлено: Вс дек 18, 2022 23:24 |
|
|
|
|
|
Заголовок сообщения: |
Re: Еще один способ работы с параметрами на стеке |
|
|
Изменяю синтаксис манипуляторов с целью упрощения их использования для ускорения создания программ и оптимизации их кода. Код: \ сумма попарных произведений для четырех чисел : dcr4 { a b c d } \ spf b c + d + a * c d + b * + c d * + ; SEE dcr4 SEE DRMOVE
m{ : dc4 | a b c d | \ spf + манипуляторы b c + d + a * c d + b * + c d * + T> a ; }m SEE dc4
лог. Код: CODE dcr4 627B53 8945FC MOV FC [EBP] , EAX 627B56 B810000000 MOV EAX , # 10 627B5B 8D6DFC LEA EBP , FC [EBP] 627B5E E881B5F2FF CALL 5530E4 ( DRMOVE ) 627B63 6810000000 PUSH , # 10 627B68 6868325500 PUSH , # 553268 627B6D 8945FC MOV FC [EBP] , EAX 627B70 8B442410 MOV EAX , 10 [ESP] 627B74 0344240C ADD EAX , C [ESP] 627B78 03442408 ADD EAX , 8 [ESP] 627B7C 8945F8 MOV F8 [EBP] , EAX 627B7F 8B442414 MOV EAX , 14 [ESP] 627B83 F76DF8 IMUL F8 [EBP] 627B86 8945F8 MOV F8 [EBP] , EAX 627B89 8B44240C MOV EAX , C [ESP] 627B8D 03442408 ADD EAX , 8 [ESP] 627B91 8945F4 MOV F4 [EBP] , EAX 627B94 8B442410 MOV EAX , 10 [ESP] 627B98 F76DF4 IMUL F4 [EBP] 627B9B 0345F8 ADD EAX , F8 [EBP] 627B9E 8945F8 MOV F8 [EBP] , EAX 627BA1 8B44240C MOV EAX , C [ESP] 627BA5 8945F4 MOV F4 [EBP] , EAX 627BA8 8B442408 MOV EAX , 8 [ESP] 627BAC F76DF4 IMUL F4 [EBP] 627BAF 0345F8 ADD EAX , F8 [EBP] 627BB2 8D6DFC LEA EBP , FC [EBP] 627BB5 C3 RET NEAR END-CODE ( 99 bytes, 28 instructions )
CODE DRMOVE 5530E4 5A POP EDX 5530E5 8BF0 MOV ESI , EAX 5530E7 FF7435FC PUSH FC [EBP] [ESI] 5530EB 83EE04 SUB ESI , # 4 5530EE 75F7 JNE 5530E7 5530F0 03E8 ADD EBP , EAX 5530F2 8B4500 MOV EAX , 0 [EBP] 5530F5 8D6D04 LEA EBP , 4 [EBP] 5530F8 FFE2 JMP EDX END-CODE ( 22 bytes, 9 instructions )
CODE dc4 627BC7 8945FC MOV FC [EBP] , EAX 627BCA 8B4504 MOV EAX , 4 [EBP] 627BCD 034500 ADD EAX , 0 [EBP] 627BD0 0345FC ADD EAX , FC [EBP] 627BD3 F76D08 IMUL 8 [EBP] 627BD6 8945F8 MOV F8 [EBP] , EAX 627BD9 8B4500 MOV EAX , 0 [EBP] 627BDC 0345FC ADD EAX , FC [EBP] 627BDF F76D04 IMUL 4 [EBP] 627BE2 0345F8 ADD EAX , F8 [EBP] 627BE5 8945F8 MOV F8 [EBP] , EAX 627BE8 8B5D00 MOV EBX , 0 [EBP] 627BEB 0FAF5DFC IMUL EBX , FC [EBP] 627BEF 8BC3 MOV EAX , EBX 627BF1 0345F8 ADD EAX , F8 [EBP] 627BF4 8D6D0C LEA EBP , C [EBP] 627BF7 C3 RET NEAR END-CODE ( 49 bytes, 17 instructions ) Код на лок. переменных 37 инструкций Код на манипуляторах 17 инструкций На обычном форте это (и многое другое) писать гораздо дольше Фрагмент типа ( T> a ) можно написать например так | res | Out: res Код: : dc4 | a b c d | b c + d + a * c d + b * + c d * + | res | out: res ; Где out: автоматически расположит указанное количество выходных параметров в указанном порядке на стеке.
Изменяю синтаксис манипуляторов с целью упрощения их использования для ускорения создания программ и оптимизации их кода.
[code]\ сумма попарных произведений для четырех чисел : dcr4 { a b c d } \ spf b c + d + a * c d + b * + c d * + ; SEE dcr4 SEE DRMOVE
m{ : dc4 | a b c d | \ spf + манипуляторы b c + d + a * c d + b * + c d * + T> a ; }m SEE dc4 [/code] лог. [code]CODE dcr4 627B53 8945FC MOV FC [EBP] , EAX 627B56 B810000000 MOV EAX , # 10 627B5B 8D6DFC LEA EBP , FC [EBP] 627B5E E881B5F2FF CALL 5530E4 ( DRMOVE ) 627B63 6810000000 PUSH , # 10 627B68 6868325500 PUSH , # 553268 627B6D 8945FC MOV FC [EBP] , EAX 627B70 8B442410 MOV EAX , 10 [ESP] 627B74 0344240C ADD EAX , C [ESP] 627B78 03442408 ADD EAX , 8 [ESP] 627B7C 8945F8 MOV F8 [EBP] , EAX 627B7F 8B442414 MOV EAX , 14 [ESP] 627B83 F76DF8 IMUL F8 [EBP] 627B86 8945F8 MOV F8 [EBP] , EAX 627B89 8B44240C MOV EAX , C [ESP] 627B8D 03442408 ADD EAX , 8 [ESP] 627B91 8945F4 MOV F4 [EBP] , EAX 627B94 8B442410 MOV EAX , 10 [ESP] 627B98 F76DF4 IMUL F4 [EBP] 627B9B 0345F8 ADD EAX , F8 [EBP] 627B9E 8945F8 MOV F8 [EBP] , EAX 627BA1 8B44240C MOV EAX , C [ESP] 627BA5 8945F4 MOV F4 [EBP] , EAX 627BA8 8B442408 MOV EAX , 8 [ESP] 627BAC F76DF4 IMUL F4 [EBP] 627BAF 0345F8 ADD EAX , F8 [EBP] 627BB2 8D6DFC LEA EBP , FC [EBP] 627BB5 C3 RET NEAR END-CODE ( 99 bytes, 28 instructions )
CODE DRMOVE 5530E4 5A POP EDX 5530E5 8BF0 MOV ESI , EAX 5530E7 FF7435FC PUSH FC [EBP] [ESI] 5530EB 83EE04 SUB ESI , # 4 5530EE 75F7 JNE 5530E7 5530F0 03E8 ADD EBP , EAX 5530F2 8B4500 MOV EAX , 0 [EBP] 5530F5 8D6D04 LEA EBP , 4 [EBP] 5530F8 FFE2 JMP EDX END-CODE ( 22 bytes, 9 instructions )
CODE dc4 627BC7 8945FC MOV FC [EBP] , EAX 627BCA 8B4504 MOV EAX , 4 [EBP] 627BCD 034500 ADD EAX , 0 [EBP] 627BD0 0345FC ADD EAX , FC [EBP] 627BD3 F76D08 IMUL 8 [EBP] 627BD6 8945F8 MOV F8 [EBP] , EAX 627BD9 8B4500 MOV EAX , 0 [EBP] 627BDC 0345FC ADD EAX , FC [EBP] 627BDF F76D04 IMUL 4 [EBP] 627BE2 0345F8 ADD EAX , F8 [EBP] 627BE5 8945F8 MOV F8 [EBP] , EAX 627BE8 8B5D00 MOV EBX , 0 [EBP] 627BEB 0FAF5DFC IMUL EBX , FC [EBP] 627BEF 8BC3 MOV EAX , EBX 627BF1 0345F8 ADD EAX , F8 [EBP] 627BF4 8D6D0C LEA EBP , C [EBP] 627BF7 C3 RET NEAR END-CODE ( 49 bytes, 17 instructions )[/code]
Код на лок. переменных 37 инструкций Код на манипуляторах 17 инструкций На обычном форте это (и многое другое) писать гораздо дольше
Фрагмент типа ( T> a ) можно написать например так | res | Out: res [code]: dc4 | a b c d | b c + d + a * c d + b * + c d * + | res | out: res ;[/code] Где out: автоматически расположит указанное количество выходных параметров в указанном порядке на стеке.
|
|
|
|
Добавлено: Ср дек 14, 2022 00:59 |
|
|
|
|
|
Заголовок сообщения: |
Re: Еще один способ работы с параметрами на стеке |
|
|
Реализовал измеритель времени однократного исполнения отдельных слов для WinFAsmForth64, сначала пишем на fasm в ядро форт-системы: Код: cfa_AHEADER 0,'xmeter',xmeter movd xmm0, eax xor eax, eax cpuid rdtsc movd xmm1, eax movd ebx, xmm0 call rbx xor eax, eax cpuid rdtsc movd ecx, xmm1 sub eax, ecx movd xmm2, eax xor eax, eax cpuid rdtsc movd xmm1, eax movd ebx, xmm0 xor eax, eax cpuid rdtsc movd ecx, xmm1 sub eax, ecx mov ebx, eax movd eax, xmm2 sub eax, ebx ret потом дописываем в уже сформированной форт-системе: Код: : dT ( "name" -- ) ' xmeter CR NIP . ." ticks " CR S0 @ SP! ; использование: Код: dT DROP результат: Код: 81 ticks
Реализовал измеритель времени однократного исполнения отдельных слов для WinFAsmForth64, сначала пишем на fasm в ядро форт-системы: [code]cfa_AHEADER 0,'xmeter',xmeter movd xmm0, eax xor eax, eax cpuid rdtsc movd xmm1, eax movd ebx, xmm0 call rbx xor eax, eax cpuid rdtsc movd ecx, xmm1 sub eax, ecx movd xmm2, eax xor eax, eax cpuid rdtsc movd xmm1, eax movd ebx, xmm0 xor eax, eax cpuid rdtsc movd ecx, xmm1 sub eax, ecx mov ebx, eax movd eax, xmm2 sub eax, ebx ret[/code] потом дописываем в уже сформированной форт-системе: [code]: dT ( "name" -- ) ' xmeter CR NIP . ." ticks " CR S0 @ SP! ;[/code] использование: [code]dT DROP[/code] результат: [code]81 ticks[/code]
|
|
|
|
Добавлено: Вс июн 05, 2022 23:33 |
|
|
|
|