Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]
Groups > comp.lang.forth > #26722
| 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> |
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 | Next — Previous in thread | Next in thread | Find similar | Unroll 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