@@ -25,25 +25,26 @@ ONLY FORTH ALSO ASSEMBLER ALSO FORTH DEFINITIONS
25
25
26
26
HERE
27
27
28
- 10 LIFO: LITSTK
29
- : >LIT LITSTK PUSH ;
30
- : LIT > LITSTK POP ;
31
- : LIT ? ( -- n) LITSTK STACK-DEPTH ;
32
- : /LIT LITSTK DUP @ SWAP CELL+ ! ;
33
- : .LS LIT ? 0 DO LIT > U. LOOP ;
28
+ 10 LIFO: ARGSTK
29
+ : >ARG ARGSTK PUSH ;
30
+ : ARG > ARGSTK POP ;
31
+ : ARG ? ( -- n) ARGSTK STACK-DEPTH ;
32
+ : /ARGS ARGSTK DUP @ SWAP CELL+ ! ;
33
+ : .ARGS ARG ? 0 DO ARG > U. LOOP ;
34
34
35
35
8 LIFO: CS \ small CONTROL FLOW STACK for loops and branching
36
36
: >CS ( n -- ) CS PUSH ;
37
37
: CS> ( -- n ) CS POP ;
38
38
: CS>SWAP ( -- ) CS> CS> SWAP >CS >CS ;
39
- : ?CS CS STACK-DEPTH ABORT" Un-match IF or loop words" ;
39
+ : ?CS CS STACK-DEPTH ABORT" Un-matched IF or loop words" ;
40
40
41
41
: FORTH-COMPILER ['] <INTERP> 'IV ! ;
42
42
43
43
: ABORT" ( ? --) \ restores normal Forth interpreter
44
44
DUP IF FORTH-COMPILER
45
- /LIT ( collapse litstk)
46
- THEN POSTPONE ABORT" ; IMMEDIATE
45
+ /ARGS ( collapse ARGSTK)
46
+ POSTPONE ABORT"
47
+ THEN ; IMMEDIATE
47
48
48
49
HEX
49
50
\ *** changed for kernel V2.69 ***
@@ -79,17 +80,32 @@ CODE + A136 , NEXT, ENDCODE
79
80
HEX
80
81
: 1-, ( n -- n') COMPILES 1- ; \ TOS DEC,
81
82
82
-
83
83
\ ================================================
84
84
\ ATTEMPT TO OPTIMIZE DROP/DUP sequences
85
85
86
86
VARIABLE TOSFREE \ TRUE = TOS REGISTER IS FREE TO USE
87
87
88
88
: DUP, COMPILES DUP TOSFREE ON ;
89
89
: DROP, COMPILES DROP TOSFREE OFF ;
90
- \ =================================================
91
90
91
+ : LOOKBACK ( n -- u) CELLS NEGATE HERE + @ ; \ read existing code
92
+ : REMOVE ( n -- ) CELLS NEGATE ALLOT ; \ removes cells of code
92
93
94
+ HEX
95
+ C136 CONSTANT "DROP" \ *SP+ R4 MOV,
96
+
97
+ : ?DUP,
98
+ 1 LOOKBACK "DROP" =
99
+ IF 1 REMOVE TOSFREE ON
100
+ ELSE DUP,
101
+ THEN
102
+ ;
103
+
104
+
105
+ \ =================================================
106
+
107
+ HEX
108
+ \ compile code to load TOS ( r4 ) with n
93
109
: LIT, ( n -- ) COMPILES DUP 0204 , , ; \ LI R4,<n>
94
110
95
111
\ store a byte offset in odd byte of addr.
@@ -172,65 +188,54 @@ VARIABLE XT-TYPE \ future ...
172
188
: ISUSER 3 XT-TYPE ! ;
173
189
: ISCODE 4 XT-TYPE ! ;
174
190
175
- : OPT@, ( xT 'XT)
176
- LIT? 0=
177
- IF CODE, \ if not literal found, the argument is already on the stack
178
- ELSE
179
- DROP \ don't need xt of kernel code.
180
- \ this is the optimized code
181
- DUP,
182
- LIT> @@ TOS MOV, \ compile symbolic addressing code
183
- THEN
184
- ;
191
+ : OPTIMIZER: : ;
192
+ : ;OPTIMIZER POSTPONE CODE, POSTPONE ; ; IMMEDIATE
185
193
186
- : OPTC@, ( xT 'XT)
187
- LIT? 0=
188
- IF CODE, \ if not literal found, the argument is already on the stack
189
- ELSE
190
- DROP \ don't need xt of kernel code.
191
- \ this is the optimized code
192
- DUP,
193
- LIT> @@ TOS MOVB, \ compile symbolic addressing code
194
- TOS 8 SRA,
195
- THEN
196
- ;
194
+ : CASE: POSTPONE IF POSTPONE DROP ; IMMEDIATE
195
+ : ;CASE POSTPONE EXIT POSTPONE THEN ; IMMEDIATE
197
196
198
- : OPT!,
199
- LIT? 0=
200
- IF CODE,
201
- ELSE
202
- DROP \ don't need xt of kernel code.
203
- \ this is the optimized code
204
- TOS LIT> @@ MOV, \ compile stack-> memory instruction
205
- DROP, \ to refill TOS
206
- THEN
207
- ;
197
+ OPTIMIZER: OPT@, ( xt --)
198
+ ARG? CASE: ?DUP, ARG> @@ TOS MOV, ;CASE
199
+ ;OPTIMIZER
208
200
209
- : OPTC!,
210
- LIT? 0=
211
- IF CODE,
212
- ELSE
213
- DROP \ don't need xt of kernel code.
214
- \ this is the optimized code
215
- 1 (SP) LIT> @@ MOVB, \ 26
216
- SP INCT, \ 10 inc. stack pointer by 2
217
- DROP, \ to refill TOS
218
- THEN
219
- ;
201
+ OPTIMIZER: OPTC@, ( xT 'XT)
202
+ ARG? CASE: ?DUP, ARG> @@ TOS MOVB, TOS 8 SRA, ;CASE
203
+ ;OPTIMIZER
220
204
221
- : OTHERS, ( xt -- ) \
222
- DUP
223
- @ \ FETCH the "executor" addres
224
- CASE \ compare to executor words
225
- ['] DOVAR OF >BODY >LIT ENDOF
226
- ['] DOCON OF >BODY @ LIT, ENDOF
227
- ['] DOUSER @ OF EXECUTE LIT, ENDOF
228
- \ ['] DOCOL OF >BODY RECURSE ENDOF \ future? :-)
229
- TRUE ABORT" Can't optimize word"
230
- ENDCASE
231
- ;
205
+ OPTIMIZER: OPT!,
206
+ ARG? CASE: TOS ARG> @@ MOV, DROP, ;CASE
207
+ ;OPTIMIZER
208
+
209
+
210
+ OPTIMIZER: OPTC!,
211
+ ARG? CASE:
212
+ 1 (SP) ARG> @@ MOVB, SP INCT, DROP,
213
+ ;CASE
214
+ ;OPTIMIZER
232
215
233
- \ specific CODE word and optimizers , otherwise just compile kernel code
216
+ 0204 CONSTANT "LI" \ load imm. to R4
217
+
218
+ OPTIMIZER: OPT+, ( xt -- )
219
+ \ 2 literal number added togther
220
+ 2 LOOKBACK "LI" = 6 LOOKBACK "LI" = AND
221
+ CASE:
222
+ 1 LOOKBACK 5 LOOKBACK + ( -- sum) \ read literals and add them
223
+ 8 REMOVE \ get rid of old code
224
+ ( -- sum) LIT, \ compile sum as a literal
225
+ ;CASE
226
+
227
+ \ case of literal and address argument (ie: a variable)
228
+ 2 LOOKBACK "LI" = ARG? AND
229
+ CASE:
230
+ 1 LOOKBACK ARG> + ( sum ) \ literal + address
231
+ 4 REMOVE
232
+ LIT,
233
+ ;CASE
234
+
235
+ ;OPTIMIZER
236
+
237
+ \ specific CODE word and optimizers
238
+ \ If the case statemente can't find it, just compile kernel code
234
239
: OPT-CODE,
235
240
DUP
236
241
CASE
@@ -239,10 +244,25 @@ VARIABLE XT-TYPE \ future ...
239
244
240
245
['] ! OF OPT!, ENDOF
241
246
['] C! OF OPTC!, ENDOF
247
+
248
+ ['] + OF OPT+, ENDOF
249
+
242
250
CODE, \ default, compile kernel code
243
251
ENDCASE
244
252
;
245
253
254
+ : OTHERS, ( xt -- ) \
255
+ DUP
256
+ @ \ FETCH the "executor" addres
257
+ CASE \ compare to executor words
258
+ ['] DOVAR OF >BODY >ARG ENDOF \ push address onto literal stack
259
+ ['] DOCON OF >BODY @ LIT, ENDOF
260
+ ['] DOUSER @ OF EXECUTE LIT, ENDOF
261
+ \ ['] DOCOL OF >BODY RECURSE ENDOF \ future? :-)
262
+ TRUE ABORT" Can't optimize word"
263
+ ENDCASE
264
+ ;
265
+
246
266
: JITCOMPILE, ( xt -- )
247
267
DUP CODE?
248
268
IF
@@ -286,7 +306,7 @@ VARIABLE JSTATE
286
306
ALSO JITS \ put JITS VOCABULARY first in search order
287
307
CODE
288
308
JSTATE ON
289
- /LIT \ clear the literal stack
309
+ /ARGS \ clear the literal stack
290
310
JIT-COMPILER
291
311
;
292
312
@@ -295,22 +315,49 @@ VARIABLE JSTATE
295
315
FORTH-COMPILER
296
316
JSTATE OFF
297
317
NEXT, \ compile NEXT at end of new code word
298
- LIT ? IF CR ." WARNING: LIT stack contains " CR ." >> " .LS THEN
318
+ ARG ? IF CR ." WARNING: LIT stack contains " CR ." >> " .ARGS THEN
299
319
?CS \ check control flow stack
300
320
ENDCODE
301
321
; IMMEDIATE
302
322
303
323
HERE SWAP - SPACE DECIMAL . .( bytes)
304
324
325
+
326
+ \ test program
305
327
VARIABLE X
306
328
VARIABLE Y
329
+ VARIABLE Z
330
+
307
331
HEX
308
332
JIT: TEST1
309
333
FFFF 0
310
334
DO
311
- X C@ DROP
335
+ I X !
336
+ X C@ Y !
337
+ Y @ Z !
312
338
LOOP
313
339
;JIT
314
340
315
- ' TEST1 >BODY
316
- .S
341
+ \ ' TEST1 >BODY
342
+ \ .S
343
+ SP@ SP!
344
+
345
+
346
+ JIT: TEST2
347
+ 2 3 +
348
+ ;JIT
349
+
350
+
351
+
352
+
353
+
354
+ \ DEBUG VERSION
355
+ : ;JIT ( JIT-XT -- )
356
+ PREVIOUS \ restore previous search order
357
+ FORTH-COMPILER
358
+ JSTATE OFF
359
+ NEXT, \ compile NEXT at end of new code word
360
+ ARG? IF CR ." WARNING: LIT stack contains " CR ." >> " .ARGS THEN
361
+ ?CS \ check control flow stack
362
+ CR .S
363
+ ; IMMEDIATE
0 commit comments