version 1.160, 2005/01/23 23:16:21
|
version 1.162, 2005/01/25 22:16:29
|
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 251 ip=IP;
|
Line 251 ip=IP;
|
#endif |
#endif |
IF_spTOS(spTOS = sp[0]); /* inst_tail would produce a NEXT_P1 */ |
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 261 ip=IP;
|
Line 261 ip=IP;
|
#endif |
#endif |
IF_spTOS(spTOS = sp[0]); /* inst_tail would produce a NEXT_P1 */ |
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 284 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 817 n = n1*n2;
|
Line 817 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 852 fm/mod ( d1 n1 -- n2 n3 ) core f_m_sla
|
Line 899 fm/mod ( d1 n1 -- n2 n3 ) core f_m_sla
|
""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_LL_DIV |
#ifdef BUGGY_LL_DIV |
DCell r = fmdiv(d1,n1); |
DCell r = fmdiv(d1,n1); |
n2=r.hi; |
n2=DHI(r); |
n3=r.lo; |
n3=DLO(r); |
#else |
#else |
/* 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; |
Line 874 sm/rem ( d1 n1 -- n2 n3 ) core s_m_sla
|
Line 921 sm/rem ( d1 n1 -- n2 n3 ) core s_m_sla
|
""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_LL_DIV |
#ifdef BUGGY_LL_DIV |
DCell r = smdiv(d1,n1); |
DCell r = smdiv(d1,n1); |
n2=r.hi; |
n2=DHI(r); |
n3=r.lo; |
n3=DLO(r); |
#else |
#else |
/* 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; |
Line 923 um/mod ( ud u1 -- u2 u3 ) core u_m_slas
|
Line 970 um/mod ( ud u1 -- u2 u3 ) core u_m_slas
|
""ud=u3*u1+u2, u1>u2>=0"" |
""ud=u3*u1+u2, u1>u2>=0"" |
#ifdef BUGGY_LL_DIV |
#ifdef BUGGY_LL_DIV |
UDCell r = umdiv(ud,u1); |
UDCell r = umdiv(ud,u1); |
u2=r.hi; |
u2=DHI(r); |
u3=r.lo; |
u3=DLO(r); |
#else |
#else |
u3 = ud/u1; |
u3 = ud/u1; |
u2 = ud%u1; |
u2 = ud%u1; |