123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213 |
- /*
- * Sources of the "LOAD" group instructions
- */
- /* $Id$ */
- #include <em_abs.h>
- #include "global.h"
- #include "log.h"
- #include "mem.h"
- #include "trap.h"
- #include "text.h"
- #include "fra.h"
- #include "rsb.h"
- #include "warn.h"
- PRIVATE ptr lexback_LB();
- DoLOC(l)
- register long l;
- {
- /* LOC c: Load constant (i.e. push one word onto the stack) */
- LOG(("@L6 DoLOC(%ld)", l));
- spoilFRA();
- wpush(arg_c(l));
- }
- DoLDC(l)
- register long l;
- {
- /* LDC d: Load double constant ( push two words ) */
- LOG(("@L6 DoLDC(%ld)", l));
- spoilFRA();
- l = arg_d(l);
- npush(l, dwsize);
- }
- DoLOL(l)
- register long l;
- {
- /* LOL l: Load word at l-th local (l<0) or parameter (l>=0) */
- LOG(("@L6 DoLOL(%ld)", l));
- spoilFRA();
- l = arg_l(l);
- pushw_st(loc_addr(l));
- }
- DoLOE(arg)
- register long arg;
- {
- /* LOE g: Load external word g */
- register ptr p = i2p(arg);
- LOG(("@L6 DoLOE(%lu)", p));
- spoilFRA();
- pushw_m(arg_g(p));
- }
- DoLIL(l)
- register long l;
- {
- /* LIL l: Load word pointed to by l-th local or parameter */
- LOG(("@L6 DoLIL(%ld)", l));
- spoilFRA();
- l = arg_l(l);
- pushw_m(st_lddp(loc_addr(l)));
- }
- DoLOF(l)
- register long l;
- {
- /* LOF f: Load offsetted (top of stack + f yield address) */
- register ptr p = dppop();
- LOG(("@L6 DoLOF(%ld)", l));
- spoilFRA();
- pushw_m(p + arg_f(l));
- }
- DoLAL(l)
- register long l;
- {
- /* LAL l: Load address of local or parameter */
- LOG(("@L6 DoLAL(%ld)", l));
- spoilFRA();
- l = arg_l(l);
- dppush(loc_addr(l));
- }
- DoLAE(arg)
- register unsigned long arg;
- {
- /* LAE g: Load address of external */
- register ptr p = i2p(arg);
- LOG(("@L6 DoLAE(%lu)", p));
- spoilFRA();
- dppush(arg_lae(p));
- }
- DoLXL(l)
- register unsigned long l;
- {
- /* LXL n: Load lexical (address of LB n static levels back) */
- register ptr p;
- LOG(("@L6 DoLXL(%lu)", l));
- spoilFRA();
- l = arg_n(l);
- p = lexback_LB(l);
- dppush(p);
- }
- DoLXA(l)
- register unsigned long l;
- {
- /* LXA n: Load lexical (address of AB n static levels back) */
- register ptr p;
- LOG(("@L6 DoLXA(%lu)", l));
- spoilFRA();
- l = arg_n(l);
- p = lexback_LB(l);
- dppush(p + rsbsize);
- }
- DoLOI(l)
- register size l;
- {
- /* LOI o: Load indirect o bytes (address is popped from the stack) */
- register ptr p = dppop();
- LOG(("@L6 DoLOI(%ld)", l));
- spoilFRA();
- l = arg_o(l);
- push_m(p, l);
- }
- DoLOS(l)
- register size l;
- {
- /* LOS w: Load indirect, w-byte integer on top of stack gives object size */
- register ptr p;
- LOG(("@L6 DoLOS(%ld)", l));
- spoilFRA();
- l = arg_wi(l);
- l = upop(l);
- p = dppop();
- push_m(p, arg_o(l));
- }
- DoLDL(l)
- register long l;
- {
- /* LDL l: Load double local or parameter (two consecutive words are stacked) */
- LOG(("@L6 DoLDL(%ld)", l));
- spoilFRA();
- l = arg_l(l);
- push_st(loc_addr(l), dwsize);
- }
- DoLDE(arg)
- register long arg;
- {
- /* LDE g: Load double external (two consecutive externals are stacked) */
- register ptr p = i2p(arg);
- LOG(("@L6 DoLDE(%lu)", p));
- spoilFRA();
- push_m(arg_g(p), dwsize);
- }
- DoLDF(l)
- register long l;
- {
- /* LDF f: Load double offsetted (top of stack + f yield address) */
- register ptr p = dppop();
- LOG(("@L6 DoLDF(%ld)", l));
- spoilFRA();
- push_m(p + arg_f(l), dwsize);
- }
- DoLPI(pi)
- register long pi;
- {
- /* LPI p: Load procedure identifier */
- LOG(("@L6 DoLPI(%ld)", pi));
- spoilFRA();
- npush(arg_p(pi), psize);
- }
- PRIVATE ptr lexback_LB(n)
- unsigned long n;
- {
- /* LB n static levels back */
- register ptr lb = LB;
-
- while (n != 0) {
- lb = st_lddp(lb + rsbsize);
- n--;
- }
- return lb;
- }
|