Deutsch   English   Français   Italiano  
<2025Feb27.235347@mips.complang.tuwien.ac.at>

View for Bookmarking (what is this?)
Look up another Usenet article

Path: ...!weretis.net!feeder9.news.weretis.net!news.quux.org!eternal-september.org!feeder3.eternal-september.org!news.eternal-september.org!eternal-september.org!.POSTED!not-for-mail
From: anton@mips.complang.tuwien.ac.at (Anton Ertl)
Newsgroups: comp.lang.forth
Subject: Re: Stack vs stackless operation
Date: Thu, 27 Feb 2025 22:53:47 GMT
Organization: Institut fuer Computersprachen, Technische Universitaet Wien
Lines: 77
Message-ID: <2025Feb27.235347@mips.complang.tuwien.ac.at>
References: <591e7bf58ebb1f90bd34fba20c730b83@www.novabbs.com> <34df278ef0a52d0eab9d035f45795389@www.novabbs.com> <a6c9d8a0aa7e1046af7948093e07cff0@www.novabbs.com> <2025Feb26.153250@mips.complang.tuwien.ac.at> <2025Feb26.184613@mips.complang.tuwien.ac.at> <875xkwo5io.fsf@nightsong.com> <2025Feb27.082944@mips.complang.tuwien.ac.at> <vpqnil$39j3c$1@dont-email.me>
Injection-Date: Fri, 28 Feb 2025 00:07:00 +0100 (CET)
Injection-Info: dont-email.me; posting-host="e054b86fdabb721dc5ec61dd1f9ee2c7";
	logging-data="3477830"; mail-complaints-to="abuse@eternal-september.org";	posting-account="U2FsdGVkX18Ojdj9VP1Nirse99l7rDNA"
Cancel-Lock: sha1:LBVhlkFAWkR38g+ZexoRRa6XBpU=
X-newsreader: xrn 10.11
Bytes: 4513

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.html
comp.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/