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