Sujet : Re: Stack vs stackless operation
De : anton (at) *nospam* mips.complang.tuwien.ac.at (Anton Ertl)
Groupes : comp.lang.forthDate : 27. Feb 2025, 23:53:47
Autres entêtes
Organisation : Institut fuer Computersprachen, Technische Universitaet Wien
Message-ID : <2025Feb27.235347@mips.complang.tuwien.ac.at>
References : 1 2 3 4 5 6 7 8
User-Agent : xrn 10.11
Gerry Jackson <
do-not-use@swldwa.uk> writes:
On 27/02/2025 07:29, Anton Ertl wrote:
\ Anton Ertl
: exchange2 ( addr1 addr2 -- )
dup >r @ over @ r> ! swap ! ;
...
Results (on Zen4):
>
gforth-fast (development):
:=: exchange ex ex-locals exchange2
814_881_277 879_389_133 928_825_521 875_574_895 808_543_975 cyc.
3_908_874_164 3_708_891_336 4_508_966_770 4_209_778_557 3_708_865_505 inst.
...
How does a crude definition not involving the R stack compare:
: ex3 over @ over @ 3 pick ! over ! 2drop ;
exchange2 ex3
dup >r 1->1 over 1->1
r 1->1 mov [r10],r13
mov -$08[r14],r13 sub r10,$08
sub r14,$08 mov r13,$10[r10]
@ 1->1 @ 1->1
mov r13,$00[r13] mov r13,$00[r13]
over 1->2 over 1->2
mov r15,$08[r10] mov r15,$08[r10]
@ 2->2 @ 2->2
mov r15,[r15] mov r15,[r15]
r> 2->3 fourth 2->3
mov r9,[r14] mov r9,$10[r10]
add r14,$08 ! 3->1
! 3->1 mov [r9],r15
mov [r9],r15 over 1->2
swap 1->2 mov r15,$08[r10]
mov r15,$08[r10] ! 2->0
add r10,$08 mov [r15],r13
! 2->0 2drop 0->0
mov [r15],r13 add r10,$10
;s 0->1 ;s 0->1
mov r13,$08[r10] mov r13,$08[r10]
add r10,$08 add r10,$08
mov rbx,[r14] mov rbx,[r14]
add r14,$08 add r14,$08
mov rax,[rbx] mov rax,[rbx]
jmp eax jmp eax
EX3 plays to Gforth's strengths: copying words (e.g., OVER) instead of
shuffling words (e.g., SWAP), remove superfluous stuff with 2DROP.
It also plays to VFX's strengths: being analytic about the dats stack.
EXCHANGE2 was the fastest version (together with :=:) before, here's
that compared to EX3:
exchange2 ex3
334_718_398 273_592_214 cycles
1_167_276_392 967_258_380 instructions
EXCHANGE2 EX3
PUSH RBX MOV RDX, [RBP]
MOV RDX, [RBP] MOV RDX, 0 [RDX]
MOV RDX, 0 [RDX] MOV RCX, 0 [RBX]
POP RCX MOV RAX, [RBP]
MOV RBX, 0 [RBX] MOV 0 [RAX], RCX
MOV 0 [RCX], RDX MOV 0 [RBX], RDX
MOV RDX, [RBP] MOV RBX, [RBP+08]
MOV 0 [RDX], RBX LEA RBP, [RBP+10]
MOV RBX, [RBP+08] RET/NEXT
LEA RBP, [RBP+10] ( 29 bytes, 9 instructions )
RET/NEXT
( 31 bytes, 11 instructions )
- anton
-- M. Anton Ertl http://www.complang.tuwien.ac.at/anton/home.htmlcomp.lang.forth FAQs: http://www.complang.tuwien.ac.at/forth/faq/toc.html New standard: https://forth-standard.org/EuroForth 2023 proceedings: http://www.euroforth.org/ef23/papers/EuroForth 2024 proceedings:
http://www.euroforth.org/ef24/papers/