X-Git-Url: https://git.xonotic.org/?p=xonotic%2Fgmqcc.git;a=blobdiff_plain;f=ir.h;h=59b4488724d7be4b2ff242856110e00a25a1735d;hp=721799bd5e71c448f5b526b2cdef7e4f3f1778fd;hb=b3d4e406ec775bb953ddb38d54d7f9a29f56b0fc;hpb=abdda3ee1bd5ea8c638877d592bd23ff6653e4b8 diff --git a/ir.h b/ir.h index 721799b..59b4488 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,19 @@ 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]; + /* 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 @@ -78,6 +83,7 @@ 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); +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 +95,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 */ @@ -181,6 +186,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); @@ -269,7 +276,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 +295,7 @@ 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); } ir_builder; ir_builder* ir_builder_new(const char *modulename); @@ -297,12 +305,15 @@ 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*, fields); 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 +321,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