| \ converts primitives to, e.g., C code |
\ converts primitives to, e.g., C code |
| |
|
| \ Copyright (C) 1995,1996,1997,1998,2000,2003 Free Software Foundation, Inc. |
\ Copyright (C) 1995,1996,1997,1998,2000,2003,2004 Free Software Foundation, Inc. |
| |
|
| \ This file is part of Gforth. |
\ This file is part of Gforth. |
| |
|
| cell% 2* field prim-name |
cell% 2* field prim-name |
| cell% 2* field prim-wordset |
cell% 2* field prim-wordset |
| cell% 2* field prim-c-name |
cell% 2* field prim-c-name |
| |
cell% 2* field prim-c-name-orig \ for reprocessed prims, the original name |
| cell% 2* field prim-doc |
cell% 2* field prim-doc |
| cell% 2* field prim-c-code |
cell% 2* field prim-c-code |
| cell% 2* field prim-forth-code |
cell% 2* field prim-forth-code |
| r> to prim |
r> to prim |
| throw ; |
throw ; |
| |
|
| |
: prim-c-name-2! ( c-addr u -- ) |
| |
2dup prim prim-c-name 2! prim prim-c-name-orig 2! ; |
| |
|
| 1000 constant max-combined |
1000 constant max-combined |
| create combined-prims max-combined cells allot |
create combined-prims max-combined cells allot |
| variable num-combined |
variable num-combined |
| : store-single { item -- } |
: store-single { item -- } |
| item item-stack @ { stack } |
item item-stack @ { stack } |
| store-optimization @ in-part @ 0= and item same-as-in? and |
store-optimization @ in-part @ 0= and item same-as-in? and |
| item item-in-index stack state-in stack-reg 0= and \ in in memory? |
item item-in-index stack state-in stack-reg \ in reg/mem |
| item item-out-index stack state-out stack-reg 0= and \ out in memory? |
item item-out-index stack state-out stack-reg = and \ out reg/mem |
| 0= if |
0= if |
| item really-store-single cr |
item really-store-single cr |
| endif ; |
endif ; |
| default-ss s state-sss i th ! |
default-ss s state-sss i th ! |
| loop ; |
loop ; |
| |
|
| |
: .state ( state -- ) |
| |
0 >body - >name .name ; |
| |
|
| : set-ss ( ss stack state -- ) |
: set-ss ( ss stack state -- ) |
| state-sss swap stack-number @ th ! ; |
state-sss swap stack-number @ th ! ; |
| |
|
| |
|
| : output-label2 ( -- ) |
: output-label2 ( -- ) |
| ." LABEL2(" prim prim-c-name 2@ type ." )" cr |
." LABEL2(" prim prim-c-name 2@ type ." )" cr |
| ." NEXT_P2;" cr ; |
." NEXT_P1_5;" cr |
| |
." LABEL3(" prim prim-c-name 2@ type ." )" cr |
| |
." DO_GOTO;" cr ; |
| |
|
| : output-c-tail1 { xt -- } |
: output-c-tail1 { xt -- } |
| \ the final part of the generated C code, with xt printing LABEL2 or not. |
\ the final part of the generated C code, with xt printing LABEL2 or not. |
| ." LABEL(" prim prim-c-name 2@ type ." )" ; |
." LABEL(" prim prim-c-name 2@ type ." )" ; |
| |
|
| : output-c ( -- ) |
: output-c ( -- ) |
| print-entry ." /* " prim prim-name 2@ type ." ( " prim prim-stack-string 2@ type ." ) */" cr |
print-entry ." /* " prim prim-name 2@ type |
| |
." ( " prim prim-stack-string 2@ type ." ) " |
| |
state-in .state ." -- " state-out .state ." */" cr |
| ." /* " prim prim-doc 2@ type ." */" cr |
." /* " prim prim-doc 2@ type ." */" cr |
| ." NAME(" quote prim prim-name 2@ type quote ." )" cr \ debugging |
." NAME(" quote prim prim-name 2@ type quote ." )" cr \ debugging |
| ." {" cr |
." {" cr |
| : output-alias ( -- ) |
: output-alias ( -- ) |
| ( primitive-number @ . ." alias " ) ." Primitive " prim prim-name 2@ type cr ; |
( primitive-number @ . ." alias " ) ." Primitive " prim prim-name 2@ type cr ; |
| |
|
| : output-c-prim-num ( -- ) |
defer output-c-prim-num ( -- ) |
| |
|
| |
:noname ( -- ) |
| ." N_" prim prim-c-name 2@ type ." ," cr ; |
." N_" prim prim-c-name 2@ type ." ," cr ; |
| |
is output-c-prim-num |
| |
|
| : output-forth ( -- ) |
: output-forth ( -- ) |
| prim prim-forth-code @ 0= |
prim prim-forth-code @ 0= |
| \ This is intended as initializer for a structure like this |
\ This is intended as initializer for a structure like this |
| |
|
| \ struct cost { |
\ struct cost { |
| \ int loads; /* number of stack loads */ |
\ char loads; /* number of stack loads */ |
| \ int stores; /* number of stack stores */ |
\ char stores; /* number of stack stores */ |
| \ int updates; /* number of stack pointer updates */ |
\ char updates; /* number of stack pointer updates */ |
| \ int offset; /* offset into super2 table */ |
\ char branch; /* is it a branch (SET_IP) */ |
| \ int length; /* number of components */ |
\ char state_in; /* state on entry */ |
| |
\ char state_out; /* state on exit */ |
| |
\ short offset; /* offset into super2 table */ |
| |
\ char length; /* number of components */ |
| \ }; |
\ }; |
| |
|
| \ How do you know which primitive or combined instruction this |
\ How do you know which primitive or combined instruction this |
| loop ; |
loop ; |
| |
|
| : output-num-part ( p -- ) |
: output-num-part ( p -- ) |
| ." N_" prim-c-name 2@ type ." ," ; |
." N_" prim-c-name-orig 2@ type ." ," ; |
| \ prim-num @ 4 .r ." ," ; |
\ prim-num @ 4 .r ." ," ; |
| |
|
| : output-name-comment ( -- ) |
: output-name-comment ( -- ) |
| rot 2 .r ." ," swap 2 .r ." ," 2 .r ." , " |
rot 2 .r ." ," swap 2 .r ." ," 2 .r ." , " |
| prim prim-branch? negate . ." ," |
prim prim-branch? negate . ." ," |
| state-in state-number @ 2 .r ." ," |
state-in state-number @ 2 .r ." ," |
| state-out state-number @ 2 .r ." ," ; |
state-out state-number @ 2 .r ." ," |
| |
inst-stream stack-in @ 1 .r ." ," |
| |
; |
| |
|
| : output-costs-gforth-simple ( -- ) |
: output-costs-gforth-simple ( -- ) |
| output-costs-prefix |
output-costs-prefix |
| output-name-comment |
output-name-comment |
| cr ; |
cr ; |
| |
|
| : output-costs ( -- ) |
\ : output-costs ( -- ) |
| \ description of superinstructions and simple instructions |
\ \ 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 ." ," |
\ offset-super2 @ 5 .r ." ," |
| super2-length dup 2 .r ." }," offset-super2 +! |
\ super2-length dup 2 .r ." ," offset-super2 +! |
| |
\ inst-stream stack-in @ 1 .r ." }," |
| |
\ output-name-comment |
| |
\ cr ; |
| |
|
| |
: output-super2-simple ( -- ) |
| |
prim prim-c-name 2@ prim prim-c-name-orig 2@ d= if |
| |
prim output-num-part |
| output-name-comment |
output-name-comment |
| cr ; |
cr |
| |
endif ; |
| |
|
| : output-super2 ( -- ) |
: output-super2-combined ( -- ) |
| \ table of superinstructions without requirement for existing prefixes |
|
| combined if |
|
| ['] output-num-part map-combined |
['] output-num-part map-combined |
| else |
|
| prim output-num-part |
|
| endif |
|
| output-name-comment |
output-name-comment |
| cr ; |
cr ; |
| |
|
| (( {{ prim create-prim }} |
(( {{ prim create-prim }} |
| ` ( white ** {{ start }} stack-effect {{ end prim prim-stack-string 2! }} ` ) white ** |
` ( white ** {{ start }} stack-effect {{ end prim prim-stack-string 2! }} ` ) white ** |
| (( {{ start }} forth-ident {{ end prim prim-wordset 2! }} white ** |
(( {{ start }} forth-ident {{ end prim prim-wordset 2! }} white ** |
| (( {{ start }} c-ident {{ end prim prim-c-name 2! }} )) ?? |
(( {{ start }} c-ident {{ end 2dup prim-c-name-2! }} )) ?? |
| )) ?? nleof |
)) ?? nleof |
| (( ` " ` " {{ start }} (( noquote ++ ` " )) ++ {{ end 1- prim prim-doc 2! }} ` " white ** nleof )) ?? |
(( ` " ` " {{ start }} (( noquote ++ ` " )) ++ {{ end 1- prim prim-doc 2! }} ` " white ** nleof )) ?? |
| {{ skipsynclines off line @ c-line ! filename 2@ c-filename 2! start }} |
{{ skipsynclines off line @ c-line ! filename 2@ c-filename 2! start }} |
| line @ name-line ! filename 2@ name-filename 2! |
line @ name-line ! filename 2@ name-filename 2! |
| function-number @ prim prim-num ! |
function-number @ prim prim-num ! |
| 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-c-name-2! }} white ** |
| (( ` / white ** {{ start }} c-ident {{ end prim prim-c-name 2! }} white ** )) ?? |
(( ` / white ** {{ start }} c-ident {{ end prim-c-name-2! }} white ** )) ?? |
| (( simple-primitive || combined-primitive )) |
(( simple-primitive || combined-primitive )) |
| {{ 1 function-number +! }} |
{{ 1 function-number +! }} |
| )) <- primitive ( -- ) |
)) <- primitive ( -- ) |