/* SuperCollider real time audio synthesis system Copyright (c) 2002 James McCartney. All rights reserved. http://www.audiosynth.com This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #ifndef _OPCODES_H_ #define _OPCODES_H_ /* opcodes */ enum { opExtended, // 0 opPushInstVar, opPushTempVar, opPushTempZeroVar, opPushLiteral, opPushClassVar, // 5 opPushSpecialValue, opStoreInstVar, opStoreTempVar, opStoreClassVar, opSendMsg, // 10 opSendSuper, opSendSpecialMsg, opSendSpecialUnaryArithMsg, opSendSpecialBinaryArithMsg, opSpecialOpcode, // 15 opNumOpcodes }; /* special opcodes */ enum { opcDrop, // 0 opcDup, opcFunctionReturn, opcReturn, opcReturnSelf, opcReturnTrue, // 5 opcReturnFalse, opcReturnNil, opcJumpIfFalse, // IF 3 args opcJumpIfFalsePushNil, // IF 2 args opcJumpIfFalsePushFalse, // AND: (10) opcJumpIfTruePushTrue, // OR: opcJumpFwd, opcJumpBak, opcSpecialBinaryOpWithAdverb, opcSuperNew, // 15 opcNewList, opcNumSpecialOpcodes /* opcSlotAt, opcByteAt, // 15 opcShortAt, opcInt32At, opcColorAt, opcFloatAt, opcDoubleAt */ }; /* special unary math operators */ enum { opNeg, opNot, opIsNil, opNotNil, opBitNot, opAbs, opAsFloat, opAsInt, opCeil, //5 opFloor, opFrac, opSign, opSquared, opCubed, //10 opSqrt, opExp, opRecip, opMIDICPS, opCPSMIDI, //15 opMIDIRatio, opRatioMIDI, opDbAmp, opAmpDb, opOctCPS, //20 opCPSOct, opLog, opLog2, opLog10, opSin, //25 opCos, opTan, opArcSin, opArcCos, opArcTan, opSinH, opCosH, //30 opTanH, opRand, opRand2, opLinRand, opBiLinRand, // opExpRand, // opBiExpRand, opSum3Rand, // opGammaRand, // opGaussRand, // opPoiRand, opDistort, opSoftClip, opCoin, opDigitValue, opSilence, opThru, opRectWindow, opHanWindow, opWelchWindow, opTriWindow, opRamp, opSCurve, opNumUnarySelectors }; #define IS_UNARY_BOOL_OP(op) ((op)>=opCoin && (op)<=opOdd) #define IS_BINARY_BOOL_OP(op) ((op)>=opEQ && (op)<=opGE) /* special binary math operators */ enum { opAdd, opSub, opMul, opIDiv, opFDiv, opMod, opEQ, opNE, opLT, opGT, opLE, opGE, //opIdentical, //opNotIdentical, opMin, opMax, opBitAnd, opBitOr, opBitXor, opLCM, opGCD, opRound, opRoundUp, opTrunc, opAtan2, opHypot, opHypotx, opPow, opShiftLeft, opShiftRight, opUnsignedShift, opFill, opRing1, // a * (b + 1) == a * b + a opRing2, // a * b + a + b opRing3, // a*a*b opRing4, // a*a*b - a*b*b opDifSqr, // a*a - b*b opSumSqr, // a*a + b*b opSqrSum, // (a + b)^2 opSqrDif, // (a - b)^2 opAbsDif, // |a - b| opThresh, opAMClip, opScaleNeg, opClip2, opExcess, opFold2, opWrap2, opFirstArg, opRandRange, opExpRandRange, opNumBinarySelectors }; /* other special math operators */ enum { /* 3 operands */ opDivz, opClip, opWrap, opFold, opRampMult, opMix, /* 4 operands */ opPoly3, /* 5 operands */ opMapRange }; enum { opmNew, // 0 opmInit, opmAt, opmPut, opmNext, opmReset, // 5 opmValue, opmCopyToEnd, // used by multi assign opmAdd, // used by dynamic list //opmIsNil, //opmNotNil, // 10 opmSize, opmClass, opmIf, opmWhile, opmFor, // 15 opmAnd, opmOr, opmIdentical, opmNotIdentical, opmPrint, // 20 opmRemove, opmIndexOf, opmWrapAt, opmClipAt, opmFoldAt, // 25 opmWrapPut, opmClipPut, opmFoldPut, opmDo, opmCollect, // 30 opmSelect, opmReject, opmAny, opmEvery, opmFind, opmChoose, opmValueList, opmAddFirst, opmPrimitiveFailed, opmSubclassResponsibility, opmShouldNotImplement, opmNotYetImplemented, opmDoesNotUnderstand, opmAtSign, opmWrapAtSign, opmClipAtSign, opmFoldAtSign, opmNewClear, opmNewCopyArgs, opmMultiNew, opmMultiNewList, opmAR, opmKR, opmIR, opmCopy, opmPerformList, opmIsKindOf, opmPostln, opmAsString, opmEnvirGet, opmEnvirPut, opmHalt, opmForBy, opmReverseDo, opmLoop, opmNonBooleanError, opmPlusPlus, opmLTLT, opmQuestionMark, opmDoubleQuestionMark, opmYield, opmName, opmMulAdd, opmNumSpecialSelectors }; enum { opsvSelf, // 0 opsvMinusOne, opsvNegOne, opsvZero, opsvOne, opsvTwo, // 5 opsvFHalf, opsvFNegOne, opsvFZero, opsvFOne, opsvFTwo, // 10 opsvPlusOne, opsvTrue, opsvFalse, opsvNil, opsvInf, // 15 opsvNumSpecialValues }; enum { opgProcess, opgMethod, opgFunctionDef, opgFunction, opgThread, //opgSampleRate, //opgAudioClock, //opgLogicalClock, opgNumPseudoVars }; /* selector types */ enum { selNormal, selSpecial, selUnary, selBinary, selIf, selWhile, selAnd, selOr, selLoop, selSuperNew, selNumSelectorTypes }; /* special classes: Object, List, Number, Int, Float, Signal, Complex, Point */ enum { op_class_object, op_class_symbol, op_class_nil, op_class_boolean, op_class_true, op_class_false, op_class_magnitude, op_class_char, op_class_number, op_class_complex, op_class_simple_number, op_class_int, op_class_float, op_class_method, op_class_fundef, op_class_stream, op_class_func, op_class_frame, op_class_process, op_class_main, op_class_class, op_class_string, op_class_collection, op_class_sequenceable_collection, op_class_arrayed_collection, op_class_array, op_class_int8array, op_class_int16array, op_class_int32array, op_class_floatarray, op_class_signal, op_class_doublearray, op_class_symbolarray, op_class_list, op_class_linkedlist, op_class_bag, op_class_set, op_class_identityset, op_class_dictionary, op_class_identitydictionary, op_class_sortedlist, op_class_synth, op_class_ref, op_class_environment, op_class_wavetable, op_class_env, op_class_routine, op_class_color, op_class_rect, op_NumSpecialClasses }; #endif