| /* 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 |
| 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 */ |
| ,) |
,) |
| |
|
| \+ |
\+ |
| 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); |