version 1.148, 2003/11/06 09:47:49
|
version 1.156, 2004/12/31 13:23:57
|
Line 1
|
Line 1
|
\ Gforth primitives |
\ Gforth primitives |
|
|
\ 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. |
|
|
Line 249 execute ( xt -- ) core
|
Line 249 execute ( xt -- ) core
|
#ifndef NO_IP |
#ifndef NO_IP |
ip=IP; |
ip=IP; |
#endif |
#endif |
IF_spTOS(spTOS = sp[0]); |
IF_spTOS(spTOS = sp[0]); /* inst_tail would produce a NEXT_P1 */ |
SUPER_END; |
SUPER_END; |
EXEC(xt); |
EXEC(xt); |
|
|
Line 259 perform ( a_addr -- ) gforth
|
Line 259 perform ( a_addr -- ) gforth
|
#ifndef NO_IP |
#ifndef NO_IP |
ip=IP; |
ip=IP; |
#endif |
#endif |
IF_spTOS(spTOS = sp[0]); |
IF_spTOS(spTOS = sp[0]); /* inst_tail would produce a NEXT_P1 */ |
SUPER_END; |
SUPER_END; |
EXEC(*(Xt *)a_addr); |
EXEC(*(Xt *)a_addr); |
: |
: |
Line 324 INST_TAIL;
|
Line 324 INST_TAIL;
|
JUMP(a_target); |
JUMP(a_target); |
#else |
#else |
SET_IP((Xt *)a_target); |
SET_IP((Xt *)a_target); |
|
INST_TAIL; |
|
NEXT_P2; |
#endif |
#endif |
|
SUPER_CONTINUE; /* we do our own control flow, so don't append NEXT etc. */ |
: |
: |
r> @ >r ; |
r> @ >r ; |
|
|
Line 433 condbranch((+loop),n R:nlimit R:n1 -- R:
|
Line 436 condbranch((+loop),n R:nlimit R:n1 -- R:
|
/* dependent upon two's complement arithmetic */ |
/* dependent upon two's complement arithmetic */ |
Cell olddiff = n1-nlimit; |
Cell olddiff = n1-nlimit; |
n2=n1+n; |
n2=n1+n; |
,if ((olddiff^(olddiff+n))>=0 /* the limit is not crossed */ |
,if (((olddiff^(olddiff+n)) /* the limit is not crossed */ |
|| (olddiff^n)>=0 /* it is a wrap-around effect */) { |
&(olddiff^n)) /* OR it is a wrap-around effect */ |
|
>=0) { /* & is used to avoid having two branches for gforth-native */ |
,: |
,: |
r> swap |
r> swap |
r> r> 2dup - >r |
r> r> 2dup - >r |
Line 463 if (n<0) {
|
Line 467 if (n<0) {
|
newdiff = -newdiff; |
newdiff = -newdiff; |
} |
} |
n2=n1+n; |
n2=n1+n; |
,if (diff>=0 || newdiff<0) { |
,if (((~diff)|newdiff)<0) { /* use | to avoid two branches for gforth-native */ |
,) |
,) |
|
|
\+ |
\+ |
Line 987 w2 = ~w1;
|
Line 991 w2 = ~w1;
|
|
|
rshift ( u1 n -- u2 ) core r_shift |
rshift ( u1 n -- u2 ) core r_shift |
""Logical shift right by @i{n} bits."" |
""Logical shift right by @i{n} bits."" |
u2 = u1>>n; |
#ifdef BROKEN_SHIFT |
|
u2 = rshift(u1, n); |
|
#else |
|
u2 = u1 >> n; |
|
#endif |
: |
: |
0 ?DO 2/ MAXI and LOOP ; |
0 ?DO 2/ MAXI and LOOP ; |
|
|
lshift ( u1 n -- u2 ) core l_shift |
lshift ( u1 n -- u2 ) core l_shift |
u2 = u1<<n; |
#ifdef BROKEN_SHIFT |
|
u2 = lshift(u1, n); |
|
#else |
|
u2 = u1 << n; |
|
#endif |
: |
: |
0 ?DO 2* LOOP ; |
0 ?DO 2* LOOP ; |
|
|
Line 1589 SUPER_END;
|
Line 1601 SUPER_END;
|
return (Label *)n; |
return (Label *)n; |
|
|
(system) ( c_addr u -- wretval wior ) gforth paren_system |
(system) ( c_addr u -- wretval wior ) gforth paren_system |
#ifndef MSDOS |
wretval = gforth_system(c_addr, u); |
int old_tp=terminal_prepped; |
|
deprep_terminal(); |
|
#endif |
|
wretval=system(cstr(c_addr,u,1)); /* ~ expansion on first part of string? */ |
|
wior = IOR(wretval==-1 || (wretval==127 && errno != 0)); |
wior = IOR(wretval==-1 || (wretval==127 && errno != 0)); |
#ifndef MSDOS |
|
if (old_tp) |
|
prep_terminal(); |
|
#endif |
|
|
|
getenv ( c_addr1 u1 -- c_addr2 u2 ) gforth |
getenv ( c_addr1 u1 -- c_addr2 u2 ) gforth |
""The string @i{c-addr1 u1} specifies an environment variable. The string @i{c-addr2 u2} |
""The string @i{c-addr1 u1} specifies an environment variable. The string @i{c-addr2 u2} |
Line 2353 av-double ( r -- ) gforth av_double
|
Line 2357 av-double ( r -- ) gforth av_double
|
av_double(alist, r); |
av_double(alist, r); |
|
|
av-longlong ( d -- ) gforth av_longlong |
av-longlong ( d -- ) gforth av_longlong |
|
#ifdef BUGGY_LONG_LONG |
|
av_longlong(alist, d.lo); |
|
#else |
av_longlong(alist, d); |
av_longlong(alist, d); |
|
#endif |
|
|
av-ptr ( c_addr -- ) gforth av_ptr |
av-ptr ( c_addr -- ) gforth av_ptr |
av_ptr(alist, void*, c_addr); |
av_ptr(alist, void*, c_addr); |
Line 2372 lp += sizeof(Float);
|
Line 2380 lp += sizeof(Float);
|
av_double(alist, r); |
av_double(alist, r); |
|
|
av-longlong-r ( R:d -- ) gforth av_longlong_r |
av-longlong-r ( R:d -- ) gforth av_longlong_r |
|
#ifdef BUGGY_LONG_LONG |
|
av_longlong(alist, d.lo); |
|
#else |
av_longlong(alist, d); |
av_longlong(alist, d); |
|
#endif |
|
|
av-ptr-r ( R:c_addr -- ) gforth av_ptr_r |
av-ptr-r ( R:c_addr -- ) gforth av_ptr_r |
av_ptr(alist, void*, c_addr); |
av_ptr(alist, void*, c_addr); |
Line 2404 av-call-longlong ( -- d ) gforth av_cal
|
Line 2416 av-call-longlong ( -- d ) gforth av_cal
|
SAVE_REGS |
SAVE_REGS |
av_call(alist); |
av_call(alist); |
REST_REGS |
REST_REGS |
|
#ifdef BUGGY_LONG_LONG |
|
d.lo = llrv; |
|
d.hi = 0; |
|
#else |
d = llrv; |
d = llrv; |
|
#endif |
|
|
av-call-ptr ( -- c_addr ) gforth av_call_ptr |
av-call-ptr ( -- c_addr ) gforth av_call_ptr |
SAVE_REGS |
SAVE_REGS |
Line 2437 va-arg-int ( -- w ) gforth va_arg_int
|
Line 2454 va-arg-int ( -- w ) gforth va_arg_int
|
w = va_arg_int(clist); |
w = va_arg_int(clist); |
|
|
va-arg-longlong ( -- d ) gforth va_arg_longlong |
va-arg-longlong ( -- d ) gforth va_arg_longlong |
|
#ifdef BUGGY_LONG_LONG |
|
d.lo = va_arg_longlong(clist); |
|
d.hi = 0; |
|
#else |
d = va_arg_longlong(clist); |
d = va_arg_longlong(clist); |
|
#endif |
|
|
va-arg-ptr ( -- c_addr ) gforth va_arg_ptr |
va-arg-ptr ( -- c_addr ) gforth va_arg_ptr |
c_addr = (char *)va_arg_ptr(clist,char*); |
c_addr = (char *)va_arg_ptr(clist,char*); |
Line 2461 va_return_ptr(clist, void *, c_addr);
|
Line 2483 va_return_ptr(clist, void *, c_addr);
|
return 0; |
return 0; |
|
|
va-return-longlong ( d -- ) gforth va_return_longlong |
va-return-longlong ( d -- ) gforth va_return_longlong |
|
#ifdef BUGGY_LONG_LONG |
|
va_return_longlong(clist, d.lo); |
|
#else |
va_return_longlong(clist, d); |
va_return_longlong(clist, d); |
|
#endif |
return 0; |
return 0; |
|
|
va-return-float ( r -- ) gforth va_return_float |
va-return-float ( r -- ) gforth va_return_float |
Line 2526 compile_prim1(a_prim);
|
Line 2552 compile_prim1(a_prim);
|
finish-code ( -- ) gforth finish_code |
finish-code ( -- ) gforth finish_code |
""Perform delayed steps in code generation (branch resolution, I-cache |
""Perform delayed steps in code generation (branch resolution, I-cache |
flushing)."" |
flushing)."" |
|
IF_spTOS(sp[0]=spTOS); /* workaround for failing to save spTOS |
|
(gcc-2.95.1, gforth-fast --enable-force-reg) */ |
finish_code(); |
finish_code(); |
|
IF_spTOS(spTOS=sp[0]); |
|
|
forget-dyncode ( c_code -- f ) gforth-internal forget_dyncode |
forget-dyncode ( c_code -- f ) gforth-internal forget_dyncode |
f = forget_dyncode(c_code); |
f = forget_dyncode(c_code); |