X-Git-Url: https://git.xonotic.org/?p=xonotic%2Fgmqcc.git;a=blobdiff_plain;f=ir.h;h=825f6a7123db4893b40f23aacc0532e9feb2eef1;hp=721799bd5e71c448f5b526b2cdef7e4f3f1778fd;hb=74cb075665a8e389cd4a5492bef158bb2f59de85;hpb=02b4c7b7c1639af8666f9a093d6dc4f6ac30e0f4 diff --git a/ir.h b/ir.h index 721799b..825f6a7 100644 --- a/ir.h +++ b/ir.h @@ -55,8 +55,6 @@ typedef struct ir_value_s { char *vstring; struct ir_value_s *vpointer; struct ir_function_s *vfunc; - quaternion vquat; - matrix vmat; } constval; struct { @@ -64,12 +62,20 @@ typedef struct ir_value_s { int32_t name; /* filled by the local-allocator */ int32_t local; + /* added for members */ + int32_t addroffset; } code; + /* for acessing vectors */ + struct ir_value_s *members[3]; + struct ir_value_s *memberof; + /* For the temp allocator */ MEM_VECTOR_MAKE(ir_life_entry_t, life); } ir_value; +int32_t ir_value_code_addr(const ir_value*); + /* ir_value can be a variable, or created by an operation */ ir_value* ir_value_var(const char *name, int st, int vtype); /* if a result of an operation: the function should store @@ -77,7 +83,8 @@ ir_value* ir_value_var(const char *name, int st, int vtype); */ ir_value* ir_value_out(struct ir_function_s *owner, const char *name, int st, int vtype); void ir_value_delete(ir_value*); -void ir_value_set_name(ir_value*, const char *name); +bool ir_value_set_name(ir_value*, const char *name); +ir_value* ir_value_vector_member(ir_value*, unsigned int member); MEM_VECTOR_PROTO_ALL(ir_value, struct ir_instr_s*, reads); MEM_VECTOR_PROTO_ALL(ir_value, struct ir_instr_s*, writes); @@ -89,10 +96,9 @@ bool GMQCC_WARN ir_value_set_int(ir_value*, int i); #endif bool GMQCC_WARN ir_value_set_string(ir_value*, const char *s); bool GMQCC_WARN ir_value_set_vector(ir_value*, vector v); +bool GMQCC_WARN ir_value_set_field(ir_value*, ir_value *fld); /*bool ir_value_set_pointer_v(ir_value*, ir_value* p); */ /*bool ir_value_set_pointer_i(ir_value*, int i); */ -bool GMQCC_WARN ir_value_set_quaternion(ir_value*, quaternion v); -bool GMQCC_WARN ir_value_set_matrix(ir_value*, matrix v); MEM_VECTOR_PROTO(ir_value, ir_life_entry_t, life); /* merge an instruction into the life-range */ @@ -105,7 +111,7 @@ bool ir_value_lives(ir_value*, size_t); bool ir_values_overlap(const ir_value*, const ir_value*); void ir_value_dump(ir_value*, int (*oprintf)(const char*,...)); -void ir_value_dump_life(ir_value *self, int (*oprintf)(const char*,...)); +void ir_value_dump_life(const ir_value *self, int (*oprintf)(const char*,...)); /* A vector of IR values */ typedef struct { @@ -181,6 +187,8 @@ MEM_VECTOR_PROTO_ALL(ir_block, ir_block*, entries); ir_value* ir_block_create_binop(ir_block*, const char *label, int op, ir_value *left, ir_value *right); +ir_value* ir_block_create_unary(ir_block*, const char *label, int op, + ir_value *operand); bool GMQCC_WARN ir_block_create_store_op(ir_block*, int op, ir_value *target, ir_value *what); bool GMQCC_WARN ir_block_create_store(ir_block*, ir_value *target, ir_value *what); bool GMQCC_WARN ir_block_create_storep(ir_block*, ir_value *target, ir_value *what); @@ -253,6 +261,14 @@ typedef struct ir_function_s lex_ctx context; + /* for prototypes - first we generate all the + * globals, and we remember teh function-defs + * so we can later fill in the entry pos + * + * remember the ID: + */ + qcint code_function_def; + /* for temp allocation */ size_t run_id; @@ -269,7 +285,7 @@ MEM_VECTOR_PROTO(ir_function, int, params); MEM_VECTOR_PROTO(ir_function, ir_block*, blocks); ir_value* ir_function_get_local(ir_function *self, const char *name); -ir_value* ir_function_create_local(ir_function *self, const char *name, int vtype); +ir_value* ir_function_create_local(ir_function *self, const char *name, int vtype, bool param); bool GMQCC_WARN ir_function_finalize(ir_function*); /* @@ -288,6 +304,10 @@ typedef struct ir_builder_s char *name; MEM_VECTOR_MAKE(ir_function*, functions); MEM_VECTOR_MAKE(ir_value*, globals); + MEM_VECTOR_MAKE(ir_value*, fields); + + MEM_VECTOR_MAKE(const char*, filenames); + MEM_VECTOR_MAKE(qcint, filestrings); } ir_builder; ir_builder* ir_builder_new(const char *modulename); @@ -296,13 +316,18 @@ void ir_builder_delete(ir_builder*); bool ir_builder_set_name(ir_builder *self, const char *name); MEM_VECTOR_PROTO(ir_builder, ir_function*, functions); -MEM_VECTOR_PROTO(ir_builder, ir_value*, globals); +MEM_VECTOR_PROTO(ir_builder, ir_value*, globals); +MEM_VECTOR_PROTO(ir_builder, ir_value*, fields); +MEM_VECTOR_PROTO(ir_builder, const char*, filenames); +MEM_VECTOR_PROTO(ir_builder, qcint, filestrings); ir_function* ir_builder_get_function(ir_builder*, const char *fun); ir_function* ir_builder_create_function(ir_builder*, const char *name, int outtype); ir_value* ir_builder_get_global(ir_builder*, const char *fun); ir_value* ir_builder_create_global(ir_builder*, const char *name, int vtype); +ir_value* ir_builder_get_field(ir_builder*, const char *fun); +ir_value* ir_builder_create_field(ir_builder*, const char *name, int vtype); bool ir_builder_generate(ir_builder *self, const char *filename); @@ -310,6 +335,6 @@ void ir_builder_dump(ir_builder*, int (*oprintf)(const char*, ...)); /* This code assumes 32 bit floats while generating binary */ extern int check_int_and_float_size -[ (sizeof(int32_t) == sizeof(( (ir_value*)(NULL) )->constval.vvec.x)) ? 1 : -1 ]; +[ (sizeof(int32_t) == sizeof(qcfloat)) ? 1 : -1 ]; #endif