:Title[LBIND.mc, December 6, 1982 1:05 PM, Masinter]; *-------------------------------------------------------------------- * BIND, UNBIND, DUNBIND opcodes *-------------------------------------------------------------------- knowrbase[LTemp0]; top level; InsSet[LispInsSet, 1]; *-------------------------------------------------------------------- opBIND: *-------------------------------------------------------------------- * Binds n1 pvars to NIL and * n2 pvars to the n2 items on the stack * Last pvar stored into is N * pushes binding mark [-(n1+n2)-1,, 2*N] T_ LTEMP0_ Id; * n1 (first 4 bits) #NILs LTEMP1_ Id, Cnt_ T; * n2 (next 4 bits) #values T_ (Id) lsh 1; * 2*N T_ (PVAR) + (Q_ T); branch[.endBindNils, Cnt=0&-1], LTEMP2_ T + 1; .BindVarToNil: LTEMP2_ (store_ LTEMP2) - 1, DBuf_ AT.NIL; LTEMP2_ (store_ LTEMP2) - 1, DBuf_ 0c, branch[.BindVarToNil,Cnt#0&-1]; .endBindNils: Cnt_ LTEMP1, T_ LTEMP1; * #values to bind LEFT_ (LEFT) + T; .BindVarToVal: T_ (TSP) - 1, branch[.EndBind, Cnt=0&-1]; TSP_ (fetch_ T) - 1; T_ Md, (fetch_ TSP); T_ Md, LTEMP2_ (store_ LTEMP2) - 1, dbuf_ T; LTEMP2_ (store_ LTEMP2) - 1, DBuf_ T, branch[.BindVarToVal]; .EndBind: T_ (0s) - (LTEMP1); * -N2 T_ T - (LTEMP0) - 1, branch[PUSHTQOK]; * -N1-N2-1 IFUreg[21, 3, StackBR, 0, opBIND, noNData, 0, 1]; *-------------------------------------------------------------------- opUNBIND: *-------------------------------------------------------------------- T_ (fetch_ TSP) - 1, flipMemBase; LTEMP0_ Md, T_ (fetch_ T) - 1, flipMemBase; TSP_ T, Q_ Md; opDUNBIND: T_ TSP_ (fetch_ TSP) - (2c); LTEMP1_ Md, T_ T + 1; branch[opDUNBIND, R>=0], LTEMP1, LTEMP1_ not (LTEMP1); * T points (relative to StackM2) to the odd word * LTEMP2 LTEMP2 has (n1+n2) flipMemBase; fetch_ T; Cnt_ LTEMP1; T_ (PVAR) + (Md) + 1; .unbindvar: branch[.unbindend, Cnt=0&-1], T_ T - 1; :if[Debugging]; * check if slot was not bound fetch _ T; pd _ Md; branch[.+2, alu>=0]; uCodeCheck[UnBindNotBound]; :endif; T_ (store_ T) - 1, dbuf_ AllOnes, branch[.unbindvar]; .unbindend: call[FIXLEFT]; pd_ Id; branch[.wasUnbind, alu=0], T_ LTEMP0; * Id=0 for unbind NextOpCode; .wasUnBind: branch[PUSHTQ]; regOP1[22, StackM2BR, opUNBIND, 0]; * UNBIND regOP1[23, StackM2BR, opDUNBIND, 1]; * DUNBIND (635)\f8