Deutsch   English   Français   Italiano  
<vpqnil$39j3c$1@dont-email.me>

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: Gerry Jackson <do-not-use@swldwa.uk>
Newsgroups: comp.lang.forth
Subject: Re: Stack vs stackless operation
Date: Thu, 27 Feb 2025 22:05:09 +0000
Organization: A noiseless patient Spider
Lines: 105
Message-ID: <vpqnil$39j3c$1@dont-email.me>
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>
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8; format=flowed
Content-Transfer-Encoding: 7bit
Injection-Date: Thu, 27 Feb 2025 23:05:10 +0100 (CET)
Injection-Info: dont-email.me; posting-host="5c6af9a24d76df3003e3dde12859cc3b";
	logging-data="3460204"; mail-complaints-to="abuse@eternal-september.org";	posting-account="U2FsdGVkX1+G2KKyA9hytEBLFteWLsKDjj0jXpvJUpE="
User-Agent: Mozilla Thunderbird
Cancel-Lock: sha1:EhAYktKUjbVCV04HTRScvxv/hg8=
In-Reply-To: <2025Feb27.082944@mips.complang.tuwien.ac.at>
Content-Language: en-GB
Bytes: 5769

On 27/02/2025 07:29, Anton Ertl wrote:
> Paul Rubin <no.email@nospam.invalid> writes:
>> anton@mips.complang.tuwien.ac.at (Anton Ertl) writes:
>>> : :=: ( addr1 addr2 -- )
>>>      OVER @ >R  DUP @   ROT !   R> SWAP ! ;
>>
>> : ex ( a1 a2 -- ) 2>r 2r@ @ swap  @ r> !  r> ! ;
>>
>> looks a little simpler.
> 
> This inspires another one:
> 
> : exchange2 ( addr1 addr2 -- )
>      dup >r @ over @ r> ! swap ! ;
> 
> With some other versions this results in the following benchmark
> program:
> 
> [defined] !@ [if]
> : exchange ( addr1 addr2 -- )
>      over @ swap !@ swap ! ;
> [then]
> 
> \ Paul Rubin <875xkwo5io.fsf@nightsong.com>
> : ex ( addr1 addr2 -- )
>      2>r 2r@ @ swap  @ r> !  r> ! ;
> 
> : ex-locals {: x y -- :} x @ y @ x ! y ! ;
> 
> \ Anton Ertl
> : exchange2 ( addr1 addr2 -- )
>      dup >r @ over @ r> ! swap ! ;
> 
> \ Marcel Hendrix
> : :=: ( addr1 addr2 -- )
>      OVER @ >R  DUP @   ROT !   R> SWAP ! ;
> 
> variable v1
> variable v2
> 
> 1 v1 !
> 2 v2 !
> 
> : bench ( "name" -- )
>      v1 v2
>      :noname ]] 100000000 0 do 2dup [[ parse-name evaluate ]] loop ; [[
>      execute ;
> 
> 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.
> 
> vfx64 5.43:
>        :=:                        ex          ex-locals    exchange2
>    335_298_202                 432_614_804   928_542_678   336_134_513 cyc.
> 1_166_400_242               1_366_264_943 2_866_547_067 1_166_280_641 inst.
> 
> And here's the code produced by gforth-fast:
> 
> :=:                ex                 ex-locals          exchange2
> over    1->2       2>r    1->0        l    1->1         dup >r 1->1
>    mov r15,$08[r10]   add r10,$08        mov rax,rbp      >r    1->1
> @    2->2            mov r15,r13        add r10,$08        mov -$8[r14],r13
>    mov r15,[r15]      mov r13,[r10]      lea rbp,-$8[rbp]   sub r14,$08
>> r    2->1           mov -$8[r14],r13   mov -$8[rax],r13 @    1->1
>    mov -$8[r14],r15   sub r14,$10        mov r13,[r10]      mov r13,$00[r13]
>    sub r14,$08        mov [r14],r15    >l @local0 1->1    over    1->2
> dup    1->2        2r@    0->2        @local0    1->1      mov r15,$08[r10]
>    mov r15,r13        mov r13,$08[r14]   mov rax,rbp      @    2->2
> @    2->2            mov r15,[r14]      lea rbp,-$8[rbp]   mov r15,[r15]
>    mov r15,[r15]    @    2->2            mov -$8[rax],r13 r>    2->3
> rot    2->3          mov r15,[r15]    @    1->1            mov r9,[r14]
>    mov r9,$08[r10]  swap    2->2         mov r13,$00[r13]   add r14,$08
>    add r10,$08        mov rax,r13      @local1    1->2    !    3->1
> !    3->1            mov r13,r15        mov r15,$08[rbp]   mov [r9],r15
>    mov [r9],r15       mov r15,rax      @    2->2          swap    1->2
> r>    1->2         @    2->2            mov r15,[r15]      mov r15,$08[r10]
>    mov r15,[r14]      mov r15,[r15]    @local0    2->3      add r10,$08
>    add r14,$08      r>    2->3           mov r9,$00[rbp]  !    2->0
> swap    2->3         mov r9,[r14]     !    3->1            mov [r15],r13
>    add r10,$08        add r14,$08        mov [r9],r15     ;s    0->1
>    mov r9,r13       !    3->1          @local1    1->2      mov r13,$08[r10]
>    mov r13,[r10]      mov [r9],r15       mov r15,$08[rbp]   add r10,$08
> !    3->1          r>    1->2         !    2->0            mov rbx,[r14]
>    mov [r9],r15       mov r15,[r14]      mov [r15],r13      add r14,$08
> ;s    1->1           add r14,$08      lp+2    0->1         mov rax,[rbx]
>    mov rbx,[r14]    !    2->0            mov r13,$08[r10]   jmp eax
>    add r14,$08        mov [r15],r13      add r10,$08
>    mov rax,[rbx]    ;s    0->1           add rbp,$10
>    jmp eax            mov r13,$08[r10] ;s    1->1
>                       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
> 

How does a crude definition not involving the R stack compare:
: ex3  over @ over @ 3 pick ! over ! 2drop ;

-- 
Gerry