version 1.154, 2004/06/19 18:47:26
|
version 1.167, 2005/01/28 21:36:45
|
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 191 goto *next_code;
|
Line 191 goto *next_code;
|
ip=IP; /* undo any ip updating that may have been performed by NEXT_P0 */ |
ip=IP; /* undo any ip updating that may have been performed by NEXT_P0 */ |
#endif /* !defined(NO_IP) */ |
#endif /* !defined(NO_IP) */ |
SUPER_END; /* !! probably unnecessary and may lead to measurement errors */ |
SUPER_END; /* !! probably unnecessary and may lead to measurement errors */ |
EXEC(*(Xt *)PFA(CFA)); |
VM_JUMP(EXEC1(*(Xt *)PFA(CFA))); |
|
|
(dofield) ( n1 -- n2 ) gforth-internal paren_field |
(dofield) ( n1 -- n2 ) gforth-internal paren_field |
""run-time routine for fields"" |
""run-time routine for fields"" |
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]); /* inst_tail would produce a NEXT_P1 */ |
|
SUPER_END; |
SUPER_END; |
EXEC(xt); |
VM_JUMP(EXEC1(xt)); |
|
|
perform ( a_addr -- ) gforth |
perform ( a_addr -- ) gforth |
""@code{@@ execute}."" |
""@code{@@ execute}."" |
Line 259 perform ( a_addr -- ) gforth
|
Line 258 perform ( a_addr -- ) gforth
|
#ifndef NO_IP |
#ifndef NO_IP |
ip=IP; |
ip=IP; |
#endif |
#endif |
IF_spTOS(spTOS = sp[0]); /* inst_tail would produce a NEXT_P1 */ |
|
SUPER_END; |
SUPER_END; |
EXEC(*(Xt *)a_addr); |
VM_JUMP(EXEC1(*(Xt *)a_addr)); |
: |
: |
@ execute ; |
@ execute ; |
|
|
Line 284 lit-perform ( #a_addr -- ) new lit_perfo
|
Line 282 lit-perform ( #a_addr -- ) new lit_perfo
|
ip=IP; |
ip=IP; |
#endif |
#endif |
SUPER_END; |
SUPER_END; |
EXEC(*(Xt *)a_addr); |
VM_JUMP(EXEC1(*(Xt *)a_addr)); |
|
|
does-exec ( #a_cfa -- R:nest a_pfa ) new does_exec |
does-exec ( #a_cfa -- R:nest a_pfa ) new does_exec |
#ifdef NO_IP |
#ifdef NO_IP |
Line 324 INST_TAIL;
|
Line 322 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 ; |
|
|
\ condbranch(forthname,stackeffect,restline,code1,code2,forthcode) |
\ condbranch(forthname,stackeffect,restline,code1,code2,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 |
|
\ condbranch(forthname,stackeffect,restline,code1,code2,forthcode) |
|
\ this is non-syntactical: code must open a brace that is closed by the macro |
define(condbranch, |
define(condbranch, |
$1 ( `#'a_target $2 ) $3 |
$1 ( `#'a_target $2 ) $3 |
$4 #ifdef NO_IP |
$4 #ifdef NO_IP |
Line 342 $5 #ifdef NO_IP
|
Line 339 $5 #ifdef NO_IP
|
JUMP(a_target); |
JUMP(a_target); |
#else |
#else |
SET_IP((Xt *)a_target); |
SET_IP((Xt *)a_target); |
|
#endif |
|
} |
|
$6 |
|
|
|
\+glocals |
|
|
|
$1-lp+!`#' ( `#'a_target `#'nlocals $2 ) $3_lp_plus_store_number |
|
$4 #ifdef NO_IP |
|
INST_TAIL; |
|
#endif |
|
$5 lp += nlocals; |
|
#ifdef NO_IP |
|
JUMP(a_target); |
|
#else |
|
SET_IP((Xt *)a_target); |
|
#endif |
|
} |
|
|
|
\+ |
|
) |
|
|
|
\ version that generates two jumps (not good for PR 15242 workaround) |
|
define(condbranch_twojump, |
|
$1 ( `#'a_target $2 ) $3 |
|
$4 #ifdef NO_IP |
|
INST_TAIL; |
|
#endif |
|
$5 #ifdef NO_IP |
|
JUMP(a_target); |
|
#else |
|
SET_IP((Xt *)a_target); |
INST_TAIL; NEXT_P2; |
INST_TAIL; NEXT_P2; |
#endif |
#endif |
} |
} |
Line 491 if (nstart == nlimit) {
|
Line 519 if (nstart == nlimit) {
|
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; |
|
: |
: |
2dup = |
2dup = |
IF r> swap rot >r >r |
IF r> swap rot >r >r |
Line 514 if (nstart >= nlimit) {
|
Line 540 if (nstart >= nlimit) {
|
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; |
|
: |
: |
swap 2dup |
swap 2dup |
r> swap >r swap >r |
r> swap >r swap >r |
Line 537 if (ustart >= ulimit) {
|
Line 561 if (ustart >= ulimit) {
|
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; |
|
: |
: |
swap 2dup |
swap 2dup |
r> swap >r swap >r |
r> swap >r swap >r |
Line 560 if (nstart <= nlimit) {
|
Line 582 if (nstart <= nlimit) {
|
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; |
|
: |
: |
swap 2dup |
swap 2dup |
r> swap >r swap >r |
r> swap >r swap >r |
Line 583 if (ustart <= ulimit) {
|
Line 603 if (ustart <= ulimit) {
|
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; |
|
: |
: |
swap 2dup |
swap 2dup |
r> swap >r swap >r |
r> swap >r swap >r |
Line 787 n = n1*n2;
|
Line 805 n = n1*n2;
|
|
|
/ ( n1 n2 -- n ) core slash |
/ ( n1 n2 -- n ) core slash |
n = n1/n2; |
n = n1/n2; |
|
if(FLOORED_DIV && (n1 < 0) != (n2 < 0) && (n1%n2 != 0)) n--; |
: |
: |
/mod nip ; |
/mod nip ; |
|
|
mod ( n1 n2 -- n ) core |
mod ( n1 n2 -- n ) core |
n = n1%n2; |
n = n1%n2; |
|
if(FLOORED_DIV && (n1 < 0) != (n2 < 0) && n!=0) n += n2; |
: |
: |
/mod drop ; |
/mod drop ; |
|
|
/mod ( n1 n2 -- n3 n4 ) core slash_mod |
/mod ( n1 n2 -- n3 n4 ) core slash_mod |
n4 = n1/n2; |
n4 = n1/n2; |
n3 = n1%n2; /* !! is this correct? look into C standard! */ |
n3 = n1%n2; /* !! is this correct? look into C standard! */ |
|
if (FLOORED_DIV && (n1<0) != (n2<0) && n3!=0) { |
|
n4--; |
|
n3+=n2; |
|
} |
: |
: |
>r s>d r> fm/mod ; |
>r s>d r> fm/mod ; |
|
|
|
*/mod ( n1 n2 n3 -- n4 n5 ) core star_slash_mod |
|
""n1*n2=n3*n5+n4, with the intermediate result (n1*n2) being double."" |
|
#ifdef BUGGY_LL_MUL |
|
DCell d = mmul(n1,n2); |
|
#else |
|
DCell d = (DCell)n1 * (DCell)n2; |
|
#endif |
|
#ifdef BUGGY_LL_DIV |
|
DCell r = fmdiv(d,n3); |
|
n4=DHI(r); |
|
n5=DLO(r); |
|
#else |
|
/* assumes that the processor uses either floored or symmetric division */ |
|
n5 = d/n3; |
|
n4 = d%n3; |
|
if (FLOORED_DIV && (d<0) != (n3<0) && n4!=0) { |
|
n5--; |
|
n4+=n3; |
|
} |
|
#endif |
|
: |
|
>r m* r> fm/mod ; |
|
|
|
*/ ( n1 n2 n3 -- n4 ) core star_slash |
|
""n4=(n1*n2)/n3, with the intermediate result being double."" |
|
#ifdef BUGGY_LL_MUL |
|
DCell d = mmul(n1,n2); |
|
#else |
|
DCell d = (DCell)n1 * (DCell)n2; |
|
#endif |
|
#ifdef BUGGY_LL_DIV |
|
DCell r = fmdiv(d,n3); |
|
n4=DHI(r); |
|
#else |
|
/* assumes that the processor uses either floored or symmetric division */ |
|
n4 = d/n3; |
|
if (FLOORED_DIV && (d<0) != (n3<0) && (d%n3)!=0) n4--; |
|
#endif |
|
: |
|
*/mod nip ; |
|
|
2* ( n1 -- n2 ) core two_star |
2* ( n1 -- n2 ) core two_star |
""Shift left by 1; also works on unsigned numbers"" |
""Shift left by 1; also works on unsigned numbers"" |
n2 = 2*n1; |
n2 = 2*n1; |
Line 820 n2 = n1>>1;
|
Line 885 n2 = n1>>1;
|
|
|
fm/mod ( d1 n1 -- n2 n3 ) core f_m_slash_mod |
fm/mod ( d1 n1 -- n2 n3 ) core f_m_slash_mod |
""Floored division: @i{d1} = @i{n3}*@i{n1}+@i{n2}, @i{n1}>@i{n2}>=0 or 0>=@i{n2}>@i{n1}."" |
""Floored division: @i{d1} = @i{n3}*@i{n1}+@i{n2}, @i{n1}>@i{n2}>=0 or 0>=@i{n2}>@i{n1}."" |
#ifdef BUGGY_LONG_LONG |
#ifdef BUGGY_LL_DIV |
|
#ifdef ASM_SM_SLASH_REM |
|
ASM_SM_SLASH_REM(d1.lo, d1.hi, n1, n2, n3); |
|
if ((d1.hi<0) != (n1<0) && n2!=0) { |
|
n3--; |
|
n2+=n1; |
|
} |
|
#else /* !defined(ASM_SM_SLASH_REM) */ |
DCell r = fmdiv(d1,n1); |
DCell r = fmdiv(d1,n1); |
n2=r.hi; |
n2=DHI(r); |
n3=r.lo; |
n3=DLO(r); |
#else |
#endif /* !defined(ASM_SM_SLASH_REM) */ |
|
#else |
|
#ifdef ASM_SM_SLASH_REM4 |
|
ASM_SM_SLASH_REM4(d1, n1, n2, n3); |
|
if ((d1<0) != (n1<0) && n2!=0) { |
|
n3--; |
|
n2+=n1; |
|
} |
|
#else /* !defined(ASM_SM_SLASH_REM4) */ |
/* assumes that the processor uses either floored or symmetric division */ |
/* assumes that the processor uses either floored or symmetric division */ |
n3 = d1/n1; |
n3 = d1/n1; |
n2 = d1%n1; |
n2 = d1%n1; |
Line 833 if (1%-3>0 && (d1<0) != (n1<0) && n2!=0)
|
Line 913 if (1%-3>0 && (d1<0) != (n1<0) && n2!=0)
|
n3--; |
n3--; |
n2+=n1; |
n2+=n1; |
} |
} |
|
#endif /* !defined(ASM_SM_SLASH_REM4) */ |
#endif |
#endif |
: |
: |
dup >r dup 0< IF negate >r dnegate r> THEN |
dup >r dup 0< IF negate >r dnegate r> THEN |
Line 842 if (1%-3>0 && (d1<0) != (n1<0) && n2!=0)
|
Line 923 if (1%-3>0 && (d1<0) != (n1<0) && n2!=0)
|
|
|
sm/rem ( d1 n1 -- n2 n3 ) core s_m_slash_rem |
sm/rem ( d1 n1 -- n2 n3 ) core s_m_slash_rem |
""Symmetric division: @i{d1} = @i{n3}*@i{n1}+@i{n2}, sign(@i{n2})=sign(@i{d1}) or 0."" |
""Symmetric division: @i{d1} = @i{n3}*@i{n1}+@i{n2}, sign(@i{n2})=sign(@i{d1}) or 0."" |
#ifdef BUGGY_LONG_LONG |
#ifdef BUGGY_LL_DIV |
|
#ifdef ASM_SM_SLASH_REM |
|
ASM_SM_SLASH_REM(d1.lo, d1.hi, n1, n2, n3); |
|
#else /* !defined(ASM_SM_SLASH_REM) */ |
DCell r = smdiv(d1,n1); |
DCell r = smdiv(d1,n1); |
n2=r.hi; |
n2=DHI(r); |
n3=r.lo; |
n3=DLO(r); |
#else |
#endif /* !defined(ASM_SM_SLASH_REM) */ |
|
#else |
|
#ifdef ASM_SM_SLASH_REM4 |
|
ASM_SM_SLASH_REM4(d1, n1, n2, n3); |
|
#else /* !defined(ASM_SM_SLASH_REM4) */ |
/* assumes that the processor uses either floored or symmetric division */ |
/* assumes that the processor uses either floored or symmetric division */ |
n3 = d1/n1; |
n3 = d1/n1; |
n2 = d1%n1; |
n2 = d1%n1; |
Line 855 if (1%-3<0 && (d1<0) != (n1<0) && n2!=0)
|
Line 943 if (1%-3<0 && (d1<0) != (n1<0) && n2!=0)
|
n3++; |
n3++; |
n2-=n1; |
n2-=n1; |
} |
} |
|
#endif /* !defined(ASM_SM_SLASH_REM4) */ |
#endif |
#endif |
: |
: |
over >r dup >r abs -rot |
over >r dup >r abs -rot |
Line 863 if (1%-3<0 && (d1<0) != (n1<0) && n2!=0)
|
Line 952 if (1%-3<0 && (d1<0) != (n1<0) && n2!=0)
|
r> 0< IF swap negate swap THEN ; |
r> 0< IF swap negate swap THEN ; |
|
|
m* ( n1 n2 -- d ) core m_star |
m* ( n1 n2 -- d ) core m_star |
#ifdef BUGGY_LONG_LONG |
#ifdef BUGGY_LL_MUL |
d = mmul(n1,n2); |
d = mmul(n1,n2); |
#else |
#else |
d = (DCell)n1 * (DCell)n2; |
d = (DCell)n1 * (DCell)n2; |
Line 875 d = (DCell)n1 * (DCell)n2;
|
Line 964 d = (DCell)n1 * (DCell)n2;
|
|
|
um* ( u1 u2 -- ud ) core u_m_star |
um* ( u1 u2 -- ud ) core u_m_star |
/* use u* as alias */ |
/* use u* as alias */ |
#ifdef BUGGY_LONG_LONG |
#ifdef BUGGY_LL_MUL |
ud = ummul(u1,u2); |
ud = ummul(u1,u2); |
#else |
#else |
ud = (UDCell)u1 * (UDCell)u2; |
ud = (UDCell)u1 * (UDCell)u2; |
Line 891 ud = (UDCell)u1 * (UDCell)u2;
|
Line 980 ud = (UDCell)u1 * (UDCell)u2;
|
|
|
um/mod ( ud u1 -- u2 u3 ) core u_m_slash_mod |
um/mod ( ud u1 -- u2 u3 ) core u_m_slash_mod |
""ud=u3*u1+u2, u1>u2>=0"" |
""ud=u3*u1+u2, u1>u2>=0"" |
#ifdef BUGGY_LONG_LONG |
#ifdef BUGGY_LL_DIV |
|
#ifdef ASM_UM_SLASH_MOD |
|
ASM_UM_SLASH_MOD(ud.lo, ud.hi, u1, u2, u3); |
|
#else /* !defined(ASM_UM_SLASH_MOD) */ |
UDCell r = umdiv(ud,u1); |
UDCell r = umdiv(ud,u1); |
u2=r.hi; |
u2=DHI(r); |
u3=r.lo; |
u3=DLO(r); |
#else |
#endif /* !defined(ASM_UM_SLASH_MOD) */ |
|
#else |
|
#ifdef ASM_UM_SLASH_MOD4 |
|
ASM_UM_SLASH_MOD4(ud, u1, u2, u3); |
|
#else /* !defined(ASM_UM_SLASH_MOD4) */ |
u3 = ud/u1; |
u3 = ud/u1; |
u2 = ud%u1; |
u2 = ud%u1; |
|
#endif /* !defined(ASM_UM_SLASH_MOD4) */ |
#endif |
#endif |
: |
: |
0 swap [ 8 cells 1 + ] literal 0 |
0 swap [ 8 cells 1 + ] literal 0 |
Line 910 u2 = ud%u1;
|
Line 1007 u2 = ud%u1;
|
and >r >r 2dup d+ swap r> + swap r> ; |
and >r >r 2dup d+ swap r> + swap r> ; |
|
|
m+ ( d1 n -- d2 ) double m_plus |
m+ ( d1 n -- d2 ) double m_plus |
#ifdef BUGGY_LONG_LONG |
#ifdef BUGGY_LL_ADD |
d2.lo = d1.lo+n; |
DLO_IS(d2, DLO(d1)+n); |
d2.hi = d1.hi - (n<0) + (d2.lo<d1.lo); |
DHI_IS(d2, DHI(d1) - (n<0) + (DLO(d2)<DLO(d1))); |
#else |
#else |
d2 = d1+n; |
d2 = d1+n; |
#endif |
#endif |
Line 920 d2 = d1+n;
|
Line 1017 d2 = d1+n;
|
s>d d+ ; |
s>d d+ ; |
|
|
d+ ( d1 d2 -- d ) double d_plus |
d+ ( d1 d2 -- d ) double d_plus |
#ifdef BUGGY_LONG_LONG |
#ifdef BUGGY_LL_ADD |
d.lo = d1.lo+d2.lo; |
DLO_IS(d, DLO(d1) + DLO(d2)); |
d.hi = d1.hi + d2.hi + (d.lo<d1.lo); |
DHI_IS(d, DHI(d1) + DHI(d2) + (d.lo<DLO(d1))); |
#else |
#else |
d = d1+d2; |
d = d1+d2; |
#endif |
#endif |
Line 930 d = d1+d2;
|
Line 1027 d = d1+d2;
|
rot + >r tuck + swap over u> r> swap - ; |
rot + >r tuck + swap over u> r> swap - ; |
|
|
d- ( d1 d2 -- d ) double d_minus |
d- ( d1 d2 -- d ) double d_minus |
#ifdef BUGGY_LONG_LONG |
#ifdef BUGGY_LL_ADD |
d.lo = d1.lo - d2.lo; |
DLO_IS(d, DLO(d1) - DLO(d2)); |
d.hi = d1.hi-d2.hi-(d1.lo<d2.lo); |
DHI_IS(d, DHI(d1)-DHI(d2)-(DLO(d1)<DLO(d2))); |
#else |
#else |
d = d1-d2; |
d = d1-d2; |
#endif |
#endif |
Line 941 d = d1-d2;
|
Line 1038 d = d1-d2;
|
|
|
dnegate ( d1 -- d2 ) double d_negate |
dnegate ( d1 -- d2 ) double d_negate |
/* use dminus as alias */ |
/* use dminus as alias */ |
#ifdef BUGGY_LONG_LONG |
#ifdef BUGGY_LL_ADD |
d2 = dnegate(d1); |
d2 = dnegate(d1); |
#else |
#else |
d2 = -d1; |
d2 = -d1; |
Line 951 d2 = -d1;
|
Line 1048 d2 = -d1;
|
|
|
d2* ( d1 -- d2 ) double d_two_star |
d2* ( d1 -- d2 ) double d_two_star |
""Shift left by 1; also works on unsigned numbers"" |
""Shift left by 1; also works on unsigned numbers"" |
#ifdef BUGGY_LONG_LONG |
#ifdef BUGGY_LL_SHIFT |
d2.lo = d1.lo<<1; |
DLO_IS(d2, DLO(d1)<<1); |
d2.hi = (d1.hi<<1) | (d1.lo>>(CELL_BITS-1)); |
DHI_IS(d2, (DHI(d1)<<1) | (DLO(d1)>>(CELL_BITS-1))); |
#else |
#else |
d2 = 2*d1; |
d2 = 2*d1; |
#endif |
#endif |
Line 963 d2 = 2*d1;
|
Line 1060 d2 = 2*d1;
|
d2/ ( d1 -- d2 ) double d_two_slash |
d2/ ( d1 -- d2 ) double d_two_slash |
""Arithmetic shift right by 1. For signed numbers this is a floored |
""Arithmetic shift right by 1. For signed numbers this is a floored |
division by 2."" |
division by 2."" |
#ifdef BUGGY_LONG_LONG |
#ifdef BUGGY_LL_SHIFT |
d2.hi = d1.hi>>1; |
DHI_IS(d2, DHI(d1)>>1); |
d2.lo= (d1.lo>>1) | (d1.hi<<(CELL_BITS-1)); |
DLO_IS(d2, (DLO(d1)>>1) | (DHI(d1)<<(CELL_BITS-1))); |
#else |
#else |
d2 = d1>>1; |
d2 = d1>>1; |
#endif |
#endif |
Line 1068 comparisons(u, u1 u2, u_, u1, u2, gforth
|
Line 1165 comparisons(u, u1 u2, u_, u1, u2, gforth
|
\ dcomparisons(prefix, args, prefix, arg1, arg2, wordsets...) |
\ dcomparisons(prefix, args, prefix, arg1, arg2, wordsets...) |
define(dcomparisons, |
define(dcomparisons, |
$1= ( $2 -- f ) $6 $3equals |
$1= ( $2 -- f ) $6 $3equals |
#ifdef BUGGY_LONG_LONG |
#ifdef BUGGY_LL_CMP |
f = FLAG($4.lo==$5.lo && $4.hi==$5.hi); |
f = FLAG($4.lo==$5.lo && $4.hi==$5.hi); |
#else |
#else |
f = FLAG($4==$5); |
f = FLAG($4==$5); |
#endif |
#endif |
|
|
$1<> ( $2 -- f ) $7 $3not_equals |
$1<> ( $2 -- f ) $7 $3not_equals |
#ifdef BUGGY_LONG_LONG |
#ifdef BUGGY_LL_CMP |
f = FLAG($4.lo!=$5.lo || $4.hi!=$5.hi); |
f = FLAG($4.lo!=$5.lo || $4.hi!=$5.hi); |
#else |
#else |
f = FLAG($4!=$5); |
f = FLAG($4!=$5); |
#endif |
#endif |
|
|
$1< ( $2 -- f ) $8 $3less_than |
$1< ( $2 -- f ) $8 $3less_than |
#ifdef BUGGY_LONG_LONG |
#ifdef BUGGY_LL_CMP |
f = FLAG($4.hi==$5.hi ? $4.lo<$5.lo : $4.hi<$5.hi); |
f = FLAG($4.hi==$5.hi ? $4.lo<$5.lo : $4.hi<$5.hi); |
#else |
#else |
f = FLAG($4<$5); |
f = FLAG($4<$5); |
#endif |
#endif |
|
|
$1> ( $2 -- f ) $9 $3greater_than |
$1> ( $2 -- f ) $9 $3greater_than |
#ifdef BUGGY_LONG_LONG |
#ifdef BUGGY_LL_CMP |
f = FLAG($4.hi==$5.hi ? $4.lo>$5.lo : $4.hi>$5.hi); |
f = FLAG($4.hi==$5.hi ? $4.lo>$5.lo : $4.hi>$5.hi); |
#else |
#else |
f = FLAG($4>$5); |
f = FLAG($4>$5); |
#endif |
#endif |
|
|
$1<= ( $2 -- f ) gforth $3less_or_equal |
$1<= ( $2 -- f ) gforth $3less_or_equal |
#ifdef BUGGY_LONG_LONG |
#ifdef BUGGY_LL_CMP |
f = FLAG($4.hi==$5.hi ? $4.lo<=$5.lo : $4.hi<=$5.hi); |
f = FLAG($4.hi==$5.hi ? $4.lo<=$5.lo : $4.hi<=$5.hi); |
#else |
#else |
f = FLAG($4<=$5); |
f = FLAG($4<=$5); |
#endif |
#endif |
|
|
$1>= ( $2 -- f ) gforth $3greater_or_equal |
$1>= ( $2 -- f ) gforth $3greater_or_equal |
#ifdef BUGGY_LONG_LONG |
#ifdef BUGGY_LL_CMP |
f = FLAG($4.hi==$5.hi ? $4.lo>=$5.lo : $4.hi>=$5.hi); |
f = FLAG($4.hi==$5.hi ? $4.lo>=$5.lo : $4.hi>=$5.hi); |
#else |
#else |
f = FLAG($4>=$5); |
f = FLAG($4>=$5); |
Line 1601 SUPER_END;
|
Line 1698 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 1856 char * string = cstr(c_addr1, u1, 1);
|
Line 1945 char * string = cstr(c_addr1, u1, 1);
|
char * pattern = cstr(c_addr2, u2, 0); |
char * pattern = cstr(c_addr2, u2, 0); |
flag = FLAG(!fnmatch(pattern, string, 0)); |
flag = FLAG(!fnmatch(pattern, string, 0)); |
|
|
|
set-dir ( c_addr u -- wior ) gforth set_dir |
|
""Change the current directory to @i{c-addr, u}. |
|
Return an error if this is not possible"" |
|
wior = IOR(chdir(tilde_cstr(c_addr, u, 1))); |
|
|
|
get-dir ( c_addr1 u1 -- c_addr2 u2 ) gforth get_dir |
|
""Store the current directory in the buffer specified by @{c-addr1, u1}. |
|
If the buffer size is not sufficient, return 0 0"" |
|
c_addr2 = getcwd(c_addr1, u1); |
|
if(c_addr2 != NULL) { |
|
u2 = strlen(c_addr2); |
|
} else { |
|
u2 = 0; |
|
} |
|
|
\+ |
\+ |
|
|
newline ( -- c_addr u ) gforth |
newline ( -- c_addr u ) gforth |
Line 1898 dsystem = timeval2us(&usage.ru_stime);
|
Line 2002 dsystem = timeval2us(&usage.ru_stime);
|
struct timeval time1; |
struct timeval time1; |
gettimeofday(&time1,NULL); |
gettimeofday(&time1,NULL); |
duser = timeval2us(&time1); |
duser = timeval2us(&time1); |
#ifndef BUGGY_LONG_LONG |
dsystem = DZERO; |
dsystem = (DCell)0; |
|
#else |
|
dsystem=(DCell){0,0}; |
|
#endif |
|
#endif |
#endif |
|
|
\+ |
\+ |
Line 1915 comparisons(f, r1 r2, f_, r1, r2, gforth
|
Line 2015 comparisons(f, r1 r2, f_, r1, r2, gforth
|
comparisons(f0, r, f_zero_, r, 0., float, gforth, float, gforth) |
comparisons(f0, r, f_zero_, r, 0., float, gforth, float, gforth) |
|
|
d>f ( d -- r ) float d_to_f |
d>f ( d -- r ) float d_to_f |
#ifdef BUGGY_LONG_LONG |
#ifdef BUGGY_LL_D2F |
extern double ldexp(double x, int exp); |
extern double ldexp(double x, int exp); |
if (d.hi<0) { |
if (DHI(d)<0) { |
|
#ifdef BUGGY_LL_ADD |
DCell d2=dnegate(d); |
DCell d2=dnegate(d); |
r = -(ldexp((Float)d2.hi,CELL_BITS) + (Float)d2.lo); |
#else |
|
DCell d2=-d; |
|
#endif |
|
r = -(ldexp((Float)DHI(d2),CELL_BITS) + (Float)DLO(d2)); |
} else |
} else |
r = ldexp((Float)d.hi,CELL_BITS) + (Float)d.lo; |
r = ldexp((Float)DHI(d),CELL_BITS) + (Float)DLO(d); |
#else |
#else |
r = d; |
r = d; |
#endif |
#endif |
Line 2365 av-double ( r -- ) gforth av_double
|
Line 2469 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 |
#ifdef BUGGY_LL_SIZE |
av_longlong(alist, d.lo); |
av_longlong(alist, DLO(d)); |
#else |
#else |
av_longlong(alist, d); |
av_longlong(alist, d); |
#endif |
#endif |
Line 2388 lp += sizeof(Float);
|
Line 2492 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 |
#ifdef BUGGY_LL_SIZE |
av_longlong(alist, d.lo); |
av_longlong(alist, DLO(d)); |
#else |
#else |
av_longlong(alist, d); |
av_longlong(alist, d); |
#endif |
#endif |
Line 2425 SAVE_REGS
|
Line 2529 SAVE_REGS
|
av_call(alist); |
av_call(alist); |
REST_REGS |
REST_REGS |
#ifdef BUGGY_LONG_LONG |
#ifdef BUGGY_LONG_LONG |
d.lo = llrv; |
DLO_IS(d, llrv); |
d.hi = 0; |
DHI_IS(d, 0); |
#else |
#else |
d = llrv; |
d = llrv; |
#endif |
#endif |
Line 2463 w = va_arg_int(clist);
|
Line 2567 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 |
#ifdef BUGGY_LONG_LONG |
d.lo = va_arg_longlong(clist); |
DLO_IS(d, va_arg_longlong(clist)); |
d.hi = 0; |
DHI_IS(d, 0); |
#else |
#else |
d = va_arg_longlong(clist); |
d = va_arg_longlong(clist); |
#endif |
#endif |