X-Git-Url: http://nsz.repo.hu/git/?a=blobdiff_plain;f=ir%2Fbe%2Fbearch.h;h=30404e977860bcaa3ae013dd4f88e326674d9b30;hb=ed73d993f7df08a4e968e86e97224283ea781c64;hp=97424296fb558f8edb8f1f1be2e83d5026760d81;hpb=b01012584fe92c9f1b840fbe10dfd2a97df141cf;p=libfirm diff --git a/ir/be/bearch.h b/ir/be/bearch.h index 97424296f..30404e977 100644 --- a/ir/be/bearch.h +++ b/ir/be/bearch.h @@ -19,7 +19,7 @@ struct _be_node_factory_t; typedef enum _arch_register_type_t { - arch_register_type_none = 0, + arch_register_type_none = 0, arch_register_type_caller_save = 1, /**< The register must be saved by the caller upon a function call. It thus can be overwritten in the called function. */ @@ -183,9 +183,23 @@ typedef enum _arch_irn_class_t { arch_irn_class_copy, arch_irn_class_perm, arch_irn_class_branch, - arch_irn_class_call + arch_irn_class_call, + arch_irn_class_const, } 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. */ @@ -194,7 +208,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; /** @@ -269,6 +284,19 @@ 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 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); + }; /** @@ -282,6 +310,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. @@ -346,7 +376,7 @@ extern int arch_reg_is_allocatable(const arch_env_t *env, * Get the register class of an operand of a node. * @param env The architecture environment. * @param irn The node. - * @param pos The position of the operand. + * @param pos The position of the operand, -1 for the output. * @return The register class of the operand or NULL, if * operand is a non-register operand. */ @@ -417,11 +447,10 @@ struct _arch_irn_handler_t { struct _arch_code_generator_if_t { /** * Initialize the code generator. - * @param file The file to dump to. * @param birg A backend IRG session. * @return A newly created code generator. */ - void *(*init)(FILE *file, const be_irg_t *birg); + void *(*init)(const be_irg_t *birg); /** * Called before abi introduce. @@ -498,14 +527,12 @@ struct _arch_isa_t { */ struct _arch_isa_if_t { -#ifdef WITH_LIBCORE - void (*register_options)(lc_opt_entry_t *grp); -#endif - /** * Initialize the isa interface. + * @param file_handle the file handle to write the output to + * @return a new isa instance */ - void *(*init)(void); + void *(*init)(FILE *file_handle); /** * Free the isa instance. @@ -570,6 +597,20 @@ struct _arch_isa_if_t { * @return The alignment in bytes. */ 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. + */ + void (*register_options)(lc_opt_entry_t *grp); +#endif }; #define arch_isa_get_n_reg_class(isa) ((isa)->impl->get_n_reg_class(isa)) @@ -606,10 +647,11 @@ struct _arch_env_t { /** * Initialize the architecture environment struct. - * @param isa The isa which shall be put into the environment. + * @param isa The isa which shall be put into the environment. + * @param file_handle The file handle * @return The environment. */ -extern arch_env_t *arch_env_init(arch_env_t *env, const arch_isa_if_t *isa); +extern arch_env_t *arch_env_init(arch_env_t *env, const arch_isa_if_t *isa, FILE *file_handle); /** * Add a node handler to the environment.