From 4c38566877aec0e3a9d303881e1de426e9791170 Mon Sep 17 00:00:00 2001 From: Wolfgang Bumiller Date: Tue, 1 May 2012 12:12:53 +0200 Subject: [PATCH] ir_block_create_load_from_ent - long name, I know, but we need to be able to load from pointers too at some point... --- ir.c | 53 ++++++++++++++++++++++++++++++++++++++++++++++++++++- ir.h | 3 +++ 2 files changed, 55 insertions(+), 1 deletion(-) diff --git a/ir.c b/ir.c index f001e27..ec3554f 100644 --- a/ir.c +++ b/ir.c @@ -950,8 +950,59 @@ ir_value* ir_block_create_binop(ir_block *self, return out; on_error: - ir_value_delete(out); ir_instr_delete(in); + ir_value_delete(out); + return NULL; +} + +ir_value* ir_block_create_load_from_ent(ir_block *self, const char *label, ir_value *ent, ir_value *field, int outype) +{ + ir_instr *instr; + ir_value *out; + int op; + + if (ent->vtype != TYPE_ENTITY) + return NULL; + + switch (outype) + { + case TYPE_FLOAT: op = INSTR_LOAD_F; break; + case TYPE_VECTOR: op = INSTR_LOAD_V; break; + case TYPE_STRING: op = INSTR_LOAD_S; break; + case TYPE_FIELD: op = INSTR_LOAD_FLD; break; + case TYPE_ENTITY: op = INSTR_LOAD_ENT; break; +#if 0 + case TYPE_POINTER: op = INSTR_LOAD_I; break; + case TYPE_INTEGER: op = INSTR_LOAD_I; break; +#endif + default: + return NULL; + } + + out = ir_value_out(self->owner, label, store_local, outype); + if (!out) + return NULL; + + instr = ir_instr_new(self, op); + if (!instr) { + ir_value_delete(out); + return NULL; + } + + if (!ir_instr_op(instr, 0, out, true) || + !ir_instr_op(instr, 0, ent, false) || + !ir_instr_op(instr, 0, field, false)) + { + goto on_error; + } + + if (!ir_block_instr_add(self, instr)) + goto on_error; + + return out; +on_error: + ir_instr_delete(instr); + ir_value_delete(out); return NULL; } diff --git a/ir.h b/ir.h index bcc590b..7d77d29 100644 --- a/ir.h +++ b/ir.h @@ -152,6 +152,9 @@ bool GMQCC_WARN ir_block_create_store_op(ir_block*, int op, ir_value *target, ir 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_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); ir_value* ir_block_create_mul(ir_block*, const char *label, ir_value *l, ir_value *r); -- 2.39.2