/*
- * Copyright (C) 2012
+ * Copyright (C) 2012
* Wolfgang Bumiller
*
* Permission is hereby granted, free of charge, to any person obtaining a copy of
int vtype;
int store;
lex_ctx context;
+ /* even the IR knows the subtype of a field */
+ int fieldtype;
MEM_VECTOR_MAKE(struct ir_instr_s*, reads);
MEM_VECTOR_MAKE(struct ir_instr_s*, writes);
vector vvec;
char *vstring;
struct ir_value_s *vpointer;
+ struct ir_function_s *vfunc;
} constval;
+ struct {
+ int32_t globaladdr;
+ int32_t name;
+ } code;
+
/* For the temp allocator */
MEM_VECTOR_MAKE(ir_life_entry_t, life);
} ir_value;
bool ir_value_life_merge(ir_value*, size_t);
/* check if a value lives at a specific point */
bool ir_value_lives(ir_value*, size_t);
+/* check if the life-range of 2 values overlaps */
+bool ir_values_overlap(ir_value*, ir_value*);
void ir_value_dump(ir_value*, int (*oprintf)(const char*,...));
void ir_value_dump_life(ir_value *self, int (*oprintf)(const char*,...));
ir_value *left, ir_value *right);
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);
+
+/* field must be of TYPE_FIELD */
+ir_value* ir_block_create_load_from_ent(ir_block*, const char *label, ir_value *ent, ir_value *field, int outype);
+
+ir_value* ir_block_create_fieldaddress(ir_block*, const char *label, ir_value *entity, ir_value *field);
+
+/* This is to create an instruction of the form
+ * <outtype>%label := opcode a, b
+ */
+ir_value* ir_block_create_general_instr(ir_block *self, const char *label,
+ int op, ir_value *a, ir_value *b, int outype);
ir_value* ir_block_create_add(ir_block*, const char *label, ir_value *l, ir_value *r);
ir_value* ir_block_create_sub(ir_block*, const char *label, ir_value *l, ir_value *r);
bool GMQCC_WARN ir_block_create_return(ir_block*, ir_value *opt_value);
bool GMQCC_WARN ir_block_create_if(ir_block*, ir_value *cond,
- ir_block *ontrue, ir_block *onfalse);
+ ir_block *ontrue, ir_block *onfalse);
/* A 'goto' is an actual 'goto' coded in QC, whereas
* a 'jump' is a virtual construct which simply names the
* next block to go to.
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 ];
+
#endif