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

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

Path: ...!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: Mon, 24 Feb 2025 21:50:21 GMT
Organization: Institut fuer Computersprachen, Technische Universitaet Wien
Lines: 74
Message-ID: <2025Feb24.225021@mips.complang.tuwien.ac.at>
References: <591e7bf58ebb1f90bd34fba20c730b83@www.novabbs.com>
Injection-Date: Mon, 24 Feb 2025 23:10:04 +0100 (CET)
Injection-Info: dont-email.me; posting-host="a1540ae6aa62a663c7f1bc29fd6d7ec5";
	logging-data="1544648"; mail-complaints-to="abuse@eternal-september.org";	posting-account="U2FsdGVkX19KTvLalj1N5uObBRZieG5X"
Cancel-Lock: sha1:nz5s7WWGTE/ACEoXAvrpq4Lzaz8=
X-newsreader: xrn 10.11
Bytes: 3719

zbigniew2011@gmail.com (LIT) writes:
>I wonder: wouldn't it be useful to have stackless basic
>arith operations? I mean instead of fetching the values
>first and putting them on the stack, then doing something,
>and in the end storing the result somewhere wouldn't it
>be practical to use directly the variables?

I don't remember ever doing that, so no, it would not be practical.

Forth has had values for quite a while, so you could avoid the need to
write @ and !; you would instead write something like:

a b + to c

For global values the code is typically not better than when using
variables, though.

>But after I came up with this idea I realized someone
>surely invented that before - it looks so obvious — yet
>I didn't see it anywhere.

The VAX architecture has instructions with three memory operands,
including ADD3.  That feature makes it pretty hard to implement
efficiently.

>Did anyone of you see something
>like this in any code?

No.

>If so — actually why somehow
>(probably?) such solution has not become widespread?

Probably because the case where the two operands of a + are in memory,
and the result is needed in memory is not that frequent.

>Looks good to me; math can be done completely in ML
>avoiding "Forth machine" engagement, therefore saving many
>cycles.

Not sure what you mean with "Forth machine engagement"; with good
Forth compilers these days, a typical stack-to-stack addition is
faster than the best machine code for a memory-to-memory addition.
E.g. VFX64 turns

: dec-u#b ( u1 -- u2 )
    dup #-3689348814741910323 um* nip 3 rshift tuck 10 * - '0' + hold ;  ok

into

( 0050A300    48BACDCCCCCCCCCCCCCC )  MOV     RDX, # CCCCCCCC:CCCCCCCD
( 0050A30A    488BC2 )                MOV     RAX, RDX
( 0050A30D    48F7E3 )                MUL     RBX
( 0050A310    48C1EA03 )              SHR     RDX, # 03
( 0050A314    486BCA0A )              IMUL    RCX, RDX, # 0A
( 0050A318    482BD9 )                SUB     RBX, RCX
( 0050A31B    4883C330 )              ADD     RBX, # 30
( 0050A31F    488D6DF8 )              LEA     RBP, [RBP+-08]
( 0050A323    48895500 )              MOV     [RBP], RDX
( 0050A327    E87CA7F1FF )            CALL    00424AA8  HOLD
( 0050A32C    C3 )                    RET/NEXT
( 45 bytes, 11 instructions )

I don't think that it would be faster or shorter to use
memory-to-memory operations here.  That's also why the VAX died: RISCs
just outperformed it.

- 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/