+22-Nov-89 Ceriel Jacobs (ceriel) at ceriel
+ Some more speed-up changes, resulting in another 5%.
+
13-Nov-89 Ceriel Jacobs (ceriel) at ceriel
Many changes for speed-up (resulting speed-up: 20-25%).
Also fixed serious problem in floating point handling: the existing
* *
* dt_stdp(addr, p) - STore Data Pointer. *
* dt_stn(addr, l, n) - STore N byte integer. *
+ * dt_stw(addr, l) - STore wsize byte integer. *
* dt_stf(addr, f, n) - STore n byte Floating point number. *
* *
************************************************************************/
}
}
+dt_stw(addr, al)
+ register ptr addr;
+ long al;
+{
+ register int i;
+ register long l = al;
+#ifdef LOGGING
+ /* a psize zero is ambiguous */
+ int sh_flags = (l == 0 && wsize == psize) ? (SH_INT|SH_DATAP) : SH_INT;
+#endif LOGGING
+
+ LOG(("@g6 dt_stw(%lu, %lu)", addr, l));
+ ch_in_data(addr, wsize);
+ ch_wordaligned(addr);
+ for (i = (int) wsize; i > 0; i--, addr++) {
+ ch_dt_prot(addr);
+ data_loc(addr) = (char) l;
+#ifdef LOGGING
+ dt_sh(addr) = sh_flags;
+#endif LOGGING
+ l = l>>8;
+ }
+}
+
#ifndef NOFLOAT
dt_stf(addr, f, n)
register ptr addr;
* dt_lddp(addr) - LoaD Data Pointer from data. *
* dt_ldip(addr) - LoaD Instruction Pointer from data. *
* dt_ldu(addr, n) - LoaD n Unsigned bytes from data. *
+ * dt_lduw(addr) - LoaD wsize Unsigned bytes from data. *
* dt_lds(addr, n) - LoaD n Signed bytes from data. *
+ * dt_ldsw(addr) - LoaD wsize Signed bytes from data. *
* *
************************************************************************/
}
#endif LOGGING
- for (i = (int) n-1; i >= 0; i--) {
- u = (u<<8) | btou(data_loc(addr + i));
+ addr += n-1;
+ for (i = (int) n-1; i >= 0; i--, addr--) {
+ u = (u<<8) | btou(data_loc(addr));
}
LOG(("@g6 dt_ldu() returns %lu", u));
return (u);
}
+unsigned long dt_lduw(addr)
+ register ptr addr;
+{
+ register int i;
+ register unsigned long u = 0;
+
+ LOG(("@g6 dt_lduw(%lu)", addr));
+
+ ch_in_data(addr, wsize);
+ ch_wordaligned(addr);
+#ifdef LOGGING
+ if (!is_dt_set(addr, wsize, SH_INT)) {
+ warning(WGIEXP);
+ warn_dtbits(addr, wsize);
+ }
+#endif LOGGING
+
+ addr += wsize-1;
+ for (i = (int) wsize-1; i >= 0; i--, addr--) {
+ u = (u<<8) | btou(data_loc(addr));
+ }
+ LOG(("@g6 dt_lduw() returns %lu", u));
+ return (u);
+}
+
long dt_lds(addr, n)
register ptr addr;
size n;
}
#endif LOGGING
- l = btos(data_loc(addr + n - 1));
- for (i = n - 2; i >= 0; i--) {
- l = (l<<8) | btol(data_loc(addr + i));
+ addr += n-2;
+ l = btos(data_loc(addr + 1));
+ for (i = n - 2; i >= 0; i--, addr--) {
+ l = (l<<8) | btol(data_loc(addr));
}
LOG(("@g6 dt_lds() returns %lu", l));
return (l);
}
+long dt_ldsw(addr)
+ register ptr addr;
+{
+ register int i;
+ register long l;
+
+ LOG(("@g6 dt_ldsw(%lu)", addr));
+
+ ch_in_data(addr, wsize);
+ ch_wordaligned(addr);
+#ifdef LOGGING
+ if (!is_dt_set(addr, wsize, SH_INT)) {
+ warning(WGIEXP);
+ warn_dtbits(addr, wsize);
+ }
+#endif LOGGING
+
+ addr += wsize-2;
+ l = btos(data_loc(addr + 1));
+ for (i = wsize - 2; i >= 0; i--, addr--) {
+ l = (l<<8) | btol(data_loc(addr));
+ }
+ LOG(("@g6 dt_ldsw() returns %lu", l));
+ return (l);
+}
+
/************************************************************************
* Data move division *
************************************************************************
DoLARz()
{
/* LAR w: Load array element, descriptor contains integers of size w */
- register size l = upop(wsize);
+ register size l = uwpop();
LOG(("@A6 DoLARz(%ld)", l));
arr(LAR, arg_wi(l));
DoSARz()
{
/* SAR w: Store array element */
- register size l = upop(wsize);
+ register size l = uwpop();
LOG(("@A6 DoSARz(%ld)", l));
arr(SAR, arg_wi(l));
DoAARz()
{
/* AAR w: Load address of array element */
- register size l = upop(wsize);
+ register size l = uwpop();
LOG(("@A6 DoAARz(%ld)", l));
arr(AAR, arg_wi(l));
DoCMIz()
{
/* CMI w: Compare w byte integers, Push negative, zero, positive for <, = or > */
- register size l = upop(wsize);
+ register size l = uwpop();
register long t = spop(arg_wi(l));
register long s = spop(l);
{
/* CMF w: Compare w byte reals */
#ifndef NOFLOAT
- register size l = upop(wsize);
+ register size l = uwpop();
double t = fpop(arg_wf(l));
double s = fpop(l);
DoCMUz()
{
/* CMU w: Compare w byte unsigneds */
- register size l = upop(wsize);
+ register size l = uwpop();
register unsigned long t = upop(arg_wi(l));
register unsigned long s = upop(l);
DoCMSz()
{
/* CMS w: Compare w byte values, can only be used for bit for bit equality test */
- register size l = upop(wsize);
+ register size l = uwpop();
LOG(("@T6 DoCMSz(%ld)", l));
spoilFRA();
DoCIIz()
{
/* CII -: Convert integer to integer (*) */
- register int newsize = spop(wsize);
+ register int newsize = swpop();
register long s;
LOG(("@C6 DoCIIz()"));
spoilFRA();
- switch ((int)(10 * spop(wsize) + newsize)) {
+ switch ((int)(10 * swpop() + newsize)) {
case 12:
if (wsize == 4) {
wtrap(WILLCONV, EILLINS);
DoCUIz()
{
/* CUI -: Convert unsigned to integer (*) */
- register int newsize = spop(wsize);
+ register int newsize = swpop();
register unsigned long u;
LOG(("@C6 DoCUIz()"));
spoilFRA();
- switch ((int)(10 * spop(wsize) + newsize)) {
+ switch ((int)(10 * swpop() + newsize)) {
case 22:
if (wsize == 4) {
wtrap(WILLCONV, EILLINS);
{
/* CFI -: Convert floating to integer (*) */
#ifndef NOFLOAT
- register int newsize = spop(wsize);
+ register int newsize = swpop();
double f;
LOG(("@C6 DoCFIz()"));
spoilFRA();
- switch ((int)(10 * spop(wsize) + newsize)) {
+ switch ((int)(10 * swpop() + newsize)) {
case 42:
if (wsize == 4) {
wtrap(WILLCONV, EILLINS);
{
/* CIF -: Convert integer to floating (*) */
#ifndef NOFLOAT
- register int newsize = spop(wsize);
+ register int newsize = swpop();
LOG(("@C6 DoCIFz()"));
spoilFRA();
- switch ((int)(10 * spop(wsize) + newsize)) {
+ switch ((int)(10 * swpop() + newsize)) {
case 24:
if (wsize == 4) {
wtrap(WILLCONV, EILLINS);
{
/* CUF -: Convert unsigned to floating (*) */
#ifndef NOFLOAT
- register int newsize = spop(wsize);
+ register int newsize = swpop();
register unsigned long u;
LOG(("@C6 DoCUFz()"));
spoilFRA();
- switch ((int)(10 * spop(wsize) + newsize)) {
+ switch ((int)(10 * swpop() + newsize)) {
case 24:
if (wsize == 4) {
wtrap(WILLCONV, EILLINS);
{
/* CFF -: Convert floating to floating (*) */
#ifndef NOFLOAT
- register int newsize = spop(wsize);
+ register int newsize = swpop();
LOG(("@C6 DoCFFz()"));
spoilFRA();
- switch ((int)(10 * spop(wsize) + newsize)) {
+ switch ((int)(10 * swpop() + newsize)) {
case 44:
return;
case 48:
DoCIUz()
{
/* CIU -: Convert integer to unsigned */
- register int newsize = spop(wsize);
+ register int newsize = swpop();
register long u;
LOG(("@C6 DoCIUz()"));
spoilFRA();
- switch ((int)(10 * spop(wsize) + newsize)) {
+ switch ((int)(10 * swpop() + newsize)) {
case 22:
if (wsize == 4) {
wtrap(WILLCONV, EILLINS);
DoCUUz()
{
/* CUU -: Convert unsigned to unsigned */
- register int newsize = spop(wsize);
+ register int newsize = swpop();
LOG(("@C6 DoCUUz()"));
spoilFRA();
- switch ((int)(10 * spop(wsize) + newsize)) {
+ switch ((int)(10 * swpop() + newsize)) {
case 22:
if (wsize == 4) {
wtrap(WILLCONV, EILLINS);
{
/* CFU -: Convert floating to unsigned */
#ifndef NOFLOAT
- register int newsize = spop(wsize);
+ register int newsize = swpop();
double f;
LOG(("@C6 DoCFUz()"));
spoilFRA();
- switch ((int)(10 * spop(wsize) + newsize)) {
+ switch ((int)(10 * swpop() + newsize)) {
case 42:
if (wsize == 4) {
wtrap(WILLCONV, EILLINS);
{
/* ADF w: Floating add (*) */
#ifndef NOFLOAT
- register size l = upop(wsize);
+ register size l = uwpop();
double t = fpop(arg_wf(l));
LOG(("@F6 DoADFz(%ld)", l));
{
/* SBF w: Floating subtract (*) */
#ifndef NOFLOAT
- register size l = upop(wsize);
+ register size l = uwpop();
double t = fpop(arg_wf(l));
LOG(("@F6 DoSBFz(%ld)", l));
{
/* MLF w: Floating multiply (*) */
#ifndef NOFLOAT
- register size l = upop(wsize);
+ register size l = uwpop();
double t = fpop(arg_wf(l));
LOG(("@F6 DoMLFz(%ld)", l));
{
/* DVF w: Floating divide (*) */
#ifndef NOFLOAT
- register size l = upop(wsize);
+ register size l = uwpop();
double t = fpop(arg_wf(l));
LOG(("@F6 DoDVFz(%ld)", l));
{
/* NGF w: Floating negate (*) */
#ifndef NOFLOAT
- register size l = upop(wsize);
+ register size l = uwpop();
double t = fpop(arg_wf(l));
LOG(("@F6 DoNGFz(%ld)", l));
{
/* FIF w: Floating multiply and split integer and fraction part (*) */
#ifndef NOFLOAT
- register size l = upop(wsize);
+ register size l = uwpop();
double t = fpop(arg_wf(l));
LOG(("@F6 DoFIFz(%ld)", l));
{
/* FEF w: Split floating number in exponent and fraction part (*) */
#ifndef NOFLOAT
- register size l = upop(wsize);
+ register size l = uwpop();
LOG(("@F6 DoFEFz(%ld)", l));
spoilFRA();
/* INC -: Increment word on top of stack by 1 (*) */
LOG(("@Z6 DoINCz()"));
spoilFRA();
- wpush(inc(spop(wsize)));
+ wpush(inc(swpop()));
}
DoINLm(arg)
LOG(("@Z6 DoINLm(%ld)", l));
spoilFRA();
p = loc_addr(l);
- st_stn(p, inc(st_lds(p, wsize)), wsize);
+ st_stw(p, inc(st_ldsw(p)));
}
DoINLn2(arg)
spoilFRA();
l = arg_l(l);
p = loc_addr(l);
- st_stn(p, inc(st_lds(p, wsize)), wsize);
+ st_stw(p, inc(st_ldsw(p)));
}
DoINLn4(arg)
spoilFRA();
l = arg_l(l);
p = loc_addr(l);
- st_stn(p, inc(st_lds(p, wsize)), wsize);
+ st_stw(p, inc(st_ldsw(p)));
}
DoINLp2(arg)
spoilFRA();
l = arg_l(l);
p = loc_addr(l);
- st_stn(p, inc(st_lds(p, wsize)), wsize);
+ st_stw(p, inc(st_ldsw(p)));
}
DoINLp4(arg)
spoilFRA();
l = arg_l(l);
p = loc_addr(l);
- st_stn(p, inc(st_lds(p, wsize)), wsize);
+ st_stw(p, inc(st_ldsw(p)));
}
DoINLs(hob, wfac)
spoilFRA();
l = arg_l(l);
p = loc_addr(l);
- st_stn(p, inc(st_lds(p, wsize)), wsize);
+ st_stw(p, inc(st_ldsw(p)));
}
DoINEl2(arg)
LOG(("@Z6 DoINEl2(%lu)", p));
spoilFRA();
p = arg_g(p);
- dt_stn(p, inc(dt_lds(p, wsize)), wsize);
+ dt_stw(p, inc(dt_ldsw(p)));
}
DoINEl4(arg)
LOG(("@Z6 DoINEl4(%lu)", p));
spoilFRA();
p = arg_g(p);
- dt_stn(p, inc(dt_lds(p, wsize)), wsize);
+ dt_stw(p, inc(dt_ldsw(p)));
}
DoINEs(hob, wfac)
LOG(("@Z6 DoINEs(%lu)", p));
spoilFRA();
p = arg_g(p);
- dt_stn(p, inc(dt_lds(p, wsize)), wsize);
+ dt_stw(p, inc(dt_ldsw(p)));
}
DoDECz()
/* DEC -: Decrement word on top of stack by 1 (*) */
LOG(("@Z6 DoDECz()"));
spoilFRA();
- wpush(dec(spop(wsize)));
+ wpush(dec(swpop()));
}
DoDELn2(arg)
spoilFRA();
l = arg_l(l);
p = loc_addr(l);
- st_stn(p, dec(st_lds(p, wsize)), wsize);
+ st_stw(p, dec(st_ldsw(p)));
}
DoDELn4(arg)
spoilFRA();
l = arg_l(l);
p = loc_addr(l);
- st_stn(p, dec(st_lds(p, wsize)), wsize);
+ st_stw(p, dec(st_ldsw(p)));
}
DoDELp2(arg)
spoilFRA();
l = arg_l(l);
p = loc_addr(l);
- st_stn(p, dec(st_lds(p, wsize)), wsize);
+ st_stw(p, dec(st_ldsw(p)));
}
DoDELp4(arg)
spoilFRA();
l = arg_l(l);
p = loc_addr(l);
- st_stn(p, dec(st_lds(p, wsize)), wsize);
+ st_stw(p, dec(st_ldsw(p)));
}
DoDELs(hob, wfac)
spoilFRA();
l = arg_l(l);
p = loc_addr(l);
- st_stn(p, dec(st_lds(p, wsize)), wsize);
+ st_stw(p, dec(st_ldsw(p)));
}
DoDEEl2(arg)
LOG(("@Z6 DoDEEl2(%lu)", p));
spoilFRA();
p = arg_g(p);
- dt_stn(p, dec(dt_lds(p, wsize)), wsize);
+ dt_stw(p, dec(dt_ldsw(p)));
}
DoDEEl4(arg)
LOG(("@Z6 DoDEEl4(%lu)", p));
spoilFRA();
p = arg_g(p);
- dt_stn(p, dec(dt_lds(p, wsize)), wsize);
+ dt_stw(p, dec(dt_ldsw(p)));
}
DoDEEs(hob, wfac)
LOG(("@Z6 DoDEEs(%lu)", p));
spoilFRA();
p = arg_g(p);
- dt_stn(p, dec(dt_lds(p, wsize)), wsize);
+ dt_stw(p, dec(dt_ldsw(p)));
}
DoZRLm(arg)
LOG(("@Z6 DoZRLm(%ld)", l));
spoilFRA();
- st_stn(loc_addr(l), 0L, wsize);
+ st_stw(loc_addr(l), 0L);
}
DoZRLn2(arg)
LOG(("@Z6 DoZRLn2(%ld)", l));
spoilFRA();
l = arg_l(arg);
- st_stn(loc_addr(l), 0L, wsize);
+ st_stw(loc_addr(l), 0L);
}
DoZRLn4(arg)
LOG(("@Z6 DoZRLn4(%ld)", l));
spoilFRA();
l = arg_l(l);
- st_stn(loc_addr(l), 0L, wsize);
+ st_stw(loc_addr(l), 0L);
}
DoZRLp2(arg)
LOG(("@Z6 DoZRLp2(%ld)", l));
spoilFRA();
l = arg_l(l);
- st_stn(loc_addr(l), 0L, wsize);
+ st_stw(loc_addr(l), 0L);
}
DoZRLp4(arg)
LOG(("@Z6 DoZRLp4(%ld)", l));
spoilFRA();
l = arg_l(l);
- st_stn(loc_addr(l), 0L, wsize);
+ st_stw(loc_addr(l), 0L);
}
DoZRLs(hob, wfac)
LOG(("@Z6 DoZRLs(%ld)", l));
spoilFRA();
l = arg_l(l);
- st_stn(loc_addr(l), 0L, wsize);
+ st_stw(loc_addr(l), 0L);
}
DoZREl2(arg)
LOG(("@Z6 DoZREl2(%lu)", p));
spoilFRA();
- dt_stn(arg_g(p), 0L, wsize);
+ dt_stw(arg_g(p), 0L);
}
DoZREl4(arg)
LOG(("@Z6 DoZREl4(%lu)", p));
spoilFRA();
- dt_stn(arg_g(p), 0L, wsize);
+ dt_stw(arg_g(p), 0L);
}
DoZREs(hob, wfac)
LOG(("@Z6 DoZREs(%lu)", p));
spoilFRA();
- dt_stn(arg_g(p), 0L, wsize);
+ dt_stw(arg_g(p), 0L);
}
DoZRFl2(arg)
{
/* ZRF w: Load a floating zero of size w */
#ifndef NOFLOAT
- register size l = upop(wsize);
+ register size l = uwpop();
LOG(("@Z6 DoZRFz(%ld)", l));
spoilFRA();
DoZERz()
{
/* ZER w: Load w zero bytes */
- register size i, l = spop(wsize);
+ register size i, l = swpop();
LOG(("@Z6 DoZERz(%ld)", l));
spoilFRA();
DoADIz() /* argument on top of stack */
{
/* ADI w: Addition (*) */
- register size l = upop(wsize);
+ register size l = uwpop();
register long t = spop(arg_wi(l));
LOG(("@I6 DoADIz(%ld)", l));
DoSBIz() /* arg on top of stack */
{
/* SBI w: Subtraction (*) */
- register size l = upop(wsize);
+ register size l = uwpop();
register long t = spop(arg_wi(l));
LOG(("@I6 DoSBIz(%ld)", l));
DoMLIz() /* arg on top of stack */
{
/* MLI w: Multiplication (*) */
- register size l = upop(wsize);
+ register size l = uwpop();
register long t = spop(arg_wi(l));
LOG(("@I6 DoMLIz(%ld)", l));
DoDVIz() /* arg on top of stack */
{
/* DVI w: Division (*) */
- register size l = upop(wsize);
+ register size l = uwpop();
register long t = spop(arg_wi(l));
LOG(("@I6 DoDVIz(%ld)", l));
DoRMIz() /* arg on top of stack */
{
/* RMI w: Remainder (*) */
- register size l = upop(wsize);
+ register size l = uwpop();
register long t = spop(arg_wi(l));
LOG(("@I6 DoRMIz(%ld)", l));
DoNGIz()
{
/* NGI w: Negate (two's complement) (*) */
- register size l = upop(wsize);
+ register size l = uwpop();
LOG(("@I6 DoNGIz(%ld)", l));
spoilFRA();
{
/* SLI w: Shift left (*) */
register size l = (L_arg_2() * arg);
- register long t = spop(wsize);
+ register long t = swpop();
LOG(("@I6 DoSLIl2(%ld)", l));
spoilFRA();
{
/* SLI w: Shift left (*) */
register size l = arg_wi(arg);
- register long t = spop(wsize);
+ register long t = swpop();
LOG(("@I6 DoSLIm(%ld)", l));
spoilFRA();
DoSLIz()
{
/* SLI w: Shift left (*) */
- register size l = upop(wsize);
- register long t = spop(wsize);
+ register size l = uwpop();
+ register long t = swpop();
LOG(("@I6 DoSLIz(%ld)", l));
spoilFRA();
{
/* SRI w: Shift right (*) */
register size l = (L_arg_2() * arg);
- register long t = spop(wsize);
+ register long t = swpop();
LOG(("@I6 DoSRIl2(%ld)", l));
spoilFRA();
DoSRIz()
{
/* SRI w: Shift right (*) */
- register size l = upop(wsize);
- register long t = spop(wsize);
+ register size l = uwpop();
+ register long t = swpop();
LOG(("@I6 DoSRIz(%ld)", l));
spoilFRA();
long arg;
{
/* LOC c: Load constant (i.e. push one word onto the stack) */
- register long l = arg_c(arg);
+ long l = arg_c(arg);
LOG(("@L6 DoLOCm(%ld)", l));
spoilFRA();
LOG(("@L6 DoLOLm(%ld)", l));
spoilFRA();
- push_st(loc_addr(l), wsize);
+ pushw_st(loc_addr(l));
}
DoLOLn2(arg)
LOG(("@L6 DoLOLn2(%ld)", l));
spoilFRA();
l = arg_l(l);
- push_st(loc_addr(l), wsize);
+ pushw_st(loc_addr(l));
}
DoLOLn4(arg)
LOG(("@L6 DoLOLn4(%ld)", l));
spoilFRA();
l = arg_l(l);
- push_st(loc_addr(l), wsize);
+ pushw_st(loc_addr(l));
}
DoLOLp2(arg)
LOG(("@L6 DoLOLp2(%ld)", l));
spoilFRA();
l = arg_l(l);
- push_st(loc_addr(l), wsize);
+ pushw_st(loc_addr(l));
}
DoLOLp4(arg)
LOG(("@L6 DoLOLp4(%ld)", l));
spoilFRA();
l = arg_l(l);
- push_st(loc_addr(l), wsize);
+ pushw_st(loc_addr(l));
}
DoLOLs(hob, wfac)
LOG(("@L6 DoLOLs(%ld)", l));
spoilFRA();
l = arg_l(l);
- push_st(loc_addr(l), wsize);
+ pushw_st(loc_addr(l));
}
DoLOEl2(arg)
LOG(("@L6 DoLOEl2(%lu)", p));
spoilFRA();
- push_m(arg_g(p), wsize);
+ pushw_m(arg_g(p));
}
DoLOEl4(arg)
LOG(("@L6 DoLOEl4(%lu)", p));
spoilFRA();
- push_m(arg_g(p), wsize);
+ pushw_m(arg_g(p));
}
DoLOEs(hob, wfac)
LOG(("@L6 DoLOEs(%lu)", p));
spoilFRA();
- push_m(arg_g(p), wsize);
+ pushw_m(arg_g(p));
}
DoLILm(arg)
LOG(("@L6 DoLILm(%ld)", l));
spoilFRA();
- push_m(st_lddp(loc_addr(l)), wsize);
+ pushw_m(st_lddp(loc_addr(l)));
}
DoLILn2(arg)
LOG(("@L6 DoLILn2(%ld)", l));
spoilFRA();
l = arg_l(l);
- push_m(st_lddp(loc_addr(l)), wsize);
+ pushw_m(st_lddp(loc_addr(l)));
}
DoLILn4(arg)
LOG(("@L6 DoLILn4(%ld)", l));
spoilFRA();
l = arg_l(l);
- push_m(st_lddp(loc_addr(l)), wsize);
+ pushw_m(st_lddp(loc_addr(l)));
}
DoLILp2(arg)
LOG(("@L6 DoLILp2(%ld)", l));
spoilFRA();
l = arg_l(l);
- push_m(st_lddp(loc_addr(l)), wsize);
+ pushw_m(st_lddp(loc_addr(l)));
}
DoLILp4(arg)
LOG(("@L6 DoLILp4(%ld)", l));
spoilFRA();
l = arg_l(l);
- push_m(st_lddp(loc_addr(l)), wsize);
+ pushw_m(st_lddp(loc_addr(l)));
}
DoLILs(hob, wfac)
LOG(("@L6 DoLILs(%ld)", l));
spoilFRA();
l = arg_l(l);
- push_m(st_lddp(loc_addr(l)), wsize);
+ pushw_m(st_lddp(loc_addr(l)));
}
DoLOFl2(arg)
LOG(("@L6 DoLOFl2(%ld)", l));
spoilFRA();
- push_m(p + arg_f(l), wsize);
+ pushw_m(p + arg_f(l));
}
DoLOFl4(arg)
LOG(("@L6 DoLOFl4(%ld)", l));
spoilFRA();
- push_m(p + arg_f(l), wsize);
+ pushw_m(p + arg_f(l));
}
DoLOFm(arg)
LOG(("@L6 DoLOFm(%ld)", l));
spoilFRA();
- push_m(p + arg_f(l), wsize);
+ pushw_m(p + arg_f(l));
}
DoLOFs(hob, wfac)
LOG(("@L6 DoLOFs(%ld)", l));
spoilFRA();
- push_m(p + arg_f(l), wsize);
+ pushw_m(p + arg_f(l));
}
DoLALm(arg)
DoLOSz()
{
/* LOS w: Load indirect, w-byte integer on top of stack gives object size */
- register size l = upop(wsize);
+ register size l = uwpop();
register ptr p;
LOG(("@L6 DoLOSz(%ld)", l));
{
/* AND w: Boolean and on two groups of w bytes */
/* size of objects to be compared (in bytes) on top of stack */
- register size l = upop(wsize);
+ register size l = uwpop();
register ptr p;
LOG(("@X6 DoANDz(%ld)", l));
DoIORz()
{
/* IOR w: Boolean inclusive or on two groups of w bytes */
- register size l = upop(wsize);
+ register size l = uwpop();
register ptr p;
LOG(("@X6 DoIORz(%ld)", l));
DoXORz()
{
/* XOR w: Boolean exclusive or on two groups of w bytes */
- register size l = upop(wsize);
+ register size l = uwpop();
register ptr p;
LOG(("@X6 DoXORz(%ld)", l));
DoCOMz()
{
/* COM w: Complement (one's complement of top w bytes) */
- register size l = upop(wsize);
+ register size l = uwpop();
register ptr p;
LOG(("@X6 DoCOMz(%ld)", l));
{
/* ROL w: Rotate left a group of w bytes */
register size l = (L_arg_2() * arg);
- register long s, t = upop(wsize);
+ register long s, t = uwpop();
register long signbit;
LOG(("@X6 DoROLl2(%ld)", l));
DoROLz()
{
/* ROL w: Rotate left a group of w bytes */
- register size l = upop(wsize);
- register long s, t = upop(wsize);
+ register size l = uwpop();
+ register long s, t = uwpop();
register long signbit;
LOG(("@X6 DoROLz(%ld)", l));
{
/* ROR w: Rotate right a group of w bytes */
register size l = (L_arg_2() * arg);
- register long s, t = upop(wsize);
+ register long s, t = uwpop();
register long signbit;
LOG(("@X6 DoRORl2(%ld)", l));
DoRORz()
{
/* ROR w: Rotate right a group of w bytes */
- register size l = upop(wsize);
- register long s, t = upop(wsize);
+ register size l = uwpop();
+ register long s, t = uwpop();
register long signbit;
LOG(("@X6 DoRORz(%ld)", l));
DoASSz()
{
/* ASS w: Adjust the stack pointer by w-byte integer */
- register size l = upop(wsize);
+ register size l = uwpop();
LOG(("@M6 DoASSz(%ld)", l));
spoilFRA();
DoBLSz()
{
/* BLS w: Block move, size is in w-byte integer on top of stack */
- register size l = upop(wsize);
+ register size l = uwpop();
register ptr dp1, dp2;
LOG(("@M6 DoBLSz(%ld)", l));
DoCSAz()
{
/* CSA w: Case jump; address of jump table at top of stack */
- register size l = upop(wsize);
+ register size l = uwpop();
LOG(("@M6 DoCSAz(%ld)", l));
spoilFRA();
DoCSBz()
{
/* CSB w: Table lookup jump; address of jump table at top of stack */
- register size l = upop(wsize);
+ register size l = uwpop();
LOG(("@M6 DoCSBz(%ld)", l));
spoilFRA();
DoDUSz()
{
/* DUS w: Duplicate top w bytes */
- register size l = upop(wsize);
+ register size l = uwpop();
register ptr oldSP;
LOG(("@M6 DoDUSz(%ld)", l));
DoEXGz()
{
/* EXG w: Exchange top w bytes */
- register size l = upop(wsize);
+ register size l = uwpop();
register ptr oldSP = SP;
LOG(("@M6 DoEXGz(%ld)", l));
DoRCKz()
{
/* RCK w: Range check; trap on error */
- register size l = upop(wsize);
+ register size l = uwpop();
LOG(("@M6 DoRCKz(%ld)", l));
spoilFRA();
}
/* pop the trap number */
- upop(wsize);
+ uwpop();
/* restore the Function Return Area */
- FRA_def = upop(wsize);
- FRASize = upop(wsize);
+ FRA_def = uwpop();
+ FRASize = uwpop();
popFRA(FRASize);
}
/* SIM -: Store 16 bit ignore mask */
LOG(("@M6 DoSIMz()"));
spoilFRA();
- IgnMask = (upop(wsize) | PreIgnMask) & MASK2;
+ IgnMask = (uwpop() | PreIgnMask) & MASK2;
}
DoSTRs(hob, wfac)
DoTRPz()
{
/* TRP -: Cause trap to occur (Error number on stack) */
- register unsigned int tr = (unsigned int)upop(wsize);
+ register unsigned int tr = (unsigned int)uwpop();
LOG(("@M6 DoTRPz()"));
spoilFRA();
{
register ptr cdp = dppop(); /* Case Descriptor Pointer */
register long t_index = /* Table INDEX */
- spop(nbytes) - mem_lds(cdp + psize, wsize);
+ spop(nbytes) - mem_lds(cdp + psize, nbytes);
register ptr nPC; /* New Program Counter */
- if (t_index >= 0 && t_index <= mem_lds(cdp + wsize + psize, wsize)) {
- nPC = mem_ldip(cdp + (2 * wsize) + ((t_index + 1) * psize));
+ if (t_index >= 0 && t_index <= mem_lds(cdp + nbytes + psize, nbytes)) {
+ nPC = mem_ldip(cdp + (2 * nbytes) + ((t_index + 1) * psize));
}
else if ((nPC = mem_ldip(cdp)) == 0) {
trap(ECASE);
register ptr cdp = dppop(); /* Case Descriptor Pointer */
register long sv = spop(nbytes);/* Search Value */
register long nt = /* Number of Table-entries */
- mem_lds(cdp + psize, wsize);
+ mem_lds(cdp + psize, nbytes);
register ptr nPC; /* New Program Counter */
while (--nt >= 0) {
- if (sv == mem_lds(cdp + (nt+1) * (wsize+psize), wsize)) {
- nPC = mem_ldip(cdp + wsize + (nt+1)*(wsize+psize));
+ if (sv == mem_lds(cdp + (nt+1) * (nbytes+psize), nbytes)) {
+ nPC = mem_ldip(cdp + nbytes + (nt+1)*(nbytes+psize));
if (nPC == 0)
trap(ECASE);
newPC(nPC);
st_lds(SP, nbytes);
if (must_test && !(IgnMask&BIT(ERANGE))) {
- if ( cv < mem_lds(rdp, wsize)
- || cv > mem_lds(rdp + wsize, wsize)
+ if ( cv < mem_lds(rdp, nbytes)
+ || cv > mem_lds(rdp + nbytes, nbytes)
) {
trap(ERANGE);
}
DoADSz()
{
/* ADS w: Add w-byte value and pointer */
- register size l = upop(wsize);
+ register size l = uwpop();
register long t = spop(arg_wi(l));
register ptr p, s = st_lddp(SP);
DoSBSz()
{
/* SBS w: Subtract pointers in same fragment and push diff as size w integer */
- register size l = upop(wsize);
+ register size l = uwpop();
register ptr t = st_lddp(SP);
register ptr s = st_lddp(SP + psize);
register long w;
DoINNz()
{
/* INN w: Bit test on w byte set (bit number on top of stack) */
- register size l = upop(wsize);
+ register size l = uwpop();
LOG(("@Y6 DoINNz(%ld)", l));
spoilFRA();
DoSETz()
{
/* SET w: Create singleton w byte set with bit n on (n is top of stack) */
- register size l = upop(wsize);
+ register size l = uwpop();
LOG(("@Y6 DoSETz(%ld)", l));
spoilFRA();
size w;
{
register int bitno =
- (int) spop(wsize); /* bitno on TOS */
+ (int) swpop(); /* bitno on TOS */
register char test_byte = (char) 0;/* default value to be tested */
if (must_test && !(IgnMask&BIT(ESET))) {
PRIVATE create_set(w)
size w;
{
- register int bitno = (int) spop(wsize);
+ register int bitno = (int) swpop();
register size nbytes = w;
st_inc(nbytes);
LOG(("@S6 DoSTLm(%ld)", l));
spoilFRA();
- pop_st(loc_addr(l), wsize);
+ popw_st(loc_addr(l));
}
DoSTLn2(arg)
LOG(("@S6 DoSTLn2(%ld)", l));
spoilFRA();
l = arg_l(l);
- pop_st(loc_addr(l), wsize);
+ popw_st(loc_addr(l));
}
DoSTLn4(arg)
LOG(("@S6 DoSTLn4(%ld)", l));
spoilFRA();
l = arg_l(l);
- pop_st(loc_addr(l), wsize);
+ popw_st(loc_addr(l));
}
DoSTLp2(arg)
LOG(("@S6 DoSTLp2(%ld)", l));
spoilFRA();
l = arg_l(l);
- pop_st(loc_addr(l), wsize);
+ popw_st(loc_addr(l));
}
DoSTLp4(arg)
LOG(("@S6 DoSTLp4(%ld)", l));
spoilFRA();
l = arg_l(l);
- pop_st(loc_addr(l), wsize);
+ popw_st(loc_addr(l));
}
DoSTLs(hob, wfac)
LOG(("@S6 DoSTLs(%ld)", l));
spoilFRA();
l = arg_l(l);
- pop_st(loc_addr(l), wsize);
+ popw_st(loc_addr(l));
}
DoSTEl2(arg)
LOG(("@S6 DoSTEl2(%lu)", p));
spoilFRA();
- pop_m(arg_g(p), wsize);
+ popw_m(arg_g(p));
}
DoSTEl4(arg)
LOG(("@S6 DoSTEl4(%lu)", p));
spoilFRA();
- pop_m(arg_g(p), wsize);
+ popw_m(arg_g(p));
}
DoSTEs(hob, wfac)
LOG(("@S6 DoSTEs(%lu)", p));
spoilFRA();
- pop_m(arg_g(p), wsize);
+ popw_m(arg_g(p));
}
DoSILn2(arg)
LOG(("@S6 DoSILn2(%ld)", l));
spoilFRA();
l = arg_l(l);
- pop_m(st_lddp(loc_addr(l)), wsize);
+ popw_m(st_lddp(loc_addr(l)));
}
DoSILn4(arg)
LOG(("@S6 DoSILn4(%ld)", l));
spoilFRA();
l = arg_l(l);
- pop_m(st_lddp(loc_addr(l)), wsize);
+ popw_m(st_lddp(loc_addr(l)));
}
DoSILp2(arg)
LOG(("@S6 DoSILp2(%ld)", l));
spoilFRA();
l = arg_l(l);
- pop_m(st_lddp(loc_addr(l)), wsize);
+ popw_m(st_lddp(loc_addr(l)));
}
DoSILp4(arg)
LOG(("@S6 DoSILp4(%ld)", l));
spoilFRA();
l = arg_l(l);
- pop_m(st_lddp(loc_addr(l)), wsize);
+ popw_m(st_lddp(loc_addr(l)));
}
DoSILs(hob, wfac)
LOG(("@S6 DoSILs(%ld)", l));
spoilFRA();
l = arg_l(l);
- pop_m(st_lddp(loc_addr(l)), wsize);
+ popw_m(st_lddp(loc_addr(l)));
}
DoSTFl2(arg)
LOG(("@S6 DoSTFl2(%ld)", l));
spoilFRA();
- pop_m(p + arg_f(l), wsize);
+ popw_m(p + arg_f(l));
}
DoSTFl4(arg)
LOG(("@S6 DoSTFl4(%ld)", l));
spoilFRA();
- pop_m(p + arg_f(l), wsize);
+ popw_m(p + arg_f(l));
}
DoSTFm(arg)
LOG(("@S6 DoSTFm(%ld)", l));
spoilFRA();
- pop_m(p + arg_f(l), wsize);
+ popw_m(p + arg_f(l));
}
DoSTFs(hob, wfac)
LOG(("@S6 DoSTFs(%ld)", l));
spoilFRA();
- pop_m(p + arg_f(l), wsize);
+ popw_m(p + arg_f(l));
}
DoSTIl2(arg)
DoSTSz() /* the arg 'w' is on top of stack */
{
/* STS w: Store indirect, w-byte integer on top of stack gives object size */
- register size l = upop(wsize);
+ register size l = uwpop();
register ptr p;
LOG(("@S6 DoSTSz(%ld)", l));
DoADUz()
{
/* ADU w: Addition */
- register size l = upop(wsize);
+ register size l = uwpop();
register unsigned long t = upop(arg_wi(l));
LOG(("@U6 DoADUz(%ld)", l));
DoSBUz()
{
/* SBU w: Subtraction */
- register size l = upop(wsize);
+ register size l = uwpop();
register unsigned long t = upop(arg_wi(l));
LOG(("@U6 DoSBUz(%ld)", l));
DoMLUz()
{
/* MLU w: Multiplication */
- register size l = upop(wsize);
+ register size l = uwpop();
register unsigned long t = upop(arg_wi(l));
LOG(("@U6 DoMLUz(%ld)", l));
DoDVUz()
{
/* DVU w: Division */
- register size l = upop(wsize);
+ register size l = uwpop();
register unsigned long t = upop(arg_wi(l));
LOG(("@U6 DoDVUz(%ld)", l));
DoRMUz()
{
/* RMU w: Remainder */
- register size l = upop(wsize);
+ register size l = uwpop();
register unsigned long t = upop(arg_wi(l));
LOG(("@U6 DoRMUz(%ld)", l));
{
/* SLU w: Shift left */
register size l = (L_arg_2() * arg);
- register unsigned long t = upop(wsize);
+ register unsigned long t = uwpop();
LOG(("@U6 DoSLUl2(%ld)", l));
spoilFRA();
DoSLUz()
{
/* SLU w: Shift left */
- register size l = upop(wsize);
- register unsigned long t = upop(wsize);
+ register size l = uwpop();
+ register unsigned long t = uwpop();
LOG(("@U6 DoSLUz(%ld)", l));
spoilFRA();
{
/* SRU w: Shift right */
register size l = (L_arg_2() * arg);
- register unsigned long t = upop(wsize);
+ register unsigned long t = uwpop();
LOG(("@U6 DoSRUl2(%ld)", l));
spoilFRA();
DoSRUz()
{
/* SRU w: Shift right */
- register size l = upop(wsize);
- register unsigned long t = upop(wsize);
+ register size l = uwpop();
+ register unsigned long t = uwpop();
LOG(("@U6 DoSRUz(%ld)", l));
spoilFRA();
}
else
if ( is_wordaligned(addr)
- && is_in_stack(addr, wsize)
+ && w_is_in_stack(addr)
&& std_bytes(addr, addr + wsize, SH_INT)
) {
/* print a word value */
/******** Checks on adresses and ranges ********/
#define is_aligned(a,n) ((p2i(a)) % (n) == 0)
-#define is_wordaligned(a) (((p2i(a)) & wsizem1) == 0)
+#define is_wordaligned(a) \
+ (((p2i(a)) & wsizem1) == 0)
#define ch_aligned(a,n) { if (!is_aligned(a, min(n, wsize))) \
{ trap(EBADPTR); } }
-#define ch_wordaligned(a) { if (!is_wordaligned(a)) \
+#define ch_wordaligned(a) \
+ { if (!is_wordaligned(a)) \
{ trap(EBADPTR); } }
#define in_gda(p) ((p) < HB)
#define is_in_stack(a,n) (SP <= (a) && (a) + (n) - 1 <= ML)
#define ch_in_stack(a,n) { if (!is_in_stack(a, n)) { trap(EMEMFLT); } }
+#define w_is_in_stack(a) (SP <= (a) && (a) + wsizem1 <= ML)
+#define ch_w_in_stack(a) { if (!w_is_in_stack(a)) { trap(EMEMFLT); } }
+
#define is_in_FRA(a,n) ((a) + (n) <= FRASize)
#define mem_lddp(a) (in_stack(a) ? st_lddp(a) : dt_lddp(a))
#define mem_ldip(a) (in_stack(a) ? st_ldip(a) : dt_ldip(a))
#define mem_ldu(a,n) (in_stack(a) ? st_ldu(a, n) : dt_ldu(a, n))
+#define mem_lduw(a) (in_stack(a) ? st_lduw(a) : dt_lduw(a))
#define mem_lds(a,n) (in_stack(a) ? st_lds(a, n) : dt_lds(a, n))
+#define mem_ldsw(a) (in_stack(a) ? st_ldsw(a) : dt_ldsw(a))
#define push_m(a,n) { if (in_stack(a)) push_st(a, n); else push_dt(a, n); }
+#define pushw_m(a) { if (in_stack(a)) pushw_st(a); else pushw_dt(a); }
#define pop_m(a,n) { if (in_stack(a)) pop_st(a, n); else pop_dt(a, n); }
+#define popw_m(a) { if (in_stack(a)) popw_st(a); else popw_dt(a); }
/******** Simple stack manipulation ********/
extern ptr st_ldip(), dt_ldip();
extern ptr st_lddp(), dt_lddp(), dppop();
-extern long st_lds(), dt_lds(), spop(), wpop();
-extern unsigned long st_ldu(), dt_ldu(), upop();
+extern long st_lds(), st_ldsw(), dt_lds(), dt_ldsw(), spop(), swpop(), wpop();
+extern unsigned long st_ldu(), st_lduw(), dt_ldu(), dt_lduw(), upop(), uwpop();
#define INT2SIZE max(wsize, 2L)
#define INT4SIZE max(wsize, 4L)
-#define pop_int() ((int) spop(wsize))
+#define pop_int() ((int) swpop())
#define pop_int2() ((int) spop(INT2SIZE))
#define pop_int4() (spop(INT4SIZE))
#define pop_intp() ((int) spop(psize))
case 1: /* m uninitialized words */
j = count;
while (j--) {
- dt_stn(pos, 0L, wsize);
+ dt_stw(pos, 0L);
pos += wsize;
}
break;
break;
case 3: /* m initialized wordsize integers */
for (j = 0; j < count; j++) {
- dt_stn(pos, rd_int(wsize), wsize);
+ dt_stw(pos, rd_int(wsize));
pos += wsize;
}
break;
{
register int i;
- if ((i = fgetc(load_fp)) == EOF)
+ if ((i = getc(load_fp)) == EOF)
fatal("EOF reached during initialization");
return (i);
}
int rsbcode;
{
/* fill Return Status Block */
- st_inc(rsbsize);
+ incSP((size)rsbsize);
st_stdp(SP + rsb_FIL, getFIL());
st_prot(SP + rsb_FIL, psize);
st_stn(SP + rsb_PI, PI, psize);
st_prot(SP + rsb_PI, psize);
- st_stn(SP + rsb_rsbcode, (long)rsbcode, wsize);
+ st_stw(SP + rsb_rsbcode, (long)rsbcode);
st_prot(SP + rsb_rsbcode, wsize);
newLB(SP);
newSP(LB);
/* get RSB code and test it for applicability */
- rsbcode = st_ldu(SP + rsb_rsbcode, wsize);
+ rsbcode = st_lduw(SP + rsb_rsbcode);
if ((rsbcode & RSBMASK) != RSBCODE) /* no RSB at all */
return rsbcode;
************************************************************************
* *
* newSP(p) - check and adjust StackPointer. *
+ * incSP(n) - increment stack pointer. n already checked *
+ * decSP(n) - decrement stack pointer. n already checked *
* newLB(p) - check and adjust Local Base and Actual Base *
* *
************************************************************************/
SP = p;
}
+incSP(n)
+#ifdef LOGGING
+ register
+#endif
+ size n;
+{
+ register ptr p = SP - n;
+
+ if (p < HP || maxstack || p < SL) newSP(p);
+ else {
+ LOG(("@s6 newSP(%lu), ML = %lu, SP = %lu", p, ML, SP));
+#ifdef LOGGING
+ /* inline version of st_clear_area.
+ */
+ SP = p;
+ {
+ while (n--) {
+ st_undef(p);
+ p++;
+ }
+ }
+#endif
+ }
+}
+
+decSP(n)
+ size n;
+{
+ register ptr p = SP + n;
+
+ if (LB < p) newSP(p);
+ else {
+ LOG(("@s6 newSP(%lu), ML = %lu, SP = %lu", p, ML, SP));
+ SP = p;
+ }
+}
+
newLB(p)
ptr p;
{
* st_stdp(addr, p) - STore Data Pointer. *
* st_stip(addr, p) - STore Instruction Pointer. *
* st_stn(addr, l, n) - STore N byte integer. *
+ * st_stw(addr, l) - STore wordsize integer. *
* st_stf(addr, f, n) - STore Floating point number. *
* *
************************************************************************/
}
}
+st_stw(addr, al)
+ register ptr addr;
+ long al;
+{
+ register int i;
+ register long l = al;
+#ifdef LOGGING
+ /* a psize zero is ambiguous */
+ int sh_flags = (l == 0 && wsize == psize) ? (SH_INT|SH_DATAP) : SH_INT;
+#endif
+
+ LOG(("@s6 st_stw(%lu, %ld)", addr, l));
+ ch_w_in_stack(addr);
+ ch_wordaligned(addr);
+
+ /* store the bytes */
+ for (i = (int) wsize; i > 0; i--, addr++) {
+ ch_st_prot(addr);
+ stack_loc(addr) = (char) l;
+#ifdef LOGGING
+ st_sh(addr) = sh_flags;
+#endif LOGGING
+ l = l>>8;
+ }
+}
+
#ifndef NOFLOAT
st_stf(addr, f, n)
register ptr addr;
* st_lddp(addr) - LoaD Data Pointer from stack. *
* st_ldip(addr) - LoaD Instruction Pointer from stack. *
* st_ldu(addr, n) - LoaD n Unsigned bytes from stack. *
+ * st_lduw(addr) - LoaD wsize Unsigned bytes from stack. *
* st_lds(addr, n) - LoaD n Signed bytes from stack. *
+ * st_ldsw(addr) - LoaD wsize Signed bytes from stack. *
* st_ldf(addr, n) - LoaD Floating point number from stack. *
* *
************************************************************************/
}
#endif LOGGING
- for (i = (int) n-1; i >= 0; i--) {
- u = (u<<8) | (btou(stack_loc(addr + i)));
+ addr += n-1;
+ for (i = (int) n-1; i >= 0; i--, addr--) {
+ u = (u<<8) | (btou(stack_loc(addr)));
}
LOG(("@s6 st_ldu() returns %ld", u));
return (u);
}
+unsigned long st_lduw(addr)
+ register ptr addr;
+{
+ register int i;
+ register unsigned long u = 0;
+
+ LOG(("@s6 st_lduw(%lu)", addr));
+
+ ch_w_in_stack(addr);
+ ch_wordaligned(addr);
+#ifdef LOGGING
+ if (!is_st_set(addr, wsize, SH_INT)) {
+ warning(WLIEXP);
+ warn_stbits(addr, wsize);
+ }
+#endif LOGGING
+
+ addr += wsize - 1;
+ for (i = (int) wsize-1; i >= 0; i--, addr--) {
+ u = (u<<8) | (btou(stack_loc(addr)));
+ }
+ LOG(("@s6 st_lduw() returns %ld", u));
+ return (u);
+}
+
long st_lds(addr, n)
register ptr addr;
size n;
}
#endif LOGGING
- l = btos(stack_loc(addr + n - 1));
- for (i = n - 2; i >= 0; i--) {
- l = (l<<8) | btol(stack_loc(addr + i));
+ addr += n - 2;
+ l = btos(stack_loc(addr + 1));
+ for (i = n - 2; i >= 0; i--, addr--) {
+ l = (l<<8) | btol(stack_loc(addr));
}
LOG(("@s6 st_lds() returns %ld", l));
return (l);
}
+long st_ldsw(addr)
+ register ptr addr;
+{
+ register int i;
+ register long l;
+
+ LOG(("@s6 st_ldsw(%lu)", addr));
+
+ ch_w_in_stack(addr);
+ ch_wordaligned(addr);
+#ifdef LOGGING
+ if (!is_st_set(addr, wsize, SH_INT)) {
+ warning(WLIEXP);
+ warn_stbits(addr, wsize);
+ }
+#endif LOGGING
+
+ addr += wsize - 2;
+ l = btos(stack_loc(addr+1));
+ for (i = wsize - 2; i >= 0; i--, addr--) {
+ l = (l<<8) | btol(stack_loc(addr));
+ }
+ LOG(("@s6 st_ldsw() returns %ld", l));
+ return (l);
+}
+
#ifndef NOFLOAT
double st_ldf(addr, n)
register ptr addr;
* *
* dppop() - pop a data ptr, return a ptr. *
* upop(n) - pop n unsigned bytes, return a long. *
+ * uwpop() - pop wsize unsigned bytes, return a long. *
* spop(n) - pop n signed bytes, return a long. *
+ * swpop() - pop wsize signed bytes, return a long. *
* pop_dt(d, n) - pop n bytes, store at address d in data. *
+ * popw_dt(d) - pop wsize bytes, store at address d in data. *
* pop_st(s, n) - pop n bytes, store at address s in stack. *
+ * popw_st(s) - pop wsize bytes, store at address s in stack. *
* fpop() - pop a floating point number. *
* wpop() - pop a signed word, don't care about any type. *
* *
register ptr p;
p = st_lddp(SP);
- st_dec(psize);
+ decSP(psize);
LOG(("@s7 dppop(), return: %lu", p));
return (p);
}
register unsigned long l;
l = st_ldu(SP, n);
- st_dec(max(n, wsize));
+ decSP(max(n, wsize));
LOG(("@s7 upop(), return: %lu", l));
return (l);
}
+unsigned long uwpop()
+{
+ register unsigned long l;
+
+ l = st_lduw(SP);
+ decSP(wsize);
+ LOG(("@s7 uwpop(), return: %lu", l));
+ return (l);
+}
+
long spop(n)
size n;
{
register long l;
l = st_lds(SP, n);
- st_dec(max(n, wsize));
+ decSP(max(n, wsize));
LOG(("@s7 spop(), return: %ld", l));
return (l);
}
+long swpop()
+{
+ register long l;
+
+ l = st_ldsw(SP);
+ decSP(wsize);
+ LOG(("@s7 swpop(), return: %ld", l));
+ return (l);
+}
+
pop_dt(d, n)
ptr d;
size n;
dt_stn(d, (long) upop(n), n);
else {
dt_mvs(d, SP, n);
- st_dec(n);
+ decSP(n);
}
}
+popw_dt(d)
+ ptr d;
+{
+ dt_mvs(d, SP, wsize);
+ decSP(wsize);
+}
+
pop_st(s, n)
ptr s;
size n;
st_stn(s, (long) upop(n), n);
else {
st_mvs(s, SP, n);
- st_dec(n);
+ decSP(n);
}
}
+popw_st(s)
+ ptr s;
+{
+ st_mvs(s, SP, wsize);
+ decSP(wsize);
+}
+
#ifndef NOFLOAT
double fpop(n)
size n;
double d;
d = st_ldf(SP, n);
- st_dec(n);
+ decSP(n);
return (d);
}
#endif NOFLOAT
register long l;
l = w_in_stack(SP);
- st_dec(wsize);
+ decSP(wsize);
return (l);
}
* wpush(l) - push a word, load from l. *
* npush(l, n) - push n bytes, load from l. *
* push_dt(d, n) - push n bytes, load from address d in data. *
+ * pushw_dt(d) - push wsize bytes, load from address d in data.*
* push_st(s, n) - push n bytes, load from address s in stack. *
+ * pushw_st(s) - push wsize bytes, load from address s in stack.*
* fpush(f, n) - push a floating point number, of size n. *
* *
************************************************************************/
dppush(p)
ptr p;
{
- st_inc(psize);
+ incSP(psize);
st_stdp(SP, p);
}
wpush(l)
long l;
{
- st_inc(wsize);
- st_stn(SP, l, wsize);
+ incSP(wsize);
+ st_stw(SP, l);
}
npush(l, n)
register long l;
- size n;
+ register size n;
{
- size m = max(n, wsize);
-
- st_inc(m);
- if (n == 1)
- l &= MASK1;
- else
- if (n == 2)
- l &= MASK2;
- st_stn(SP, l, m);
-
+ if (n <= wsize) {
+ incSP(wsize);
+ if (n == 1) l &= MASK1;
+ else if (n == 2) l &= MASK2;
+ st_stw(SP, l);
+ }
+ else {
+ incSP(n);
+ st_stn(SP, l, n);
+ }
}
push_dt(d, n)
npush((long) dt_ldu(d, n), n);
}
else {
- st_inc(n);
+ incSP(n);
st_mvd(SP, d, n);
}
}
+pushw_dt(d)
+ ptr d;
+{
+ incSP(wsize);
+ st_mvd(SP, d, wsize);
+}
+
push_st(s, n)
ptr s;
size n;
npush((long) st_ldu(s, n), n);
}
else {
- st_inc(n);
+ incSP(n);
st_mvs(SP, s, n);
}
}
+pushw_st(s)
+ ptr s;
+{
+ incSP(wsize);
+ st_mvs(SP, s, wsize);
+}
+
#ifndef NOFLOAT
fpush(f, n)
double f;
size n;
{
- st_inc(n);
+ incSP(n);
st_stf(SP, f, n);
}
#endif NOFLOAT