// gen-threaded.h -- direct-threaded code generation -*- C++ -*- // // Author: Ian.Piumarta@inria.fr // // Last edited: Thu Feb 25 19:59:29 1999 by piumarta (Ian Piumarta) on pingu /// /// INTERNAL /// #define _ARGSEL(ARGCNT, SELIDX) (((ARGCNT) << 16) | (SELIDX)) #define _SPLSEL(SELIDX) _ARGSEL(255, (SELIDX)) // a LOUSY encoding #define _genTrace(insn) \ PRINTF((" +%03d %03x %s\n", nPC - code, insn+256, bcNames[insn+256])) #define _genInsn(insn) { \ _genTrace(insn); if (pass) { *(int *)nPC= (int)OP(insn); } nPC+= 4; \ } #define _genExtn(extn) { \ if (pass) { *(int *)nPC= (int)(extn); } nPC+= 4; \ } #define _genDest(dest) { \ if (pass) *(int *)nPC= (int)(code + pcMap->nPC(dest)); \ nPC+= 4; \ } #define _gen0(I) { _genInsn(I); } #define _gen1(I,A) { _genInsn(I); _genExtn(A); } #define _genJ(J,D) { _genInsn(J); _genDest(D); } #define _gen2(I,A,B) { _genInsn(I); _genExtn(A); _genExtn(B); } /// /// EXTERNAL /// #include "opcodes.h" // prologue #define genCheckClass() _gen0(OpCheckClass) #define genCheckCompact() _gen0(OpCheckCompact) #define genCheckImmediate() _gen0(OpCheckImmediate) // DEPRECATED!!! #define genCheckImmediate_0_0() _gen0(OpCheckImmediate_0_0) // primitive and quick response #define genPrimitivePushSelf() _gen0(OpPrimitivePushSelf) #define genPrimitivePushTrue() _gen0(OpPrimitivePushTrue) #define genPrimitivePushFalse() _gen0(OpPrimitivePushFalse) #define genPrimitivePushNil() _gen0(OpPrimitivePushNil) #define genPrimitivePushMinusOne() _gen0(OpPrimitivePushMinusOne) #define genPrimitivePushZero() _gen0(OpPrimitivePushZero) #define genPrimitivePushOne() _gen0(OpPrimitivePushOne) #define genPrimitivePushTwo() _gen0(OpPrimitivePushTwo) #define genPrimitiveLoadInstVar(IDX) _gen1(OpPrimitiveLoadInstVar, (IDX)) // plain primitive methods #define genPrimitive(IDX) _gen1(OpPrimitive, (IDX)) // non-activated methods #define genQkActivate(NARGS) _gen1(OpQkActivate, (NARGS)) #define genQkRetSelf() _gen0(OpQkRetSelf) #define genQkRetTrue() _gen0(OpQkRetTrue) #define genQkRetFalse() _gen0(OpQkRetFalse) #define genQkRetNil() _gen0(OpQkRetNil) #define genQkRetTop() _gen0(OpQkRetTop) // activated methods #define genActivate(NARGS) _gen1(OpActivate, (NARGS)) #define genReserve(NTEMPS) _gen1(OpReserve, (NTEMPS)) // regular opcodes #define genLdInst(IDX) _gen1(OpLdInst, (IDX)) #define genLdTemp(IDX) _gen1(OpLdTemp, (IDX)) #define genLdLit(IDX) _gen1(OpLdLit, (IDX)) #define genLdLitInd(IDX) _gen1(OpLdLitInd, (IDX)) #define genStInst(IDX) _gen1(OpStInst, (IDX)) #define genStTemp(IDX) _gen1(OpStTemp, (IDX)) #define genStLitInd(IDX) _gen1(OpStLitInd, (IDX)) #define genPopInst(IDX) _gen1(OpPopInst, (IDX)) #define genPopTemp(IDX) _gen1(OpPopTemp, (IDX)) #define genPopLitInd(IDX) _gen1(OpPopLitInd, (IDX)) #define genLdSelf() _gen0(OpLdSelf) #define genLdTrue() _gen0(OpLdTrue) #define genLdFalse() _gen0(OpLdFalse) #define genLdNil() _gen0(OpLdNil) #define genLdMinusOne() _gen0(OpLdMinusOne) #define genLdZero() _gen0(OpLdZero) #define genLdOne() _gen0(OpLdOne) #define genLdTwo() _gen0(OpLdTwo) #define genRetSelf() _gen0(OpRetSelf) #define genRetTrue() _gen0(OpRetTrue) #define genRetFalse() _gen0(OpRetFalse) #define genRetNil() _gen0(OpRetNil) #define genMethodRet() _gen0(OpMethodRet) #define genBlockRet() _gen0(OpBlockRet) #define genSend(NA, SI) _gen2(OpSend, _ARGSEL((NA),(SI)), 0) #define genSuper(NA, SI) _gen2(OpSuper, _ARGSEL((NA),(SI)), 0) #define genPop() _gen0(OpPop) #define genDup() _gen0(OpDup) #define genLdThisContext() _gen0(OpLdThisContext) #define genJmp(DEST) _genJ(OpJmp, (DEST)) #define genJmpChk(DEST) _genJ(OpJmpChk, (DEST)) #define genJmpF(DEST) _genJ(OpJmpF, (DEST)) #define genJmpT(DEST) _genJ(OpJmpT, (DEST)) // special sends (this is RIDICULOUS: need generic special send mechanism) #define genAdd() _gen0(OpAdd) #define genSubtract() _gen0(OpSubtract) #define genLess() _gen0(OpLess) #define genGreater() _gen0(OpGreater) #define genLessEqual() _gen0(OpLessEqual) #define genGreaterEqual() _gen0(OpGreaterEqual) #define genEqual() _gen0(OpEqual) #define genNotEqual() _gen0(OpNotEqual) #define genMultiply() _gen0(OpMultiply) #define genDivide() _gen0(OpDivide) #define genMod() _gen0(OpMod) #define genMkPoint() _gen2(OpSend, _SPLSEL(11), 0) #define genBitShift() _gen2(OpSend, _SPLSEL(12), 0) #define genDiv() _gen0(OpDiv) #define genBitAnd() _gen2(OpSend, _SPLSEL(14), 0) #define genBitOr() _gen2(OpSend, _SPLSEL(15), 0) #define genAt() _gen0(OpAt) #define genAtPut() _gen0(OpAtPut) #define genSize() _gen2(OpSend, _SPLSEL(18), 0) #define genNext() _gen2(OpSend, _SPLSEL(19), 0) #define genNextPut() _gen2(OpSend, _SPLSEL(20), 0) #define genAtEnd() _gen2(OpSend, _SPLSEL(21), 0) #define genEquivalent() _gen0(OpEquivalent) #define genClass() _gen0(OpClass) #define genBlockCopy() _gen0(OpBlockCopy) #define genValue() _gen2(OpSend, _SPLSEL(25), 0) #define genValueArgs() _gen2(OpSend, _SPLSEL(26), 0) #define genDo() _gen2(OpSend, _SPLSEL(27), 0) #define genNew() _gen2(OpSend, _SPLSEL(28), 0) #define genNewArg() _gen2(OpSend, _SPLSEL(29), 0) #define genX() _gen2(OpSend, _SPLSEL(30), 0) #define genY() _gen2(OpSend, _SPLSEL(31), 0)