X-Git-Url: http://nsz.repo.hu/git/?a=blobdiff_plain;f=ir%2Fbe%2Fbearch.h;h=86005f4a231ecf2691e2505cfa5729ba1061e640;hb=6866751667f73eeec02ac8275f1011f9e424cce2;hp=a6b5ca0ebe60373e0ca2d2873bc717199c081a95;hpb=9a77543a5e702fe3aba888f56137cf309ba0b605;p=libfirm diff --git a/ir/be/bearch.h b/ir/be/bearch.h index a6b5ca0eb..86005f4a2 100644 --- a/ir/be/bearch.h +++ b/ir/be/bearch.h @@ -185,8 +185,24 @@ typedef enum _arch_irn_class_t { arch_irn_class_branch, arch_irn_class_call, arch_irn_class_const, + arch_irn_class_load, + arch_irn_class_store, + arch_irn_class_stackparam, } arch_irn_class_t; +/** + * An inverse operation returned by the backend + */ +typedef struct _arch_inverse_t { + int n; /**< count of nodes returned in nodes array */ + int costs; /**< costs of this remat */ + + /**< nodes for this inverse operation. shall be in + * schedule order. last element is the target value + */ + ir_node **nodes; +} arch_inverse_t; + /** * Some flags describing a node in more detail. */ @@ -195,7 +211,8 @@ typedef enum _arch_irn_flags_t { arch_irn_flags_dont_spill = 1, /**< This must not be spilled. */ arch_irn_flags_rematerializable = 2, /**< This should be replicated instead of spilled/reloaded. */ arch_irn_flags_ignore = 4, /**< Ignore node during register allocation. */ - arch_irn_flags_last = arch_irn_flags_ignore + arch_irn_flags_modify_sp = 8, /**< I modify the stack pointer. */ + arch_irn_flags_last = arch_irn_flags_modify_sp } arch_irn_flags_t; /** @@ -270,6 +287,41 @@ struct _arch_irn_ops_if_t { * @param offset The offset of the node's stack frame entity. */ void (*set_frame_offset)(const void *self, ir_node *irn, int offset); + + /** + * Returns an inverse operation which yields the i-th argument + * of the given node as result. + * + * @param self The this pointer. + * @param irn The original operation + * @param i Index of the argument we want the inverse operation to yield + * @param inverse struct to be filled with the resulting inverse op + * @param obstack The obstack to use for allocation of the returned nodes array + * @return The inverse operation or NULL if operation invertible + */ + arch_inverse_t *(*get_inverse)(const void *self, const ir_node *irn, int i, arch_inverse_t *inverse, struct obstack *obstack); + + /** + * Get the estimated cycle count for @p irn. + * + * @param self The this pointer. + * @param irn The node. + * + * @return The estimated cycle count for this operation + */ + int (*get_op_estimated_cost)(const void *self, const ir_node *irn); + + /** + * Asks the backend whether operand @p i of @p irn can be loaded form memory internally + * + * @param self The this pointer. + * @param irn The node. + * @param i Index of the argument we would like to know whether @p irn can load it form memory internally + * + * @return nonzero if argument can be loaded or zero otherwise + */ + int (*possible_memory_operand)(const void *self, const ir_node *irn, unsigned int i); + }; /** @@ -283,6 +335,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); + /** * Get the register requirements for a node. * @param env The architecture environment. @@ -332,6 +386,15 @@ extern int arch_get_allocatable_regs(const arch_env_t *env, const ir_node *irn, */ extern void arch_put_non_ignore_regs(const arch_env_t *env, const arch_register_class_t *cls, bitset_t *bs); +/** + * Return the number of registers in a register class which should not be + * ignored by the register allocator. + * @param env The architecture environment. + * @param cls The register class to consider + * @return The number of non-ignore registers in the register class + */ +extern int arch_count_non_ignore_regs(const arch_env_t *env, const arch_register_class_t *cls); + /** * Check, if a register is assignable to an operand of a node. * @param env The architecture environment. @@ -569,11 +632,17 @@ struct _arch_isa_if_t { */ int (*get_reg_class_alignment)(const void *self, const arch_register_class_t *cls); + /** + * A "static" function, returns the frontend settings + * needed for this backend. + */ + const backend_params *(*get_params)(void); + #ifdef WITH_LIBCORE - /** - * Register command line options for this backend. - * @param grp The root group. - */ + /** + * Register command line options for this backend. + * @param grp The root group. + */ void (*register_options)(lc_opt_entry_t *grp); #endif };