| \ df_.* DFloat * |
\ df_.* DFloat * |
| \ sf_.* SFloat * |
\ sf_.* SFloat * |
| \ xt.* XT |
\ xt.* XT |
| \ wid.* WID |
|
| \ f83name.* F83Name * |
\ f83name.* F83Name * |
| |
|
| |
\E stack data-stack sp Cell |
| |
\E stack fp-stack fp Float |
| |
\E stack return-stack rp Cell |
| |
\E |
| |
\E get-current prefixes set-current |
| |
\E |
| |
\E s" Bool" single data-stack type-prefix f |
| |
\E s" Char" single data-stack type-prefix c |
| |
\E s" Cell" single data-stack type-prefix n |
| |
\E s" Cell" single data-stack type-prefix w |
| |
\E s" UCell" single data-stack type-prefix u |
| |
\E s" DCell" double data-stack type-prefix d |
| |
\E s" UDCell" double data-stack type-prefix ud |
| |
\E s" Float" single fp-stack type-prefix r |
| |
\E s" Cell *" single data-stack type-prefix a_ |
| |
\E s" Char *" single data-stack type-prefix c_ |
| |
\E s" Float *" single data-stack type-prefix f_ |
| |
\E s" DFloat *" single data-stack type-prefix df_ |
| |
\E s" SFloat *" single data-stack type-prefix sf_ |
| |
\E s" Xt" single data-stack type-prefix xt |
| |
\E s" struct F83Name *" single data-stack type-prefix f83name |
| |
\E s" struct Longname *" single data-stack type-prefix longname |
| |
\E |
| |
\E return-stack stack-prefix R: |
| |
\E inst-stream stack-prefix # |
| |
\E |
| |
\E set-current |
| |
|
| \ |
\ |
| \ |
\ |
| \ |
\ |
| \ these m4 macros would collide with identifiers |
\ these m4 macros would collide with identifiers |
| undefine(`index') |
undefine(`index') |
| undefine(`shift') |
undefine(`shift') |
| |
undefine(`symbols') |
| |
|
| |
\g control |
| |
|
| noop ( -- ) gforth |
noop ( -- ) gforth |
| ; |
|
| : |
: |
| ; |
; |
| |
|
| lit ( -- w ) gforth |
lit ( #w -- w ) gforth |
| w = (Cell)NEXT_INST; |
|
| INC_IP(1); |
|
| : |
: |
| r> dup @ swap cell+ >r ; |
r> dup @ swap cell+ >r ; |
| |
|
| ""Perform the semantics represented by the execution token, @i{xt}."" |
""Perform the semantics represented by the execution token, @i{xt}."" |
| ip=IP; |
ip=IP; |
| IF_spTOS(spTOS = sp[0]); |
IF_spTOS(spTOS = sp[0]); |
| |
SUPER_END; |
| EXEC(xt); |
EXEC(xt); |
| |
|
| perform ( a_addr -- ) gforth |
perform ( a_addr -- ) gforth |
| /* and pfe */ |
/* and pfe */ |
| ip=IP; |
ip=IP; |
| IF_spTOS(spTOS = sp[0]); |
IF_spTOS(spTOS = sp[0]); |
| |
SUPER_END; |
| EXEC(*(Xt *)a_addr); |
EXEC(*(Xt *)a_addr); |
| : |
: |
| @ execute ; |
@ execute ; |
| \fhas? skipbranchprims 0= [IF] |
\fhas? skipbranchprims 0= [IF] |
| \+glocals |
\+glocals |
| |
|
| branch-lp+!# ( -- ) gforth branch_lp_plus_store_number |
branch-lp+!# ( #ndisp #nlocals -- ) gforth branch_lp_plus_store_number |
| /* this will probably not be used */ |
/* this will probably not be used */ |
| lp += (Cell)(IP[1]); |
lp += nlocals; |
| goto branch; |
SET_IP((Xt *)(((Cell)(IP-2))+ndisp)); |
| |
|
| \+ |
\+ |
| |
|
| branch ( -- ) gforth |
branch ( #ndisp -- ) gforth |
| branch: |
SET_IP((Xt *)(((Cell)(IP-1))+ndisp)); |
| SET_IP((Xt *)(((Cell)IP)+(Cell)NEXT_INST)); |
|
| : |
: |
| r> dup @ + >r ; |
r> dup @ + >r ; |
| |
|
| \ condbranch(forthname,restline,code,forthcode) |
\ condbranch(forthname,stackeffect,restline,code,forthcode) |
| \ this is non-syntactical: code must open a brace that is closed by the macro |
\ this is non-syntactical: code must open a brace that is closed by the macro |
| define(condbranch, |
define(condbranch, |
| $1 $2 |
$1 ( `#'ndisp $2 ) $3 |
| $3 SET_IP((Xt *)(((Cell)IP)+(Cell)NEXT_INST)); |
$4 SET_IP((Xt *)(((Cell)(IP-1))+ndisp)); |
| TAIL; |
TAIL; |
| } |
} |
| else |
$5 |
| INC_IP(1); |
|
| $4 |
|
| |
|
| \+glocals |
\+glocals |
| |
|
| $1-lp+!# $2_lp_plus_store_number |
$1-lp+!`#' ( `#'ndisp `#'nlocals $2 ) $3_lp_plus_store_number |
| $3 lp += (Cell)(IP[1]); |
$4 lp += nlocals; |
| SET_IP((Xt *)(((Cell)IP)+(Cell)NEXT_INST)); |
SET_IP((Xt *)(((Cell)(IP-2))+ndisp)); |
| TAIL; |
TAIL; |
| } |
} |
| else |
|
| INC_IP(2); |
|
| |
|
| \+ |
\+ |
| ) |
) |
| |
|
| condbranch(?branch,( f -- ) f83 question_branch, |
condbranch(?branch,f --,f83 question_branch, |
| if (f==0) { |
if (f==0) { |
| ,: |
,: |
| 0= dup \ !f !f |
0= dup \ !f !f |
| |
|
| \+xconds |
\+xconds |
| |
|
| ?dup-?branch ( f -- f ) new question_dupe_question_branch |
?dup-?branch ( #ndisp f -- f ) new question_dupe_question_branch |
| ""The run-time procedure compiled by @code{?DUP-IF}."" |
""The run-time procedure compiled by @code{?DUP-IF}."" |
| if (f==0) { |
if (f==0) { |
| sp++; |
sp++; |
| IF_spTOS(spTOS = sp[0]); |
IF_spTOS(spTOS = sp[0]); |
| SET_IP((Xt *)(((Cell)IP)+(Cell)NEXT_INST)); |
SET_IP((Xt *)(((Cell)(IP-1))+ndisp)); |
| NEXT; |
TAIL; |
| } |
} |
| else |
|
| INC_IP(1); |
|
| |
|
| ?dup-0=-?branch ( f -- ) new question_dupe_zero_equals_question_branch |
?dup-0=-?branch ( #ndisp f -- ) new question_dupe_zero_equals_question_branch |
| ""The run-time procedure compiled by @code{?DUP-0=-IF}."" |
""The run-time procedure compiled by @code{?DUP-0=-IF}."" |
| /* the approach taken here of declaring the word as having the stack |
/* the approach taken here of declaring the word as having the stack |
| effect ( f -- ) and correcting for it in the branch-taken case costs a |
effect ( f -- ) and correcting for it in the branch-taken case costs a |
| invocation */ |
invocation */ |
| if (f!=0) { |
if (f!=0) { |
| sp--; |
sp--; |
| SET_IP((Xt *)(((Cell)IP)+(Cell)NEXT_INST)); |
SET_IP((Xt *)(((Cell)(IP-1))+ndisp)); |
| NEXT; |
NEXT; |
| } |
} |
| else |
|
| INC_IP(1); |
|
| |
|
| \+ |
\+ |
| \f[THEN] |
\f[THEN] |
| \fhas? skiploopprims 0= [IF] |
\fhas? skiploopprims 0= [IF] |
| |
|
| condbranch((next),( R:n1 -- R:n2 ) cmFORTH paren_next, |
condbranch((next),R:n1 -- R:n2,cmFORTH paren_next, |
| n2=n1-1; |
n2=n1-1; |
| if (n1) { |
if (n1) { |
| ,: |
,: |
| r> r> dup 1- >r |
r> r> dup 1- >r |
| IF dup @ + >r ELSE cell+ >r THEN ;) |
IF dup @ + >r ELSE cell+ >r THEN ;) |
| |
|
| condbranch((loop),( R:nlimit R:n1 -- R:nlimit R:n2 ) gforth paren_loop, |
condbranch((loop),R:nlimit R:n1 -- R:nlimit R:n2,gforth paren_loop, |
| n2=n1+1; |
n2=n1+1; |
| if (n2 != nlimit) { |
if (n2 != nlimit) { |
| ,: |
,: |
| IF >r 1- >r cell+ >r |
IF >r 1- >r cell+ >r |
| ELSE >r >r dup @ + >r THEN ;) |
ELSE >r >r dup @ + >r THEN ;) |
| |
|
| condbranch((+loop),( n R:nlimit R:n1 -- R:nlimit R:n2 ) gforth paren_plus_loop, |
condbranch((+loop),n R:nlimit R:n1 -- R:nlimit R:n2,gforth paren_plus_loop, |
| /* !! check this thoroughly */ |
/* !! check this thoroughly */ |
| /* sign bit manipulation and test: (x^y)<0 is equivalent to (x<0) != (y<0) */ |
/* sign bit manipulation and test: (x^y)<0 is equivalent to (x<0) != (y<0) */ |
| /* dependent upon two's complement arithmetic */ |
/* dependent upon two's complement arithmetic */ |
| |
|
| \+xconds |
\+xconds |
| |
|
| condbranch((-loop),( u R:nlimit R:n1 -- R:nlimit R:n2 ) gforth paren_minus_loop, |
condbranch((-loop),u R:nlimit R:n1 -- R:nlimit R:n2,gforth paren_minus_loop, |
| UCell olddiff = n1-nlimit; |
UCell olddiff = n1-nlimit; |
| n2=n1-u; |
n2=n1-u; |
| if (olddiff>u) { |
if (olddiff>u) { |
| ,) |
,) |
| |
|
| condbranch((s+loop),( n R:nlimit R:n1 -- R:nlimit R:n2 ) gforth paren_symmetric_plus_loop, |
condbranch((s+loop),n R:nlimit R:n1 -- R:nlimit R:n2,gforth paren_symmetric_plus_loop, |
| ""The run-time procedure compiled by S+LOOP. It loops until the index |
""The run-time procedure compiled by S+LOOP. It loops until the index |
| crosses the boundary between limit and limit-sign(n). I.e. a symmetric |
crosses the boundary between limit and limit-sign(n). I.e. a symmetric |
| version of (+LOOP)."" |
version of (+LOOP)."" |
| : |
: |
| r> swap rot >r >r >r ; |
r> swap rot >r >r >r ; |
| |
|
| (?do) ( nlimit nstart -- R:nlimit R:nstart ) gforth paren_question_do |
(?do) ( #ndisp nlimit nstart -- R:nlimit R:nstart ) gforth paren_question_do |
| if (nstart == nlimit) { |
if (nstart == nlimit) { |
| IF_spTOS(spTOS = sp[0]); |
SET_IP((Xt *)(((Cell)(IP-1))+ndisp)); |
| goto branch; |
TAIL; |
| } |
|
| else { |
|
| INC_IP(1); |
|
| } |
} |
| : |
: |
| 2dup = |
2dup = |
| |
|
| \+xconds |
\+xconds |
| |
|
| (+do) ( nlimit nstart -- R:nlimit R:nstart ) gforth paren_plus_do |
(+do) ( #ndisp nlimit nstart -- R:nlimit R:nstart ) gforth paren_plus_do |
| if (nstart >= nlimit) { |
if (nstart >= nlimit) { |
| IF_spTOS(spTOS = sp[0]); |
SET_IP((Xt *)(((Cell)(IP-1))+ndisp)); |
| goto branch; |
TAIL; |
| } |
|
| else { |
|
| INC_IP(1); |
|
| } |
} |
| : |
: |
| swap 2dup |
swap 2dup |
| cell+ |
cell+ |
| THEN >r ; |
THEN >r ; |
| |
|
| (u+do) ( ulimit ustart -- R:ulimit R:ustart ) gforth paren_u_plus_do |
(u+do) ( #ndisp ulimit ustart -- R:ulimit R:ustart ) gforth paren_u_plus_do |
| if (ustart >= ulimit) { |
if (ustart >= ulimit) { |
| IF_spTOS(spTOS = sp[0]); |
SET_IP((Xt *)(((Cell)(IP-1))+ndisp)); |
| goto branch; |
TAIL; |
| } |
|
| else { |
|
| INC_IP(1); |
|
| } |
} |
| : |
: |
| swap 2dup |
swap 2dup |
| cell+ |
cell+ |
| THEN >r ; |
THEN >r ; |
| |
|
| (-do) ( nlimit nstart -- R:nlimit R:nstart ) gforth paren_minus_do |
(-do) ( #ndisp nlimit nstart -- R:nlimit R:nstart ) gforth paren_minus_do |
| if (nstart <= nlimit) { |
if (nstart <= nlimit) { |
| IF_spTOS(spTOS = sp[0]); |
SET_IP((Xt *)(((Cell)(IP-1))+ndisp)); |
| goto branch; |
TAIL; |
| } |
|
| else { |
|
| INC_IP(1); |
|
| } |
} |
| : |
: |
| swap 2dup |
swap 2dup |
| cell+ |
cell+ |
| THEN >r ; |
THEN >r ; |
| |
|
| (u-do) ( ulimit ustart -- R:ulimit R:ustart ) gforth paren_u_minus_do |
(u-do) ( #ndisp ulimit ustart -- R:ulimit R:ustart ) gforth paren_u_minus_do |
| if (ustart <= ulimit) { |
if (ustart <= ulimit) { |
| IF_spTOS(spTOS = sp[0]); |
SET_IP((Xt *)(((Cell)(IP-1))+ndisp)); |
| goto branch; |
TAIL; |
| } |
|
| else { |
|
| INC_IP(1); |
|
| } |
} |
| : |
: |
| swap 2dup |
swap 2dup |
| |
|
| \ digit is high-level: 0/0% |
\ digit is high-level: 0/0% |
| |
|
| |
\g strings |
| |
|
| move ( c_from c_to ucount -- ) core |
move ( c_from c_to ucount -- ) core |
| ""Copy the contents of @i{ucount} aus at @i{c-from} to |
""Copy the contents of @i{ucount} aus at @i{c-from} to |
| @i{c-to}. @code{move} works correctly even if the two areas overlap."" |
@i{c-to}. @code{move} works correctly even if the two areas overlap."" |
| : |
: |
| tuck - >r + r> dup 0< IF - 0 THEN ; |
tuck - >r + r> dup 0< IF - 0 THEN ; |
| |
|
| |
\g arith |
| |
|
| + ( n1 n2 -- n ) core plus |
+ ( n1 n2 -- n ) core plus |
| n = n1+n2; |
n = n1+n2; |
| |
|
| : |
: |
| over - >r - r> u< ; |
over - >r - r> u< ; |
| |
|
| |
\g internal |
| |
|
| sp@ ( -- a_addr ) gforth sp_fetch |
sp@ ( -- a_addr ) gforth sp_fetch |
| a_addr = sp+1; |
a_addr = sp+1; |
| |
|
| ""The primitive compiled by @code{EXIT}."" |
""The primitive compiled by @code{EXIT}."" |
| SET_IP((Xt *)w); |
SET_IP((Xt *)w); |
| |
|
| |
\g stack |
| |
|
| >r ( w -- R:w ) core to_r |
>r ( w -- R:w ) core to_r |
| : |
: |
| (>r) ; |
(>r) ; |
| |
|
| \f[THEN] |
\f[THEN] |
| |
|
| |
\g hostos |
| |
|
| key-file ( wfileid -- n ) gforth paren_key_file |
key-file ( wfileid -- n ) gforth paren_key_file |
| #ifdef HAS_FILE |
#ifdef HAS_FILE |
| fflush(stdout); |
fflush(stdout); |
| FLUSH_ICACHE(c_addr,u); |
FLUSH_ICACHE(c_addr,u); |
| |
|
| (bye) ( n -- ) gforth paren_bye |
(bye) ( n -- ) gforth paren_bye |
| |
SUPER_END; |
| return (Label *)n; |
return (Label *)n; |
| |
|
| (system) ( c_addr u -- wretval wior ) gforth peren_system |
(system) ( c_addr u -- wretval wior ) gforth peren_system |
| u2 = (c_addr2 == NULL ? 0 : strlen(c_addr2)); |
u2 = (c_addr2 == NULL ? 0 : strlen(c_addr2)); |
| |
|
| open-pipe ( c_addr u wfam -- wfileid wior ) gforth open_pipe |
open-pipe ( c_addr u wfam -- wfileid wior ) gforth open_pipe |
| wfileid=(Cell)popen(cstr(c_addr,u,1),fileattr[wfam]); /* ~ expansion of 1st arg? */ |
wfileid=(Cell)popen(cstr(c_addr,u,1),pfileattr[wfam]); /* ~ expansion of 1st arg? */ |
| wior = IOR(wfileid==0); /* !! the man page says that errno is not set reliably */ |
wior = IOR(wfileid==0); /* !! the man page says that errno is not set reliably */ |
| |
|
| close-pipe ( wfileid -- wretval wior ) gforth close_pipe |
close-pipe ( wfileid -- wretval wior ) gforth close_pipe |
| clearerr((FILE *)wfileid); |
clearerr((FILE *)wfileid); |
| |
|
| read-line ( c_addr u1 wfileid -- u2 flag wior ) file read_line |
read-line ( c_addr u1 wfileid -- u2 flag wior ) file read_line |
| ""this is only for backward compatibility"" |
/* this may one day be replaced with : read-line (read-line) nip ; */ |
| Cell c; |
Cell c; |
| flag=-1; |
flag=-1; |
| for(u2=0; u2<u1; u2++) |
for(u2=0; u2<u1; u2++) |
| \+ |
\+ |
| \+floating |
\+floating |
| |
|
| |
\g floating |
| |
|
| comparisons(f, r1 r2, f_, r1, r2, gforth, gforth, float, gforth) |
comparisons(f, r1 r2, f_, r1, r2, gforth, gforth, float, gforth) |
| comparisons(f0, r, f_zero_, r, 0., float, gforth, float, gforth) |
comparisons(f0, r, f_zero_, r, 0., float, gforth, float, gforth) |
| |
|
| \+ |
\+ |
| \+glocals |
\+glocals |
| |
|
| @local# ( -- w ) gforth fetch_local_number |
@local# ( #noffset -- w ) gforth fetch_local_number |
| w = *(Cell *)(lp+(Cell)NEXT_INST); |
w = *(Cell *)(lp+noffset); |
| INC_IP(1); |
|
| |
|
| @local0 ( -- w ) new fetch_local_zero |
@local0 ( -- w ) new fetch_local_zero |
| w = *(Cell *)(lp+0*sizeof(Cell)); |
w = *(Cell *)(lp+0*sizeof(Cell)); |
| |
|
| \+floating |
\+floating |
| |
|
| f@local# ( -- r ) gforth f_fetch_local_number |
f@local# ( #noffset -- r ) gforth f_fetch_local_number |
| r = *(Float *)(lp+(Cell)NEXT_INST); |
r = *(Float *)(lp+noffset); |
| INC_IP(1); |
|
| |
|
| f@local0 ( -- r ) new f_fetch_local_zero |
f@local0 ( -- r ) new f_fetch_local_zero |
| r = *(Float *)(lp+0*sizeof(Float)); |
r = *(Float *)(lp+0*sizeof(Float)); |
| |
|
| \+ |
\+ |
| |
|
| laddr# ( -- c_addr ) gforth laddr_number |
laddr# ( #noffset -- c_addr ) gforth laddr_number |
| /* this can also be used to implement lp@ */ |
/* this can also be used to implement lp@ */ |
| c_addr = (Char *)(lp+(Cell)NEXT_INST); |
c_addr = (Char *)(lp+noffset); |
| INC_IP(1); |
|
| |
|
| lp+!# ( -- ) gforth lp_plus_store_number |
lp+!# ( #noffset -- ) gforth lp_plus_store_number |
| ""used with negative immediate values it allocates memory on the |
""used with negative immediate values it allocates memory on the |
| local stack, a positive immediate argument drops memory from the local |
local stack, a positive immediate argument drops memory from the local |
| stack"" |
stack"" |
| lp += (Cell)NEXT_INST; |
lp += noffset; |
| INC_IP(1); |
|
| |
|
| lp- ( -- ) new minus_four_lp_plus_store |
lp- ( -- ) new minus_four_lp_plus_store |
| lp += -sizeof(Cell); |
lp += -sizeof(Cell); |
| wcall ( u -- ) gforth |
wcall ( u -- ) gforth |
| IF_fpTOS(fp[0]=fpTOS); |
IF_fpTOS(fp[0]=fpTOS); |
| FP=fp; |
FP=fp; |
| sp=(SYSCALL(Cell(*)(Cell *, void *))u)(sp, &FP); |
sp=(Cell*)(SYSCALL(Cell(*)(Cell *, void *))u)(sp, &FP); |
| fp=FP; |
fp=FP; |
| IF_spTOS(spTOS=sp[0];) |
IF_spTOS(spTOS=sp[0];) |
| IF_fpTOS(fpTOS=fp[0]); |
IF_fpTOS(fpTOS=fp[0]); |
| flag = 0; |
flag = 0; |
| } else { |
} else { |
| u2 = strlen(dent->d_name); |
u2 = strlen(dent->d_name); |
| if(u2 > u1) |
if(u2 > u1) { |
| u2 = u1; |
u2 = u1; |
| |
wior = -512-ENAMETOOLONG; |
| |
} |
| memmove(c_addr, dent->d_name, u2); |
memmove(c_addr, dent->d_name, u2); |
| } |
} |
| |
|
| newline ( -- c_addr u ) gforth |
newline ( -- c_addr u ) gforth |
| ""String containing the newline sequence of the host OS"" |
""String containing the newline sequence of the host OS"" |
| char newline[] = { |
char newline[] = { |
| #ifdef unix |
#if defined(unix) || defined(__MACH__) |
| |
/* Darwin/MacOS X sets __MACH__, but not unix. */ |
| '\n' |
'\n' |
| #else |
#else |
| '\r','\n' |
'\r','\n' |
| wior=FILEIO(ferror((FILE *)wfileid)); |
wior=FILEIO(ferror((FILE *)wfileid)); |
| |
|
| \+ |
\+ |
| |
|
| |
(listlfind) ( c_addr u longname1 -- longname2 ) new paren_listlfind |
| |
for (; longname1 != NULL; longname1 = (struct Longname *)(longname1->next)) |
| |
if ((UCell)LONGNAME_COUNT(longname1)==u && |
| |
memcasecmp(c_addr, longname1->name, u)== 0 /* or inline? */) |
| |
break; |
| |
longname2=longname1; |
| |
: |
| |
BEGIN dup WHILE (findl-samelen) dup WHILE |
| |
>r 2dup r@ cell+ cell+ capscomp 0= |
| |
IF 2drop r> EXIT THEN |
| |
r> @ |
| |
REPEAT THEN nip nip ; |
| |
: (findl-samelen) ( u longname1 -- u longname2/0 ) |
| |
BEGIN 2dup cell+ @ lcount-mask and <> WHILE @ dup 0= UNTIL THEN ; |
| |
|
| |
\+hash |
| |
|
| |
(hashlfind) ( c_addr u a_addr -- longname2 ) new paren_hashlfind |
| |
struct Longname *longname1; |
| |
longname2=NULL; |
| |
while(a_addr != NULL) |
| |
{ |
| |
longname1=(struct Longname *)(a_addr[1]); |
| |
a_addr=(Cell *)(a_addr[0]); |
| |
if ((UCell)LONGNAME_COUNT(longname1)==u && |
| |
memcasecmp(c_addr, longname1->name, u)== 0 /* or inline? */) |
| |
{ |
| |
longname2=longname1; |
| |
break; |
| |
} |
| |
} |
| |
: |
| |
BEGIN dup WHILE |
| |
2@ >r >r dup r@ cell+ @ lcount-mask and = |
| |
IF 2dup r@ cell+ cell+ capscomp 0= |
| |
IF 2drop r> rdrop EXIT THEN THEN |
| |
rdrop r> |
| |
REPEAT nip nip ; |
| |
|
| |
(tablelfind) ( c_addr u a_addr -- longname2 ) new paren_tablelfind |
| |
""A case-sensitive variant of @code{(hashfind)}"" |
| |
struct Longname *longname1; |
| |
longname2=NULL; |
| |
while(a_addr != NULL) |
| |
{ |
| |
longname1=(struct Longname *)(a_addr[1]); |
| |
a_addr=(Cell *)(a_addr[0]); |
| |
if ((UCell)LONGNAME_COUNT(longname1)==u && |
| |
memcmp(c_addr, longname1->name, u)== 0 /* or inline? */) |
| |
{ |
| |
longname2=longname1; |
| |
break; |
| |
} |
| |
} |
| |
: |
| |
BEGIN dup WHILE |
| |
2@ >r >r dup r@ cell+ @ lcount-mask and = |
| |
IF 2dup r@ cell+ cell+ -text 0= |
| |
IF 2drop r> rdrop EXIT THEN THEN |
| |
rdrop r> |
| |
REPEAT nip nip ; |
| |
|
| |
\+ |
| |
|
| |
\+peephole |
| |
|
| |
\g peephole |
| |
|
| |
primtable ( -- wprimtable ) new |
| |
""wprimtable is a table containing the xts of the primitives indexed |
| |
by sequence-number in prim (for use in prepare-peephole-table)."" |
| |
wprimtable = (Cell)primtable(symbols+DOESJUMP+1,MAX_SYMBOLS-DOESJUMP-1); |
| |
|
| |
prepare-peephole-table ( wprimtable -- wpeeptable ) new prepare_peephole_opt |
| |
""wpeeptable is a data structure used by @code{peephole-opt}; it is |
| |
constructed by combining a primitives table with a simple peephole |
| |
optimization table."" |
| |
wpeeptable = prepare_peephole_table((Xt *)wprimtable); |
| |
|
| |
peephole-opt ( xt1 xt2 wpeeptable -- xt ) new peephole_opt |
| |
""xt is the combination of xt1 and xt2 (according to wpeeptable); if |
| |
they cannot be combined, xt is 0."" |
| |
xt = peephole_opt(xt1, xt2, wpeeptable); |
| |
|
| |
call ( #a_callee -- R:a_retaddr ) new |
| |
""Call callee (a variant of docol with inline argument)."" |
| |
a_retaddr = (Cell *)IP; |
| |
SET_IP((Xt *)a_callee); |
| |
|
| |
useraddr ( #u -- a_addr ) new |
| |
a_addr = (Cell *)(up+u); |
| |
|
| |
compile-prim ( xt1 -- xt2 ) new compile_prim |
| |
xt2 = (Xt)compile_prim((Label)xt1); |
| |
|
| |
include(peeprules.vmg) |
| |
|
| |
\+ |