1 \
FLK level
2 optimizer
3 \
Copyright (C) 1998 Lars Krueger
5 \
This file is
part of FLK.
7 \
FLK is
free software
; you
can redistribute
it and/or
8 \ modify
it under the
terms of the
GNU General Public License
9 \
as published by the
Free Software Foundation; either version
2
10 \
of the
License, or (at
your option) any later version
.
12 \
This program is
distributed in the
hope that
it will
be useful
,
13 \ but
WITHOUT ANY WARRANTY; without
even the
implied warranty
of
14 \
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 \
GNU General Public License for more
details.
17 \
You should have
received a copy
of the GNU General Public License
18 \ along
with this
program; if not
, write
to the Free Software
19 \
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
21 \ $
Id: flkopt
.fs
,v
1.8 1998/09/13 18:55:51 root
Exp $
23 \
Revision 1.8 1998/09/13 18:55:51 root
24 \ fixed optimizers
for cf stack
26 \
Revision 1.7 1998/08/30 10:50:59 root
27 \
new optimizing algorithm
29 \
Revision 1.6 1998/07/18 10:49:59 root
32 \
Revision 1.5 1998/07/16 19:31:37 root
33 \ changed
to conditional
near jumps
35 \
Revision 1.4 1998/07/13 18:08:54 root
36 \ various
optimizations
38 \
Revision 1.3 1998/07/06 18:01:13 root
39 \
new optimizers
( IF/WHILE)
41 \
Revision 1.2 1998/07/05 18:45:25 root
42 \ bugs
corrected, added
X forms
routines, .faulty
-word added
44 \
Revision 1.1 1998/07/03 20:57:50 root
48 : (_sizing
) ( prim
-xt
-- )
49 0 opt
-getlit \ pxt
x rel
?
54 opt
( ''# '' CELLS )opt: ['] CELLS (_sizing) ;opt
55 opt( ''# '' 1+ )opt: ['] 1+ (_sizing) ;opt
56 opt
( ''# '' 1- )opt: ['] 1- (_sizing) ;opt
57 opt( ''# '' CHAR+ )opt: ['] 1+ (_sizing) ;opt
58 opt
( ''# '' 2* )opt: ['] 2* (_sizing) ;opt
59 opt( ''# '' 2/ )opt: ['] 2/ (_sizing) ;opt
61 \
General arithmetic optimizer
. Precalculates or produces
faster code
.
63 0 opt
-getlit \ xt
x rel
?
72 0 opt
-getlit \ xt
x1 rel1 x0 rel0
73 ROT OR -ROT \ xt
rel tos1 tos0
74 TURN EXECUTE SWAP \
x rel
78 opt
( ''# '' + )opt: ['] add, (#arith) ;opt
79 opt( ''# '' - )opt: ['] sub, (#arith) ;opt
80 opt
( ''# '' OR )opt: ['] or, (#arith) ;opt
81 opt( ''# '' AND )opt: ['] and, (#arith) ;opt
82 opt
( ''# '' XOR )opt: ['] xor, (#arith) ;opt
84 opt( ''# ''# '' + )opt: ['] + (##arith) ;opt
85 opt
( ''# ''# '' - )opt: ['] - (##arith) ;opt
86 opt( ''# ''# '' OR )opt: ['] OR (##arith) ;opt
87 opt
( ''# ''# '' AND )opt: ['] AND (##arith) ;opt
88 opt( ''# ''# '' XOR )opt: ['] XOR (##arith) ;opt
92 0 opt
-getlit
DROP \ addr
101 0 opt
-getlit
DROP \ addr
110 0 opt
-getlit
DROP \ addr
117 \
Optimizer of + @ sequence
.
118 opt
( ''# '' + '' @ )opt:
119 0 opt
-getlit \
x rel?
131 0 [tos0
+tos1
] tos1 mov
,
136 opt
( '' 0= '' IF )opt
:
145 : (#-rel-IF) ( jmp-xt n-free -- orig )
146 0 opt-getlit \ xt nf x rel?
149 ?+relocate ## tos0 cmp,
155 : (rel-IF) ( jmp-xt nfree -- orig )
164 opt( '' = '' IF )opt: ['] n-jnz
, 1 (rel-IF) ;opt
165 opt
( '' <> '' IF )opt
: ['] n-jz, 1 (rel-IF) ;opt
166 opt( '' < '' IF )opt: ['] n-jnl
, 1 (rel-IF) ;opt
167 opt
( '' > '' IF )opt
: ['] n-jng, 1 (rel-IF) ;opt
168 opt( '' <= '' IF )opt: ['] n-jnle
, 1 (rel-IF) ;opt
169 opt
( '' >= '' IF )opt
: ['] n-jnge, 1 (rel-IF) ;opt
171 opt( ''# '' = '' IF )opt: ['] n-jnz
, 1 (#-rel-IF) ;opt
172 opt
( ''# '' <> '' IF )opt: ['] n-jz, 1 (#-rel-IF) ;opt
173 opt( ''# '' < '' IF )opt: ['] n-jnl, 1 (#-rel-IF) ;opt
174 opt
( ''# '' > '' IF )opt: ['] n-jng, 1 (#-rel-IF) ;opt
175 opt( ''# '' <= '' IF )opt: ['] n-jnle, 1 (#-rel-IF) ;opt
176 opt
( ''# '' >= '' IF )opt: ['] n-jnge, 1 (#-rel-IF) ;opt
178 opt( '' OVER '' = '' IF )opt: ['] n-jnz, 0 (rel-IF) 0 1 opt-remove ;opt
179 opt
( '' OVER '' <> '' IF )opt
: ['] n-jz, 0 (rel-IF) 0 1 opt-remove ;opt
180 opt( '' OVER '' < '' IF )opt: ['] n-jng
, 0 (rel-IF) 0 1 opt
-remove
;opt
181 opt
( '' OVER '' > '' IF )opt
: ['] n-jnl, 0 (rel-IF) 0 1 opt-remove ;opt
182 opt( '' OVER '' <= '' IF )opt: ['] n-jnge
, 0 (rel-IF) 0 1 opt
-remove
;opt
183 opt
( '' OVER '' >= '' IF )opt
: ['] n-jnle, 0 (rel-IF) 0 1 opt-remove ;opt
185 opt( ''# '' OVER '' = '' IF )opt: ['] n-jnz
, 0 (#-rel-IF) 0 1 opt-remove ;opt
186 opt
( ''# '' OVER '' <> '' IF )opt: ['] n-jz, 0 (#-rel-IF) 0 1 opt-remove ;opt
187 opt( ''# '' OVER '' < '' IF )opt: ['] n-jng, 0 (#-rel-IF) 0 1 opt-remove ;opt
188 opt
( ''# '' OVER '' > '' IF )opt: ['] n-jnl, 0 (#-rel-IF) 0 1 opt-remove ;opt
189 opt( ''# '' OVER '' <= '' IF )opt: ['] n-jnge, 0 (#-rel-IF) 0 1 opt-remove ;opt
190 opt
( ''# '' OVER '' >= '' IF )opt: ['] n-jnle, 0 (#-rel-IF) 0 1 opt-remove ;opt
192 opt( '' DUP '' >R )opt:
199 opt( '' R> '' DROP )opt:
206 opt( '' DROP '' R> )opt:
213 : (2DUP-rel-IF) ( jmp-xt -- )
222 opt( '' 2DUP '' = '' IF )opt: ['] n-jnz, (2DUP-rel-IF) ;opt
223 opt
( '' 2DUP '' <> '' IF )opt
: ['] n-jz, (2DUP-rel-IF) ;opt
224 opt( '' 2DUP '' < '' IF )opt: ['] n-jnl
, (2DUP-rel-IF) ;opt
225 opt
( '' 2DUP '' > '' IF )opt
: ['] n-jng, (2DUP-rel-IF) ;opt
226 opt( '' 2DUP '' <= '' IF )opt: ['] n-jnle
, (2DUP-rel-IF) ;opt
227 opt
( '' 2DUP '' >= '' IF )opt
: ['] n-jnge, (2DUP-rel-IF) ;opt
229 : (rel-WHILE) ( dest jmp-xt nr-free -- orig dest)
233 opt( '' = '' WHILE )opt: ['] n-jnz
, 1 (rel-WHILE) ;opt
234 opt
( '' <> '' WHILE )opt
: ['] n-jz, 1 (rel-WHILE) ;opt
235 opt( '' < '' WHILE )opt: ['] n-jnl
, 1 (rel-WHILE) ;opt
236 opt
( '' > '' WHILE )opt
: ['] n-jng, 1 (rel-WHILE) ;opt
237 opt( '' <= '' WHILE )opt: ['] n-jnle
, 1 (rel-WHILE) ;opt
238 opt
( '' >= '' WHILE )opt
: ['] n-jnge, 1 (rel-WHILE) ;opt
240 opt( '' OVER '' = '' WHILE )opt: ['] n-jnz
, 0 (rel-WHILE) 0 1 opt
-remove
;opt
241 opt
( '' OVER '' <> '' WHILE )opt
: ['] n-jz, 0 (rel-WHILE) 0 1 opt-remove ;opt
242 opt( '' OVER '' < '' WHILE )opt: ['] n-jng
, 0 (rel-WHILE) 0 1 opt
-remove
;opt
243 opt
( '' OVER '' > '' WHILE )opt
: ['] n-jnl, 0 (rel-WHILE) 0 1 opt-remove ;opt
244 opt( '' OVER '' <= '' WHILE )opt: ['] n-jnge
, 0 (rel-WHILE) 0 1 opt
-remove
;opt
245 opt
( '' OVER '' >= '' WHILE )opt
: ['] n-jnle, 0 (rel-WHILE) 0 1 opt-remove ;opt
247 : (2DUP-rel-WHILE) ( dest jmp-xt nr-free -- orig dest )
248 (2DUP-rel-IF) 1 (CS-ROLL) ;
250 opt( '' 2DUP '' = '' WHILE )opt: ['] n-jnz
, (2DUP-rel-WHILE) ;opt
251 opt
( '' 2DUP '' <> '' WHILE )opt
: ['] n-jz, (2DUP-rel-WHILE) ;opt
252 opt( '' 2DUP '' < '' WHILE )opt: ['] n-jnl
, (2DUP-rel-WHILE) ;opt
253 opt
( '' 2DUP '' > '' WHILE )opt
: ['] n-jng, (2DUP-rel-WHILE) ;opt
254 opt( '' 2DUP '' <= '' WHILE )opt: ['] n-jnle
, (2DUP-rel-WHILE) ;opt
255 opt
( '' 2DUP '' >= '' WHILE )opt
: ['] n-jnge, (2DUP-rel-WHILE) ;opt
257 opt( '' OVER '' @ )opt:
266 opt( '' OVER '' ! )opt:
275 opt( '' DUP '' 1- )opt:
284 : (#_log_IF) ( log-xt -- )
285 0 opt-getlit \ xt x rel?
295 : (_log_IF
) ( log
-xt
-- )
305 opt( '' OR '' IF )opt: ['] or, (_log_IF
) ;opt
306 opt
( '' AND '' IF )opt
: ['] test, (_log_IF) ;opt
307 opt( ''# '' OR '' IF )opt: ['] or, (#_log_IF) ;opt
308 opt
( ''# '' AND '' IF )opt: ['] test, (#_log_IF) ;opt
310 opt( '' DUP '' CELL+ '' @ )opt: