Main Page | Class List | Directories | File List | Class Members | File Members

opcodes.h

Go to the documentation of this file.
00001 /*
00002 || This file is part of Pike. For copyright information see COPYRIGHT.
00003 || Pike is distributed under GPL, LGPL and MPL. See the file COPYING
00004 || for more information.
00005 || $Id: opcodes.h,v 1.41 2004/10/30 11:38:27 mast Exp $
00006 */
00007 
00008 #ifndef OPCODES_H
00009 #define OPCODES_H
00010 
00011 #include "pikecode.h"
00012 
00013 /* To provide the cast and sscanf declarations for compatibility. */
00014 #include "operators.h"
00015 #include "sscanf.h"
00016 
00017 struct keyword
00018 {
00019   const char *word;
00020   const int token;
00021   const int flags;
00022 #ifdef PIKE_USE_MACHINE_CODE
00023   void *address;
00024 #endif
00025 };
00026 
00027 /*
00028  * Instruction flags
00029  *
00030  * Flags used to classify the instructions.
00031  *
00032  * Note that branches that take arguments use an immediately
00033  * following F_POINTER instruction to hold the destination
00034  * address.
00035  */
00036 #define I_HASARG        1       /* Instruction has a parameter. */
00037 #define I_POINTER       2       /* arg is a label number. */
00038 #define I_JUMP          4       /* Instruction performs a jump. */
00039 #define I__DATA         8       /* Instruction is raw data (data, byte)*/
00040 #define I_HASARG2       16      /* Instruction has a second parameter. */
00041 #define I_HASPOINTER    32      /* Instruction is followed by a F_POINTER. */
00042 #define I_BRANCH        128     /* Opcode either jumps to the address
00043                                  * given by I_POINTER/I_HASPOINTER or
00044                                  * continues. */
00045 /* The following are useful for the code generator.
00046  * Note that they apply to the change of state as seen
00047  * by the immediately following instruction.
00048  */
00049 #define I_UPDATE_SP     256     /* Opcode modifies Pike_sp */
00050 #define I_UPDATE_FP     512     /* Opcode modifies Pike_fp */
00051 #define I_UPDATE_M_SP   1024    /* Opcode modifies Pike_mark_sp */
00052 
00053 /* Convenience variants */
00054 #define I_TWO_ARGS      (I_HASARG | I_HASARG2)
00055 #define I_DATA          (I_HASARG | I__DATA)
00056 #define I_ISPOINTER     (I_HASARG | I_POINTER)  /* Only F_POINTER */
00057 #define I_ISJUMP        (I_JUMP)
00058 #define I_ISJUMPARG     (I_HASARG | I_JUMP)
00059 #define I_ISJUMPARGS    (I_TWO_ARGS | I_JUMP)
00060 #define I_ISPTRJUMP     (I_HASARG | I_POINTER | I_JUMP)
00061 #define I_ISPTRJUMPARG  (I_HASARG | I_HASPOINTER | I_JUMP)
00062 #define I_ISPTRJUMPARGS (I_TWO_ARGS | I_HASPOINTER | I_JUMP)
00063 #define I_ISBRANCH      (I_HASARG | I_POINTER | I_JUMP | I_BRANCH)
00064 #define I_ISBRANCHARG   (I_HASARG | I_HASPOINTER | I_JUMP | I_BRANCH)
00065 #define I_ISBRANCHARGS  (I_TWO_ARGS | I_HASPOINTER | I_JUMP | I_BRANCH)
00066 #define I_IS_MASK       (I_TWO_ARGS | I_POINTER | I_HASPOINTER | I_JUMP)
00067 
00068 #define I_UPDATE_ALL    (I_UPDATE_SP | I_UPDATE_FP | I_UPDATE_M_SP)
00069 
00070 /* Valid masked flags:
00071  *
00072  * 0                    Generic instruction without immediate arguments.
00073  * I_HAS_ARG            Generic instruction with one argument.
00074  * I_TWO_ARGS           Generic instruction with two arguments.
00075  * I_DATA               Raw data (F_BYTE or F_DATA).
00076  * I_ISPOINTER          Raw jump address (F_POINTER).
00077  * I_ISJUMP             Jump instruction without immediate arguments.
00078  * I_ISJUMPARG          Jump instruction with one argument.
00079  * I_ISJUMPARGS         Jump instruction with two arguments.
00080  * I_ISPTRJUMP          Jump instruction with pointer.
00081  * I_ISPTRJUMPARG       Jump instruction with pointer and one argument.
00082  * I_ISPTRJUMPARGS      Jump instruction with pointer and two arguments.
00083  */
00084 
00085 #ifdef PIKE_DEBUG
00086 #define INSTR_PROFILING
00087 #endif
00088 
00089 
00090 struct instr
00091 {
00092 #ifdef PIKE_DEBUG
00093   long compiles;
00094 #endif
00095   int flags;
00096   const char *name;
00097 #ifdef PIKE_USE_MACHINE_CODE
00098   void *address;
00099 #endif
00100 };
00101 
00102 #ifdef PIKE_DEBUG
00103 #define ADD_COMPILED(X) instrs[(X)-F_OFFSET].compiles++
00104 #ifdef INSTR_PROFILING
00105 extern void add_runned(PIKE_INSTR_T);
00106 #define ADD_RUNNED(X) add_runned(X)
00107 #else
00108 #define ADD_RUNNED(X)
00109 #endif
00110 #else
00111 #define ADD_COMPILED(X)
00112 #define ADD_RUNNED(X)
00113 #endif
00114 
00115 #ifndef STRUCT_HASH_ENTRY_DECLARED
00116 #define STRUCT_HASH_ENTRY_DECLARED
00117 struct hash_entry;
00118 #endif
00119 
00120 #ifndef STRUCT_HASH_TABLE_DECLARED
00121 #define STRUCT_HASH_TABLE_DECLARED
00122 struct hash_table;
00123 #endif
00124 
00125 extern struct instr instrs[];
00126 #ifdef PIKE_USE_MACHINE_CODE
00127 extern size_t instrs_checksum;
00128 #endif /* PIKE_USE_MACHINE_CODE */
00129 
00130 /* Opcode enum */
00131 
00132 #define OPCODE0(X,Y,F) X,
00133 #define OPCODE1(X,Y,F) X,
00134 #define OPCODE2(X,Y,F) X,
00135 #define OPCODE0_TAIL(X,Y,F) X,
00136 #define OPCODE1_TAIL(X,Y,F) X,
00137 #define OPCODE2_TAIL(X,Y,F) X,
00138 #define OPCODE0_JUMP(X,Y,F) X,
00139 #define OPCODE1_JUMP(X,Y,F) X,
00140 #define OPCODE2_JUMP(X,Y,F) X,
00141 #define OPCODE0_TAILJUMP(X,Y,F) X,
00142 #define OPCODE1_TAILJUMP(X,Y,F) X,
00143 #define OPCODE2_TAILJUMP(X,Y,F) X,
00144 #define OPCODE0_PTRJUMP(X,Y,F) X,
00145 #define OPCODE1_PTRJUMP(X,Y,F) X,
00146 #define OPCODE2_PTRJUMP(X,Y,F) X,
00147 #define OPCODE0_TAILPTRJUMP(X,Y,F) X,
00148 #define OPCODE1_TAILPTRJUMP(X,Y,F) X,
00149 #define OPCODE2_TAILPTRJUMP(X,Y,F) X,
00150 #define OPCODE0_RETURN(X,Y,F) X,
00151 #define OPCODE1_RETURN(X,Y,F) X,
00152 #define OPCODE2_RETURN(X,Y,F) X,
00153 #define OPCODE0_TAILRETURN(X,Y,F) X,
00154 #define OPCODE1_TAILRETURN(X,Y,F) X,
00155 #define OPCODE2_TAILRETURN(X,Y,F) X,
00156 #define OPCODE0_BRANCH(X,Y,F) X,
00157 #define OPCODE1_BRANCH(X,Y,F) X,
00158 #define OPCODE2_BRANCH(X,Y,F) X,
00159 #define OPCODE0_TAILBRANCH(X,Y,F) X,
00160 #define OPCODE1_TAILBRANCH(X,Y,F) X,
00161 #define OPCODE2_TAILBRANCH(X,Y,F) X,
00162 #define OPCODE0_ALIAS(X,Y,F,A) X,
00163 #define OPCODE1_ALIAS(X,Y,F,A) X,
00164 #define OPCODE2_ALIAS(X,Y,F,A) X,
00165 
00166 enum Pike_opcodes
00167 {
00168   /*
00169    * These values are used by the stack machine, and can not be directly
00170    * called from Pike.
00171    */
00172   F_OFFSET = 257,
00173   F_PREFIX_256,
00174   F_PREFIX_512,
00175   F_PREFIX_768,
00176   F_PREFIX_1024,
00177   F_PREFIX_CHARX256,
00178   F_PREFIX_WORDX256,
00179   F_PREFIX_24BITX256,
00180   F_PREFIX2_256,
00181   F_PREFIX2_512,
00182   F_PREFIX2_768,
00183   F_PREFIX2_1024,
00184   F_PREFIX2_CHARX256,
00185   F_PREFIX2_WORDX256,
00186   F_PREFIX2_24BITX256,
00187 
00188   /*
00189    * These are the predefined functions that can be accessed from Pike.
00190    */
00191 
00192 #include "interpret_protos.h"
00193 
00194   /* Used to mark an entry point from eval_instruction(). */
00195   F_ENTRY,
00196 
00197   /*
00198    * These are token values that needn't have an associated code for the
00199    * compiled file
00200    */
00201   F_MAX_OPCODE,
00202 
00203   F_ADD_EQ,
00204   F_AND_EQ,
00205   F_ARG_LIST,
00206   F_COMMA_EXPR,
00207   F_BREAK,
00208   F_CASE,
00209   F_CASE_RANGE,
00210   F_CONTINUE,
00211   F_DEFAULT,
00212   F_DIV_EQ,
00213   F_DO,
00214   F_EFUN_CALL,
00215   F_FOR,
00216   F_IDENTIFIER,
00217   F_LSH_EQ,
00218   F_LVALUE_LIST,
00219   F_MOD_EQ,
00220   F_MULT_EQ,
00221   F_OR_EQ,
00222   F_RSH_EQ,
00223   F_SUB_EQ,
00224   F_VAL_LVAL,
00225   F_XOR_EQ,
00226   F_NOP,
00227   F_RANGE_FROM_BEG,             /* a[i.. */
00228   F_RANGE_FROM_END,             /* a[<i.. */
00229   F_RANGE_OPEN,                 /* a[.. */
00230 
00231   F_ALIGN,
00232   F_POINTER,
00233   F_LABEL,
00234   F_NORMAL_STMT_LABEL,
00235   F_CUSTOM_STMT_LABEL,
00236   F_DATA,
00237   F_START_FUNCTION,
00238   F_BYTE,
00239   F_NOTREACHED,
00240   F_AUTO_MAP_MARKER,
00241   F_AUTO_MAP,
00242 
00243   /* Alias for F_RETURN, but cannot be optimized into a tail recursion call */
00244   F_VOLATILE_RETURN,
00245 
00246   F_MAX_INSTR,
00247 
00248   /* These are only used for dumping. */
00249   F_FILENAME,
00250   F_LINE,
00251 };
00252 
00253 #undef OPCODE0
00254 #undef OPCODE1
00255 #undef OPCODE2
00256 #undef OPCODE0_TAIL
00257 #undef OPCODE1_TAIL
00258 #undef OPCODE2_TAIL
00259 #undef OPCODE0_PTRJUMP
00260 #undef OPCODE1_PTRJUMP
00261 #undef OPCODE2_PTRJUMP
00262 #undef OPCODE0_TAILPTRJUMP
00263 #undef OPCODE1_TAILPTRJUMP
00264 #undef OPCODE2_TAILPTRJUMP
00265 #undef OPCODE0_RETURN
00266 #undef OPCODE1_RETURN
00267 #undef OPCODE2_RETURN
00268 #undef OPCODE0_TAILRETURN
00269 #undef OPCODE1_TAILRETURN
00270 #undef OPCODE2_TAILRETURN
00271 #undef OPCODE0_BRANCH
00272 #undef OPCODE1_BRANCH
00273 #undef OPCODE2_BRANCH
00274 #undef OPCODE0_TAILBRANCH
00275 #undef OPCODE1_TAILBRANCH
00276 #undef OPCODE2_TAILBRANCH
00277 #undef OPCODE0_JUMP
00278 #undef OPCODE1_JUMP
00279 #undef OPCODE2_JUMP
00280 #undef OPCODE0_TAILJUMP
00281 #undef OPCODE1_TAILJUMP
00282 #undef OPCODE2_TAILJUMP
00283 #undef OPCODE0_ALIAS
00284 #undef OPCODE1_ALIAS
00285 #undef OPCODE2_ALIAS
00286 
00287 const char *low_get_f_name(int n,struct program *p);
00288 const char *get_f_name(int n);
00289 #ifdef HAVE_COMPUTED_GOTO
00290 const char *get_opcode_name(PIKE_INSTR_T n);
00291 #else /* !HAVE_COMPUTED_GOTO */
00292 #define get_opcode_name(n) get_f_name(n + F_OFFSET)
00293 #endif /* HAVE_COMPUTED_GOTO */
00294 const char *get_token_name(int n);
00295 void init_opcodes(void);
00296 void exit_opcodes(void);
00297 
00298 #endif  /* !OPCODES_H */

Generated on Fri Jul 22 23:44:26 2005 for Pike by  doxygen 1.3.9.1