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/