/* ** $Id: lopcodes.h,v 1.59 2000/04/14 17:45:25 roberto Exp roberto $ ** Opcodes for Lua virtual machine ** See Copyright Notice in lua.h */ #ifndef lopcodes_h #define lopcodes_h #include "llimits.h" /*=========================================================================== We assume that instructions are unsigned numbers. All instructions have an opcode in the first 6 bits. Moreover, an instruction can have 0, 1, or 2 arguments. Instructions can have the following types: type 0: no arguments type 1: 1 unsigned argument in the higher bits (called `U') type 2: 1 signed argument in the higher bits (`S') type 3: 1st unsigned argument in the higher bits (`A') 2nd unsigned argument in the middle bits (`B') A signed argument is represented in excess K; that is, the number value is the unsigned value minus K. K is exactly the maximum value for that argument (so that -max is represented by 0, and +max is represented by 2*max), which is half the maximum for the corresponding unsigned argument. The size of each argument is defined in `llimits.h'. The usual is an instruction with 32 bits, U arguments with 26 bits (32-6), B arguments with 9 bits, and A arguments with 17 bits (32-6-9). For small instalations, the instruction size can be 16, so U has 10 bits, and A and B have 5 bits each. ===========================================================================*/ /* creates a mask with `n' 1 bits at position `p' */ #define MASK1(n,p) ((~((~(Instruction)0)<>POS_U)) #define SETARG_U(i,u) ((i) = (((i)&MASK0(SIZE_U,POS_U)) | \ ((Instruction)(u)<>POS_A)) #define SETARG_A(i,a) ((i) = (((i)&MASK0(SIZE_A,POS_A)) | \ ((Instruction)(a)<>POS_B) & MASK1(SIZE_B,0))) #define SETARG_B(i,b) ((i) = (((i)&MASK0(SIZE_B,POS_B)) | \ ((Instruction)(b)<y)? PC+=s */ OP_JMPGE,/* J y x - (x>=y)? PC+=s */ OP_JMPT,/* J x - (x~=nil)? PC+=s */ OP_JMPF,/* J x - (x==nil)? PC+=s */ OP_JMPONT,/* J x (x~=nil)? x : - (x~=nil)? PC+=s */ OP_JMPONF,/* J x (x==nil)? x : - (x==nil)? PC+=s */ OP_JMP,/* J - - PC+=s */ OP_PUSHNILJMP,/* - - nil PC++; */ OP_FORPREP,/* J */ OP_FORLOOP,/* J */ OP_CLOSURE,/* A B v_b-v_1 closure(KPROTO[a], v_1-v_b) */ OP_SETLINE/* U - - LINE=u */ } OpCode; #define ISJUMP(o) (OP_JMPNE <= (o) && (o) <= OP_JMP) #endif