Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]


Groups > comp.lang.forth > #26722

?DUP (was: Floating Point : To Stack or Not To Stack)

From anton@mips.complang.tuwien.ac.at (Anton Ertl)
Newsgroups comp.lang.forth
Subject ?DUP (was: Floating Point : To Stack or Not To Stack)
Date 2013-10-28 15:19 +0000
Organization Institut fuer Computersprachen, Technische Universitaet Wien
Message-ID <2013Oct28.161930@mips.complang.tuwien.ac.at> (permalink)
References (7 earlier) <3_idnWekjL7WAPbPnZ2dnUVZ_qmdnZ2d@supernews.com> <2013Oct26.154815@mips.complang.tuwien.ac.at> <EOadnQ8On7VBivHPnZ2dnUVZ_r-dnZ2d@supernews.com> <2013Oct27.134114@mips.complang.tuwien.ac.at> <6YadnfY509sEiPDPnZ2dnUVZ_hadnZ2d@supernews.com>

Show all headers | View raw


Andrew Haley <andrew29@littlepinkcloud.invalid> writes:
>Anton Ertl <anton@mips.complang.tuwien.ac.at> wrote:
>> Andrew Haley <andrew29@littlepinkcloud.invalid> writes:
>>>Anton Ertl <anton@mips.complang.tuwien.ac.at> wrote:
>>>> Andrew Haley <andrew29@littlepinkcloud.invalid> writes:
>>>>>That's suprising to me too.  ?DUP WHILE is natural and elegant when
>>>>>iterating over lists, for example.
>>>> 
>>>> ?DUP IF can save an ELSE DROP, and, depending on layout style,q up to
>>>> two lines.  So i can understand the urge to use ?DUP IF there.
>>>> 
>>>> ?DUP WHILE only saves a DROP.  Natural and elegant?
>>>
>>>Sure, it reduces stack noise.  What's not to like?  ;-)
>> 
>> A word with a variable stack effect.
>
>Sure, but that's just a religious thing; for those who don't follow
>that religion it's meaningless.

It's a technical thing.  Such words do not just cause overhead
in the compiler, but also in the brain.  The programmer has to take
two stack effects into consideration, and the condition under which
which stack effect happens.

>> Anyway, even if we want to optimize for a threaded-code
>> implementation, ?DUP IF is slower then ?DUP-IF, because it needs an
>> additional test and an additional NEXT.
>
>True, but ?DUP-IF is fugly.

Compared to ?DUP IF it's beautiful.  Faster on threaded-code and
native-code systems without adding extra complexity to the compiler.

>>>However, if you're going to write a full optimizing compiler, it's a
>>>bit pathetic not to be able to turn  ?DUP IF ... THEN   into
>>>DUP IF  ...  ELSE DROP  THEN .  I suppose it makes sense if that's
>>>an idiom you don't use.
>> 
>> I guess I won't be writing a "full optimizing compiler", whatever
>> that may be.  The compilation techniques that I have in mind are
>> capable of producing good native code for a lot of Forth code, but
>> they don't produce good code for anything involving ?DUP.
>
>Well, whose fault is that?  :-)

Fault?  If you want to imply that it's just a personal preference,
please show me the paper that shows how to optimize ?DUP and get code
quality comparable to an analytic compiler without extra complexity
(compared to an analytic compiler that does not optimize ?DUP).

>> One can add complexity to the compiler for optimizing some of the
>> code that uses ?DUP, but that requires more than just adding a few
>> more entries to an existing table; it requires adding an otherwise
>> unnecessary sequence recognition capability; that's very low on my
>> ToDo list.
>
>OK.  But that's really just what I said: if it's not in your style,
>there's no point for you in optimizing it.

No, this has nothing to do with compiling code I have written.  It
adds a substantial amount of extra complexity to the compiler also if
the compiler compiles your code.  The Forth way is to avoid that
complexity and leave it to the programmer to avoid ?DUP.

I just tried out whether VFX optimizes ?DUP IF.  It does; the result
is interesting:

variable a  ok
: foo dup if a ! else drop then ;  ok
: bar ?dup if a ! then ;  ok
see foo 
FOO 
( 080BF310    85DB )                  TEST      EBX, EBX
( 080BF312    0F8411000000 )          JZ/E      080BF329
( 080BF318    891D3C240A08 )          MOV       [080A243C], EBX
( 080BF31E    8B5D00 )                MOV       EBX, [EBP]
( 080BF321    8D6D04 )                LEA       EBP, [EBP+04]
( 080BF324    E906000000 )            JMP       080BF32F
( 080BF329    8B5D00 )                MOV       EBX, [EBP]
( 080BF32C    8D6D04 )                LEA       EBP, [EBP+04]
( 080BF32F    C3 )                    NEXT,
( 32 bytes, 9 instructions )
 ok
see bar 
BAR 
( 080BF350    85DB )                  TEST      EBX, EBX
( 080BF352    750B )                  JNZ/NE    080BF35F
( 080BF354    8B5D00 )                MOV       EBX, [EBP]
( 080BF357    8D6D04 )                LEA       EBP, [EBP+04]
( 080BF35A    E90C000000 )            JMP       080BF36B
( 080BF35F    891D3C240A08 )          MOV       [080A243C], EBX
( 080BF365    8B5D00 )                MOV       EBX, [EBP]
( 080BF368    8D6D04 )                LEA       EBP, [EBP+04]
( 080BF36B    C3 )                    NEXT,
( 28 bytes, 9 instructions )

The native code difference between these two versions is that the two
branches of the IF are exchanged, and that BAR uses a short branch,
while FOO uses a long one (resulting in the 4-byte size difference).

I tried to generate the BAR code with

: flip dup 0= if drop else a ! then ;  ok

and it gives the same code, except that it uses a long branch
instruction:

see flip 
FLIP 
( 080BF390    85DB )                  TEST      EBX, EBX
( 080BF392    0F850B000000 )          JNZ/NE    080BF3A3
( 080BF398    8B5D00 )                MOV       EBX, [EBP]
( 080BF39B    8D6D04 )                LEA       EBP, [EBP+04]
( 080BF39E    E90C000000 )            JMP       080BF3AF
( 080BF3A3    891D3C240A08 )          MOV       [080A243C], EBX
( 080BF3A9    8B5D00 )                MOV       EBX, [EBP]
( 080BF3AC    8D6D04 )                LEA       EBP, [EBP+04]
( 080BF3AF    C3 )                    NEXT,
( 32 bytes, 9 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: http://www.forth200x.org/forth200x.html
   EuroForth 2013: http://www.euroforth.org/ef13/

Back to comp.lang.forth | Previous | NextPrevious in thread | Next in thread | Find similar | Unroll thread


Thread

Floating Point : To Stack or Not To Stack rickman <gnuarm@gmail.com> - 2013-10-14 16:18 -0400
  Re: Floating Point : To Stack or Not To Stack "Elizabeth D. Rather" <erather@forth.com> - 2013-10-14 10:34 -1000
    Re: Floating Point : To Stack or Not To Stack Andrew Haley <andrew29@littlepinkcloud.invalid> - 2013-10-14 15:41 -0500
    Re: Floating Point : To Stack or Not To Stack Paul Rubin <no.email@nospam.invalid> - 2013-10-14 20:32 -0700
      Re: Floating Point : To Stack or Not To Stack rickman <gnuarm@gmail.com> - 2013-10-15 17:14 -0400
    Re: Floating Point : To Stack or Not To Stack anton@mips.complang.tuwien.ac.at (Anton Ertl) - 2013-10-15 16:22 +0000
  Re: Floating Point : To Stack or Not To Stack Andrew Haley <andrew29@littlepinkcloud.invalid> - 2013-10-14 15:42 -0500
    Re: Floating Point : To Stack or Not To Stack Hans Bezemer <the.beez.speaks@gmail.com> - 2013-10-16 11:16 +0200
  Re: Floating Point : To Stack or Not To Stack anton@mips.complang.tuwien.ac.at (Anton Ertl) - 2013-10-15 16:09 +0000
  Re: Floating Point : To Stack or Not To Stack krishna.myneni@ccreweb.org - 2013-10-15 18:51 -0700
    Re: Floating Point : To Stack or Not To Stack Andrew Haley <andrew29@littlepinkcloud.invalid> - 2013-10-16 03:47 -0500
    Re: Floating Point : To Stack or Not To Stack anton@mips.complang.tuwien.ac.at (Anton Ertl) - 2013-10-16 12:27 +0000
      Re: Floating Point : To Stack or Not To Stack rickman <gnuarm@gmail.com> - 2013-10-25 14:20 -0400
        Re: Floating Point : To Stack or Not To Stack Paul Rubin <no.email@nospam.invalid> - 2013-10-25 12:08 -0700
          Re: Floating Point : To Stack or Not To Stack rickman <gnuarm@gmail.com> - 2013-10-26 02:34 -0400
            Re: Floating Point : To Stack or Not To Stack Paul Rubin <no.email@nospam.invalid> - 2013-10-26 00:13 -0700
              Re: Floating Point : To Stack or Not To Stack "Elizabeth D. Rather" <erather@forth.com> - 2013-10-25 21:49 -1000
                Re: Floating Point : To Stack or Not To Stack Paul Rubin <no.email@nospam.invalid> - 2013-10-26 01:26 -0700
                Re: Floating Point : To Stack or Not To Stack Andrew Haley <andrew29@littlepinkcloud.invalid> - 2013-10-26 05:45 -0500
                Re: Floating Point : To Stack or Not To Stack anton@mips.complang.tuwien.ac.at (Anton Ertl) - 2013-10-26 13:48 +0000
                Re: Floating Point : To Stack or Not To Stack Andrew Haley <andrew29@littlepinkcloud.invalid> - 2013-10-26 14:28 -0500
                Re: Floating Point : To Stack or Not To Stack anton@mips.complang.tuwien.ac.at (Anton Ertl) - 2013-10-27 12:41 +0000
                Re: Floating Point : To Stack or Not To Stack Andrew Haley <andrew29@littlepinkcloud.invalid> - 2013-10-27 08:31 -0500
                ?DUP (was: Floating Point : To Stack or Not To Stack) anton@mips.complang.tuwien.ac.at (Anton Ertl) - 2013-10-28 15:19 +0000
                Re: ?DUP Andrew Haley <andrew29@littlepinkcloud.invalid> - 2013-10-28 13:54 -0500
                Re: ?DUP "Rod Pemberton" <dont_use_email@xnohavenotit.cnm> - 2013-10-28 16:30 -0400
                Re: ?DUP "Elizabeth D. Rather" <erather@forth.com> - 2013-10-28 11:11 -1000
                Re: ?DUP anton@mips.complang.tuwien.ac.at (Anton Ertl) - 2013-10-29 11:51 +0000
                Re: ?DUP Bernd Paysan <bernd.paysan@gmx.de> - 2013-10-29 16:48 +0100
                Re: ?DUP anton@mips.complang.tuwien.ac.at (Anton Ertl) - 2013-10-29 16:10 +0000
                Re: ?DUP albert@spenarnc.xs4all.nl (Albert van der Horst) - 2013-10-29 16:24 +0000
                Re: ?DUP Bernd Paysan <bernd.paysan@gmx.de> - 2013-10-29 20:00 +0100
                Re: ?DUP anton@mips.complang.tuwien.ac.at (Anton Ertl) - 2013-10-30 07:44 +0000
                Re: ?DUP Andrew Haley <andrew29@littlepinkcloud.invalid> - 2013-10-29 16:29 -0500
                Re: ?DUP "Rod Pemberton" <dont_use_email@xnohavenotit.cnm> - 2013-10-29 18:58 -0400
                Re: ?DUP Andrew Haley <andrew29@littlepinkcloud.invalid> - 2013-10-30 03:15 -0500
                Re: ?DUP albert@spenarnc.xs4all.nl (Albert van der Horst) - 2013-10-30 01:14 +0000
                Re: ?DUP anton@mips.complang.tuwien.ac.at (Anton Ertl) - 2013-10-30 08:22 +0000
                Re: ?DUP "Rod Pemberton" <dont_use_email@xnohavenotit.cnm> - 2013-10-30 08:03 -0400
                Re: ?DUP anton@mips.complang.tuwien.ac.at (Anton Ertl) - 2013-10-30 12:24 +0000
                Re: ?DUP Andrew Haley <andrew29@littlepinkcloud.invalid> - 2013-10-30 12:44 -0500
                Re: ?DUP "Alex McDonald" <blog@rivadpm.com> - 2013-10-30 22:43 +0000
                Re: ?DUP anton@mips.complang.tuwien.ac.at (Anton Ertl) - 2013-10-31 12:09 +0000
                Re: ?DUP Andrew Haley <andrew29@littlepinkcloud.invalid> - 2013-10-31 12:23 -0500
                Re: ?DUP (was: Floating Point : To Stack or Not To Stack) "Rod Pemberton" <dont_use_email@xnohavenotit.cnm> - 2013-10-28 16:30 -0400
                Re: ?DUP "Elizabeth D. Rather" <erather@forth.com> - 2013-10-28 11:16 -1000
                Re: ?DUP Bernd Paysan <bernd.paysan@gmx.de> - 2013-10-29 01:58 +0100
                Re: ?DUP Stefan Mauerhofer <smauerhofer@androsoft.ch> - 2013-10-28 18:41 -0700
                Re: ?DUP Andrew Haley <andrew29@littlepinkcloud.invalid> - 2013-10-29 04:37 -0500
                Re: ?DUP m.a.m.hendrix@tue.nl - 2013-10-29 04:27 -0700
                Re: ?DUP anton@mips.complang.tuwien.ac.at (Anton Ertl) - 2013-10-29 12:51 +0000
              Re: Floating Point : To Stack or Not To Stack anton@mips.complang.tuwien.ac.at (Anton Ertl) - 2013-10-26 09:45 +0000
                Re: Floating Point : To Stack or Not To Stack albert@spenarnc.xs4all.nl (Albert van der Horst) - 2013-10-26 11:30 +0000
                Re: Floating Point : To Stack or Not To Stack Andrew Haley <andrew29@littlepinkcloud.invalid> - 2013-10-26 08:05 -0500
                Re: Floating Point : To Stack or Not To Stack mhx@iae.nl - 2013-10-26 06:09 -0700
                Re: Floating Point : To Stack or Not To Stack "Rod Pemberton" <dont_use_email@nohavenotit.com> - 2013-10-27 03:01 -0400
                Re: Floating Point : To Stack or Not To Stack "Elizabeth D. Rather" <erather@forth.com> - 2013-10-26 22:23 -1000
            Re: Floating Point : To Stack or Not To Stack albert@spenarnc.xs4all.nl (Albert van der Horst) - 2013-10-26 09:39 +0000
              Re: Floating Point : To Stack or Not To Stack albert@spenarnc.xs4all.nl (Albert van der Horst) - 2013-10-26 09:44 +0000
  Re: Floating Point : To Stack or Not To Stack "Ed" <invalid@invalid.com> - 2013-10-18 14:09 +1000
    Re: Floating Point : To Stack or Not To Stack "Elizabeth D. Rather" <erather@forth.com> - 2013-10-17 21:21 -1000
      Re: Floating Point : To Stack or Not To Stack "Ed" <invalid@invalid.com> - 2013-10-19 12:14 +1000
        Re: Floating Point : To Stack or Not To Stack "Elizabeth D. Rather" <erather@forth.com> - 2013-10-18 17:17 -1000
          Re: Floating Point : To Stack or Not To Stack Paul Rubin <no.email@nospam.invalid> - 2013-10-19 02:58 -0700
          Re: Floating Point : To Stack or Not To Stack "Ed" <invalid@invalid.com> - 2013-10-27 22:33 +1100
            Re: Floating Point : To Stack or Not To Stack mhx@iae.nl - 2013-10-27 06:21 -0700
              Re: Floating Point : To Stack or Not To Stack "Ed" <invalid@invalid.com> - 2013-10-29 22:40 +1100
            Re: Floating Point : To Stack or Not To Stack Andrew Haley <andrew29@littlepinkcloud.invalid> - 2013-10-27 08:23 -0500
  Re: Floating Point : To Stack or Not To Stack Stefan Mauerhofer <smauerhofer@androsoft.ch> - 2013-10-28 18:38 -0700

csiph-web