Skip to content

Commit 9bd211e

Browse files
committed
Added some optimizing to JIT
1 parent 00bca4f commit 9bd211e

File tree

2 files changed

+118
-71
lines changed

2 files changed

+118
-71
lines changed

Benchmarks/Sieve/BYTEMAGSIEVE-JIT.FTH

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ JIT: DO-PRIME
2424
FLAGS SIZE $0101 FILLW ( set array )
2525
0 ( counter )
2626
SIZE 0
27-
DO FLAGS I + C@
27+
DO I FLAGS + C@
2828
IF
2929
I 2* 3 + DUP I +
3030
BEGIN

LIB.ITC/JIT-III.FTH

Lines changed: 117 additions & 70 deletions
Original file line numberDiff line numberDiff line change
@@ -25,25 +25,26 @@ ONLY FORTH ALSO ASSEMBLER ALSO FORTH DEFINITIONS
2525

2626
HERE
2727

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 ;
3434

3535
8 LIFO: CS \ small CONTROL FLOW STACK for loops and branching
3636
: >CS ( n -- ) CS PUSH ;
3737
: CS> ( -- n ) CS POP ;
3838
: 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" ;
4040

4141
: FORTH-COMPILER ['] <INTERP> 'IV ! ;
4242

4343
: ABORT" ( ? --) \ restores normal Forth interpreter
4444
DUP IF FORTH-COMPILER
45-
/LIT ( collapse litstk)
46-
THEN POSTPONE ABORT" ; IMMEDIATE
45+
/ARGS ( collapse ARGSTK)
46+
POSTPONE ABORT"
47+
THEN ; IMMEDIATE
4748

4849
HEX
4950
\ *** changed for kernel V2.69 ***
@@ -79,17 +80,32 @@ CODE + A136 , NEXT, ENDCODE
7980
HEX
8081
: 1-, ( n -- n') COMPILES 1- ; \ TOS DEC,
8182

82-
8383
\ ================================================
8484
\ ATTEMPT TO OPTIMIZE DROP/DUP sequences
8585

8686
VARIABLE TOSFREE \ TRUE = TOS REGISTER IS FREE TO USE
8787

8888
: DUP, COMPILES DUP TOSFREE ON ;
8989
: DROP, COMPILES DROP TOSFREE OFF ;
90-
\ =================================================
9190

91+
: LOOKBACK ( n -- u) CELLS NEGATE HERE + @ ; \ read existing code
92+
: REMOVE ( n -- ) CELLS NEGATE ALLOT ; \ removes cells of code
9293

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
93109
: LIT, ( n -- ) COMPILES DUP 0204 , , ; \ LI R4,<n>
94110

95111
\ store a byte offset in odd byte of addr.
@@ -172,65 +188,54 @@ VARIABLE XT-TYPE \ future ...
172188
: ISUSER 3 XT-TYPE ! ;
173189
: ISCODE 4 XT-TYPE ! ;
174190

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
185193

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
197196

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
208200

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
220204

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
232215

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
234239
: OPT-CODE,
235240
DUP
236241
CASE
@@ -239,10 +244,25 @@ VARIABLE XT-TYPE \ future ...
239244

240245
['] ! OF OPT!, ENDOF
241246
['] C! OF OPTC!, ENDOF
247+
248+
['] + OF OPT+, ENDOF
249+
242250
CODE, \ default, compile kernel code
243251
ENDCASE
244252
;
245253

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+
246266
: JITCOMPILE, ( xt -- )
247267
DUP CODE?
248268
IF
@@ -286,7 +306,7 @@ VARIABLE JSTATE
286306
ALSO JITS \ put JITS VOCABULARY first in search order
287307
CODE
288308
JSTATE ON
289-
/LIT \ clear the literal stack
309+
/ARGS \ clear the literal stack
290310
JIT-COMPILER
291311
;
292312

@@ -295,22 +315,49 @@ VARIABLE JSTATE
295315
FORTH-COMPILER
296316
JSTATE OFF
297317
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
299319
?CS \ check control flow stack
300320
ENDCODE
301321
; IMMEDIATE
302322

303323
HERE SWAP - SPACE DECIMAL . .( bytes)
304324

325+
326+
\ test program
305327
VARIABLE X
306328
VARIABLE Y
329+
VARIABLE Z
330+
307331
HEX
308332
JIT: TEST1
309333
FFFF 0
310334
DO
311-
X C@ DROP
335+
I X !
336+
X C@ Y !
337+
Y @ Z !
312338
LOOP
313339
;JIT
314340

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

Comments
 (0)