00001
00002
00003
00004
00005
00006
00007
00008 #ifndef OPCODES_H
00009 #define OPCODES_H
00010
00011 #include "pikecode.h"
00012
00013
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
00029
00030
00031
00032
00033
00034
00035
00036 #define I_HASARG 1
00037 #define I_POINTER 2
00038 #define I_JUMP 4
00039 #define I__DATA 8
00040 #define I_HASARG2 16
00041 #define I_HASPOINTER 32
00042 #define I_BRANCH 128
00043
00044
00045
00046
00047
00048
00049 #define I_UPDATE_SP 256
00050 #define I_UPDATE_FP 512
00051 #define I_UPDATE_M_SP 1024
00052
00053
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)
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
00071
00072
00073
00074
00075
00076
00077
00078
00079
00080
00081
00082
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
00129
00130
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
00170
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
00190
00191
00192 #include "interpret_protos.h"
00193
00194
00195 F_ENTRY,
00196
00197
00198
00199
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,
00228 F_RANGE_FROM_END,
00229 F_RANGE_OPEN,
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
00244 F_VOLATILE_RETURN,
00245
00246 F_MAX_INSTR,
00247
00248
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
00292 #define get_opcode_name(n) get_f_name(n + F_OFFSET)
00293 #endif
00294 const char *get_token_name(int n);
00295 void init_opcodes(void);
00296 void exit_opcodes(void);
00297
00298 #endif