X-Git-Url: http://git.xonotic.org/?a=blobdiff_plain;f=pr_comp.h;h=20801b84c9dda98aea68db85a2b2b3911419dbd9;hb=1924c6dac04253af3a041dfa0cb4b35e360cbab1;hp=5fd9f0485149fa29ddf1dab704c9abc59fa3c21d;hpb=f9d8bc7ea04ff91fcbd90fe50a299b37724b349b;p=xonotic%2Fdarkplaces.git diff --git a/pr_comp.h b/pr_comp.h index 5fd9f048..20801b84 100644 --- a/pr_comp.h +++ b/pr_comp.h @@ -42,7 +42,7 @@ typedef enum etype_e {ev_void, ev_string, ev_float, ev_vector, ev_entity, ev_fie #define RESERVED_OFS 28 -enum opcode_e +typedef enum opcode_e { OP_DONE, OP_MUL_F, @@ -118,25 +118,122 @@ enum opcode_e OP_OR, OP_BITAND, - OP_BITOR -}; + OP_BITOR, + + OP_STORE_I = 113, + + OP_ADD_I = 116, + OP_ADD_FI, + OP_ADD_IF, + + OP_SUB_I, + OP_SUB_FI, + OP_SUB_IF, + OP_CONV_IF, + OP_CONV_FI, + + OP_LOAD_I = 126, + OP_STOREP_I, + + OP_BITAND_I = 130, + OP_BITOR_I, + + OP_MUL_I, + OP_DIV_I, + OP_EQ_I, + OP_NE_I, + + OP_NOT_I = 138, + + OP_DIV_VF, + + OP_STORE_P = 152, + + OP_LE_I = 161, + OP_GE_I, + OP_LT_I, + OP_GT_I, + + OP_LE_IF, + OP_GE_IF, + OP_LT_IF, + OP_GT_IF, + + OP_LE_FI, + OP_GE_FI, + OP_LT_FI, + OP_GT_FI, + + OP_EQ_IF, + OP_EQ_FI, + + OP_MUL_IF = 179, + OP_MUL_FI, + OP_MUL_VI, + OP_DIV_IF = 183, + OP_DIV_FI, + OP_BITAND_IF, + OP_BITOR_IF, + OP_BITAND_FI, + OP_BITOR_FI, + OP_AND_I, + OP_OR_I, + OP_AND_IF, + OP_OR_IF, + OP_AND_FI, + OP_OR_FI, + OP_NE_IF, + OP_NE_FI, + + OP_GSTOREP_I, + OP_GSTOREP_F, + OP_GSTOREP_ENT, + OP_GSTOREP_FLD, + OP_GSTOREP_S, + OP_GSTOREP_FNC, + OP_GSTOREP_V, + OP_GADDRESS, + OP_GLOAD_I, + OP_GLOAD_F, + OP_GLOAD_FLD, + OP_GLOAD_ENT, + OP_GLOAD_S, + OP_GLOAD_FNC, + OP_BOUNDCHECK, + OP_GLOAD_V = 216 +} +opcode_t; -typedef struct statement_s +typedef struct statement16_s { unsigned short op; signed short a,b,c; } -dstatement_t; +dstatement16_t; +typedef struct statement32_s +{ + unsigned int op; + signed int a,b,c; +} +dstatement32_t; -typedef struct ddef_s +typedef struct ddef16_s { unsigned short type; // if DEF_SAVEGLOBGAL bit is set // the variable needs to be saved in savegames unsigned short ofs; int s_name; } -ddef_t; +ddef16_t; +typedef struct ddef32_s +{ + unsigned int type; // if DEF_SAVEGLOBGAL bit is set + // the variable needs to be saved in savegames + unsigned int ofs; + int s_name; +} +ddef32_t, mdef_t; #define DEF_SAVEGLOBAL (1<<15) #define MAX_PARMS 8 @@ -153,7 +250,7 @@ typedef struct dfunction_s int s_file; // source file defined in int numparms; - qbyte parm_size[MAX_PARMS]; + unsigned char parm_size[MAX_PARMS]; } dfunction_t; @@ -163,18 +260,34 @@ typedef struct mfunction_s int parm_start; int locals; // total ints of parms + locals - int profile; // runtime - int builtinsprofile; // cost of builtin functions called by this function - int callcount; // times the functions has been called since the last profile call + // these are doubles so that they can count up to 54bits or so rather than 32bit + double tprofile; // realtime in this function + double tbprofile; // realtime in builtins called by this function (NOTE: builtins also have a tprofile!) + double profile; // runtime + double builtinsprofile; // cost of builtin functions called by this function + double callcount; // times the functions has been called since the last profile call + double totaltime; // total execution time of this function DIRECTLY FROM THE ENGINE + double tprofile_total; // runtime (NOTE: tbprofile_total makes no real sense, so not accumulating that) + double profile_total; // runtime + double builtinsprofile_total; // cost of builtin functions called by this function + int recursion; int s_name; int s_file; // source file defined in int numparms; - qbyte parm_size[MAX_PARMS]; + unsigned char parm_size[MAX_PARMS]; } mfunction_t; +typedef struct mstatement_s +{ + opcode_t op; + int operand[3]; // always a global or -1 for unused + int jumpabsolute; // only used by IF, IFNOT, GOTO +} +mstatement_t; + #define PROG_VERSION 6 typedef struct dprograms_s @@ -182,27 +295,47 @@ typedef struct dprograms_s int version; int crc; // check of header file - int ofs_statements; - int numstatements; // statement 0 is an error + unsigned int ofs_statements; + unsigned int numstatements; // statement 0 is an error - int ofs_globaldefs; - int numglobaldefs; + unsigned int ofs_globaldefs; + unsigned int numglobaldefs; - int ofs_fielddefs; - int numfielddefs; + unsigned int ofs_fielddefs; + unsigned int numfielddefs; - int ofs_functions; - int numfunctions; // function 0 is an empty + unsigned int ofs_functions; + unsigned int numfunctions; // function 0 is an empty - int ofs_strings; - int numstrings; // first string is a null string + unsigned int ofs_strings; + unsigned int numstrings; // first string is a null string - int ofs_globals; - int numglobals; + unsigned int ofs_globals; + unsigned int numglobals; - int entityfields; + unsigned int entityfields; } dprograms_t; +typedef struct dprograms_v7_s +{ //extended header written by fteqcc. + dprograms_t v6; //for easier casting. + + //debug / version 7 extensions + unsigned int ofsfiles; //ignored. deprecated, should be 0. source files can instead be embedded by simply treating the .dat as a zip. + unsigned int ofslinenums; //ignored. alternative to external .lno files. + unsigned int ofsbodylessfuncs; //unsupported. function names imported from other modules. must be 0. + unsigned int numbodylessfuncs; //unsupported. must be 0. + + unsigned int ofs_types; //unsupported+deprecated. rich type info. must be 0. + unsigned int numtypes; //unsupported+deprecated. rich type info. must be 0. + unsigned int blockscompressed; //unsupported. per-block compression. must be 0. + + int secondaryversion; //if not known then its kkqwsv's v7, qfcc's v7, or uhexen2's v7, or something. abandon all hope when not recognised. +#define PROG_SECONDARYVERSION16 ((('1'<<0)|('F'<<8)|('T'<<16)|('E'<<24))^(('P'<<0)|('R'<<8)|('O'<<16)|('G'<<24))) //regular 16bit statements. +#define PROG_SECONDARYVERSION32 ((('1'<<0)|('F'<<8)|('T'<<16)|('E'<<24))^(('3'<<0)|('2'<<8)|('B'<<16)|(' '<<24))) //statements+globaldefs+fielddefs extended to 32bit. +} +dprograms_v7_t; + #endif