version 1.133, 2003/03/08 19:52:05
|
version 1.143, 2003/08/27 12:13:49
|
Line 1
|
Line 1
|
\ converts primitives to, e.g., C code |
\ converts primitives to, e.g., C code |
|
|
\ Copyright (C) 1995,1996,1997,1998,2000 Free Software Foundation, Inc. |
\ Copyright (C) 1995,1996,1997,1998,2000,2003 Free Software Foundation, Inc. |
|
|
\ This file is part of Gforth. |
\ This file is part of Gforth. |
|
|
Line 51
|
Line 51
|
\ (stack-in-index-xt and a test for stack==instruction-stream); there |
\ (stack-in-index-xt and a test for stack==instruction-stream); there |
\ should be only one. |
\ should be only one. |
|
|
|
\ for backwards compatibility, jaw |
|
require compat/strcomp.fs |
|
|
warnings off |
warnings off |
|
|
|
\ redefinitions of kernel words not present in gforth-0.6.1 |
|
: latestxt lastcfa @ ; |
|
: latest last @ ; |
|
|
[IFUNDEF] try |
[IFUNDEF] try |
include startup.fs |
include startup.fs |
[THEN] |
[THEN] |
Line 322 variable name-line
|
Line 329 variable name-line
|
2variable name-filename |
2variable name-filename |
2variable last-name-filename |
2variable last-name-filename |
Variable function-number 0 function-number ! |
Variable function-number 0 function-number ! |
|
Variable function-old 0 function-old ! |
|
: function-diff ( n -- ) |
|
." GROUPADD(" function-number @ function-old @ - 0 .r ." )" cr |
|
function-number @ function-old ! ; |
|
: forth-fdiff ( -- ) |
|
function-number @ function-old @ - 0 .r ." groupadd" cr |
|
function-number @ function-old ! ; |
|
|
\ a few more set ops |
\ a few more set ops |
|
|
Line 608 wordlist constant type-names \ this is h
|
Line 622 wordlist constant type-names \ this is h
|
get-current type-names set-current |
get-current type-names set-current |
stack-type 2dup nextname stack-type-name |
stack-type 2dup nextname stack-type-name |
set-current |
set-current |
stack-pointer lastxt >body stack-name nextname make-stack ; |
stack-pointer latestxt >body stack-name nextname make-stack ; |
|
|
stack inst-stream IP Cell |
stack inst-stream IP Cell |
' inst-in-index inst-stream stack-in-index-xt ! |
' inst-in-index inst-stream stack-in-index-xt ! |
Line 862 variable tail-nextp2 \ xt to execute for
|
Line 876 variable tail-nextp2 \ xt to execute for
|
endif |
endif |
." }" cr ; |
." }" cr ; |
|
|
|
: prim-branch? { prim -- f } |
|
\ true if prim is a branch or super-end |
|
prim prim-c-code 2@ s" SET_IP" search nip nip 0<> ; |
|
|
: output-superend ( -- ) |
: output-superend ( -- ) |
\ output flag specifying whether the current word ends a dynamic superinst |
\ output flag specifying whether the current word ends a dynamic superinst |
prim prim-c-code 2@ s" SET_IP" search nip nip |
prim prim-branch? |
prim prim-c-code 2@ s" SUPER_END" search nip nip or 0<> |
prim prim-c-code 2@ s" SUPER_END" search nip nip 0<> or |
prim prim-c-code 2@ s" SUPER_CONTINUE" search nip nip 0= and |
prim prim-c-code 2@ s" SUPER_CONTINUE" search nip nip 0= and |
negate 0 .r ." , /* " prim prim-name 2@ type ." */" cr ; |
negate 0 .r ." , /* " prim prim-name 2@ type ." */" cr ; |
|
|
Line 939 variable tail-nextp2 \ xt to execute for
|
Line 957 variable tail-nextp2 \ xt to execute for
|
( primitive-number @ . ." alias " ) ." Primitive " prim prim-name 2@ type cr ; |
( primitive-number @ . ." alias " ) ." Primitive " prim prim-name 2@ type cr ; |
|
|
: output-c-prim-num ( -- ) |
: output-c-prim-num ( -- ) |
." #define N_" prim prim-c-name 2@ type prim prim-num @ 8 + 4 .r cr ; |
." N_" prim prim-c-name 2@ type ." ," cr ; |
|
|
: output-forth ( -- ) |
: output-forth ( -- ) |
prim prim-forth-code @ 0= |
prim prim-forth-code @ 0= |
Line 1159 variable tail-nextp2 \ xt to execute for
|
Line 1177 variable tail-nextp2 \ xt to execute for
|
: print-item { n stack -- } |
: print-item { n stack -- } |
\ print nth stack item name |
\ print nth stack item name |
stack stack-type @ type-c-name 2@ type space |
stack stack-type @ type-c-name 2@ type space |
." _" stack stack-pointer 2@ type n 0 .r ; |
." MAYBE_UNUSED _" stack stack-pointer 2@ type n 0 .r ; |
|
|
: print-declarations-combined ( -- ) |
: print-declarations-combined ( -- ) |
max-stacks 0 ?do |
max-stacks 0 ?do |
Line 1264 variable tail-nextp2 \ xt to execute for
|
Line 1282 variable tail-nextp2 \ xt to execute for
|
\ int loads; /* number of stack loads */ |
\ int loads; /* number of stack loads */ |
\ int stores; /* number of stack stores */ |
\ int stores; /* number of stack stores */ |
\ int updates; /* number of stack pointer updates */ |
\ int updates; /* number of stack pointer updates */ |
|
\ int offset; /* offset into super2 table */ |
\ int length; /* number of components */ |
\ int length; /* number of components */ |
\ int *components; /* array of vm_prim indexes of components */ |
|
\ }; |
\ }; |
|
|
\ How do you know which primitive or combined instruction this |
\ How do you know which primitive or combined instruction this |
\ structure refers to? By the order of cost structures, as in most |
\ structure refers to? By the order of cost structures, as in most |
\ other cases. |
\ other cases. |
|
|
|
: super2-length ( -- n ) |
|
combined if |
|
num-combined @ |
|
else |
|
1 |
|
endif ; |
|
|
: compute-costs { p -- nloads nstores nupdates } |
: compute-costs { p -- nloads nstores nupdates } |
\ compute the number of loads, stores, and stack pointer updates |
\ compute the number of loads, stores, and stack pointer updates |
\ of a primitive or combined instruction; does not take TOS |
\ of a primitive or combined instruction; does not take TOS |
\ caching into account, nor that IP updates are combined with |
\ caching into account |
\ other stuff |
|
0 max-stacks 0 +do |
0 max-stacks 0 +do |
p prim-stacks-in i th @ + |
p prim-stacks-in i th @ + |
loop |
loop |
|
super2-length 1- - \ don't count instruction fetches of subsumed insts |
0 max-stacks 0 +do |
0 max-stacks 0 +do |
p prim-stacks-out i th @ + |
p prim-stacks-out i th @ + |
loop |
loop |
0 max-stacks 0 +do |
0 max-stacks 1 +do \ don't count ip updates, therefore "1 +do" |
p prim-stacks-in i th @ p prim-stacks-out i th @ <> - |
p prim-stacks-in i th @ p prim-stacks-out i th @ <> - |
loop ; |
loop ; |
|
|
: output-num-part ( p -- ) |
: output-num-part ( p -- ) |
prim-num @ 4 .r ." ," ; |
." N_" prim-c-name 2@ type ." ," ; |
|
\ prim-num @ 4 .r ." ," ; |
|
|
|
: output-name-comment ( -- ) |
|
." /* " prim prim-name 2@ type ." */" ; |
|
|
|
variable offset-super2 0 offset-super2 ! \ offset into the super2 table |
|
|
|
: output-costs-prefix ( -- ) |
|
." {" prim compute-costs |
|
rot 2 .r ." ," swap 2 .r ." ," 2 .r ." , " |
|
prim prim-branch? negate . ." ," ; |
|
|
|
: output-costs-gforth-simple ( -- ) |
|
output-costs-prefix |
|
prim output-num-part |
|
1 2 .r ." }," |
|
output-name-comment |
|
cr ; |
|
|
|
: output-costs-gforth-combined ( -- ) |
|
output-costs-prefix |
|
." N_START_SUPER+" offset-super2 @ 5 .r ." ," |
|
super2-length dup 2 .r ." }," offset-super2 +! |
|
output-name-comment |
|
cr ; |
|
|
: output-costs ( -- ) |
: output-costs ( -- ) |
|
\ description of superinstructions and simple instructions |
." {" prim compute-costs |
." {" prim compute-costs |
rot 2 .r ." ," swap 2 .r ." ," 2 .r ." ," |
rot 2 .r ." ," swap 2 .r ." ," 2 .r ." ," |
|
offset-super2 @ 5 .r ." ," |
|
super2-length dup 2 .r ." }," offset-super2 +! |
|
output-name-comment |
|
cr ; |
|
|
|
: output-super2 ( -- ) |
|
\ table of superinstructions without requirement for existing prefixes |
combined if |
combined if |
num-combined @ 2 .r |
['] output-num-part map-combined |
." , ((int []){" ['] output-num-part map-combined ." })}, /* " |
|
else |
else |
." 1, ((int []){" prim prim-num @ 4 .r ." })}, /* " |
prim output-num-part |
endif |
endif |
prim prim-name 2@ type ." */" |
output-name-comment |
cr ; |
cr ; |
|
|
\ the parser |
\ the parser |
|
|
Line 1415 Variable c-flag
|
Line 1472 Variable c-flag
|
)) <- c-comment ( -- ) |
)) <- c-comment ( -- ) |
|
|
(( ` - nonl ** {{ |
(( ` - nonl ** {{ |
forth-flag @ IF ." [ELSE]" cr THEN |
forth-flag @ IF forth-fdiff ." [ELSE]" cr THEN |
c-flag @ IF ." #else" cr THEN }} |
c-flag @ IF |
|
function-diff |
|
." #else /* " function-number @ 0 .r ." */" cr THEN }} |
)) <- else-comment |
)) <- else-comment |
|
|
(( ` + {{ start }} nonl ** {{ end |
(( ` + {{ start }} nonl ** {{ end |
dup |
dup |
IF c-flag @ |
IF c-flag @ |
IF ." #ifdef HAS_" bounds ?DO I c@ toupper emit LOOP cr |
IF |
|
function-diff |
|
." #ifdef HAS_" bounds ?DO I c@ toupper emit LOOP cr |
THEN |
THEN |
forth-flag @ |
forth-flag @ |
IF ." has? " type ." [IF]" cr THEN |
IF forth-fdiff ." has? " type ." [IF]" cr THEN |
ELSE 2drop |
ELSE 2drop |
c-flag @ IF ." #endif" cr THEN |
c-flag @ IF |
forth-flag @ IF ." [THEN]" cr THEN |
function-diff ." #endif" cr THEN |
|
forth-flag @ IF forth-fdiff ." [THEN]" cr THEN |
THEN }} |
THEN }} |
)) <- if-comment |
)) <- if-comment |
|
|
(( (( ` g || ` G )) {{ start }} nonl ** |
(( (( ` g || ` G )) {{ start }} nonl ** |
{{ end |
{{ end |
forth-flag @ IF ." group " type cr THEN |
forth-flag @ IF forth-fdiff ." group " type cr THEN |
c-flag @ IF ." GROUP(" type ." , " function-number @ 0 .r ." )" cr THEN }} |
c-flag @ IF function-diff |
|
." GROUP(" type ." , " function-number @ 0 .r ." )" cr THEN }} |
)) <- group-comment |
)) <- group-comment |
|
|
(( (( eval-comment || forth-comment || c-comment || else-comment || if-comment || group-comment )) ?? nonl ** )) <- comment-body |
(( (( eval-comment || forth-comment || c-comment || else-comment || if-comment || group-comment )) ?? nonl ** )) <- comment-body |
Line 1477 Variable c-flag
|
Line 1540 Variable c-flag
|
start }} [ifdef] vmgen c-ident [else] forth-ident [then] {{ end |
start }} [ifdef] vmgen c-ident [else] forth-ident [then] {{ end |
2dup prim prim-name 2! prim prim-c-name 2! }} white ** |
2dup prim prim-name 2! prim prim-c-name 2! }} white ** |
(( ` / white ** {{ start }} c-ident {{ end prim prim-c-name 2! }} white ** )) ?? |
(( ` / white ** {{ start }} c-ident {{ end prim prim-c-name 2! }} white ** )) ?? |
(( simple-primitive || combined-primitive )) {{ 1 function-number +! }} |
(( simple-primitive || combined-primitive )) |
|
{{ 1 function-number +! }} |
)) <- primitive ( -- ) |
)) <- primitive ( -- ) |
|
|
(( (( comment || primitive || nl white ** )) ** eof )) |
(( (( comment || primitive || nl white ** )) ** eof )) |