From: Christian Würdig Date: Mon, 24 Jul 2006 14:30:30 +0000 (+0000) Subject: added new irn op callbacks for memory operands X-Git-Url: http://nsz.repo.hu/git/?a=commitdiff_plain;h=d0331faf03740c021da65c7e07e3bf11fa2dabbd;p=libfirm added new irn op callbacks for memory operands --- diff --git a/ir/be/bearch.c b/ir/be/bearch.c index f69e8b2d2..23f023f6e 100644 --- a/ir/be/bearch.c +++ b/ir/be/bearch.c @@ -117,6 +117,24 @@ arch_inverse_t *arch_get_inverse(const arch_env_t *env, const ir_node *irn, int } } +int arch_possible_memory_operand(const arch_env_t *env, const ir_node *irn, unsigned int i) { + const arch_irn_ops_t *ops = get_irn_ops(env, irn); + if(ops->impl->possible_memory_operand) { + return ops->impl->possible_memory_operand(ops, irn, i); + } else { + return 0; + } +} + +extern void arch_perform_memory_operand(const arch_env_t *env, ir_node *irn, ir_node *reload, unsigned int i) { + const arch_irn_ops_t *ops = get_irn_ops(env, irn); + if(ops->impl->perform_memory_operand) { + ops->impl->perform_memory_operand(ops, irn, reload, i); + } else { + return; + } +} + int arch_get_op_estimated_cost(const arch_env_t *env, const ir_node *irn) { const arch_irn_ops_t *ops = get_irn_ops(env, irn); diff --git a/ir/be/bearch.h b/ir/be/bearch.h index 86005f4a2..dbc29412a 100644 --- a/ir/be/bearch.h +++ b/ir/be/bearch.h @@ -322,6 +322,15 @@ struct _arch_irn_ops_if_t { */ int (*possible_memory_operand)(const void *self, const ir_node *irn, unsigned int i); + /** + * Ask the backend to assimilate @p reload of operand @p i into @p irn. + * + * @param self The this pointer. + * @param irn The node. + * @param reload The reload. + * @param i The position of the reload. + */ + void (*perform_memory_operand)(const void *self, ir_node *irn, ir_node *reload, unsigned int i); }; /** @@ -336,6 +345,8 @@ extern void arch_set_frame_offset(const arch_env_t *env, ir_node *irn, int bias) extern entity *arch_get_frame_entity(const arch_env_t *env, ir_node *irn); extern arch_inverse_t *arch_get_inverse(const arch_env_t *env, const ir_node *irn, int i, arch_inverse_t *inverse, struct obstack *obstack); +extern int arch_possible_memory_operand(const arch_env_t *env, const ir_node *irn, unsigned int i); +extern void arch_perform_memory_operand(const arch_env_t *env, ir_node *irn, ir_node *reload, unsigned int i); /** * Get the register requirements for a node.