home bbs files messages ]

Forums before death by AOL, social media and spammers... "We can't have nice things"

   comp.lang.forth      Forth programmers eat a lot of Bratwurst      117,927 messages   

[   << oldest   |   < older   |   list   |   newer >   |   newest >>   ]

   Message 117,099 of 117,927   
   Gerry Jackson to Anton Ertl   
   Re: Stack vs stackless operation   
   27 Feb 25 22:05:09   
   
   From: do-not-use@swldwa.uk   
      
   On 27/02/2025 07:29, Anton Ertl wrote:   
   > Paul Rubin  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   
      
   --- SoupGate-DOS v1.05   
    * Origin: you cannot sedate... all the things you hate (1:229/2)   

[   << oldest   |   < older   |   list   |   newer >   |   newest >>   ]


(c) 1994,  bbs@darkrealms.ca