--- gforth/prims2x.fs 2003/05/15 18:43:15 1.139 +++ gforth/prims2x.fs 2003/08/27 12:13:49 1.143 @@ -329,6 +329,13 @@ variable name-line 2variable name-filename 2variable last-name-filename 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 @@ -869,10 +876,14 @@ variable tail-nextp2 \ xt to execute for endif ." }" 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 flag specifying whether the current word ends a dynamic superinst - prim prim-c-code 2@ s" SET_IP" search nip nip - prim prim-c-code 2@ s" SUPER_END" search nip nip or 0<> + prim prim-branch? + 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 negate 0 .r ." , /* " prim prim-name 2@ type ." */" cr ; @@ -946,7 +957,7 @@ variable tail-nextp2 \ xt to execute for ( primitive-number @ . ." alias " ) ." Primitive " prim prim-name 2@ type cr ; : 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 ( -- ) prim prim-forth-code @ 0= @@ -1166,7 +1177,7 @@ variable tail-nextp2 \ xt to execute for : print-item { n stack -- } \ print nth stack item name 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 ( -- ) max-stacks 0 ?do @@ -1302,13 +1313,33 @@ variable tail-nextp2 \ xt to execute for loop ; : 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 ( -- ) \ description of superinstructions and simple instructions ." {" prim compute-costs @@ -1441,27 +1472,33 @@ Variable c-flag )) <- c-comment ( -- ) (( ` - nonl ** {{ - forth-flag @ IF ." [ELSE]" cr THEN - c-flag @ IF ." #else" cr THEN }} + forth-flag @ IF forth-fdiff ." [ELSE]" cr THEN + c-flag @ IF + function-diff + ." #else /* " function-number @ 0 .r ." */" cr THEN }} )) <- else-comment (( ` + {{ start }} nonl ** {{ end dup 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 forth-flag @ - IF ." has? " type ." [IF]" cr THEN + IF forth-fdiff ." has? " type ." [IF]" cr THEN ELSE 2drop - c-flag @ IF ." #endif" cr THEN - forth-flag @ IF ." [THEN]" cr THEN + c-flag @ IF + function-diff ." #endif" cr THEN + forth-flag @ IF forth-fdiff ." [THEN]" cr THEN THEN }} )) <- if-comment (( (( ` g || ` G )) {{ start }} nonl ** {{ end - forth-flag @ IF ." group " type cr THEN - c-flag @ IF ." GROUP(" type ." , " function-number @ 0 .r ." )" cr THEN }} + forth-flag @ IF forth-fdiff ." group " type cr THEN + c-flag @ IF function-diff + ." GROUP(" type ." , " function-number @ 0 .r ." )" cr THEN }} )) <- group-comment (( (( eval-comment || forth-comment || c-comment || else-comment || if-comment || group-comment )) ?? nonl ** )) <- comment-body