X-Git-Url: http://nsz.repo.hu/git/?a=blobdiff_plain;f=ir%2Fbe%2Fbearch.h;h=97424296fb558f8edb8f1f1be2e83d5026760d81;hb=36c6b99832fbea890115a89d3122d5399c7164a0;hp=da5a5a552533de9ce329c896e94d5d9ab6cbfe98;hpb=63bfaad7190a932b96d18f070b42354f22d8a9eb;p=libfirm diff --git a/ir/be/bearch.h b/ir/be/bearch.h index da5a5a552..97424296f 100644 --- a/ir/be/bearch.h +++ b/ir/be/bearch.h @@ -26,7 +26,7 @@ typedef enum _arch_register_type_t { arch_register_type_callee_save = 2, /**< The register must be saved by the caller upon a function call. It thus can be overwritten in the called function. */ - arch_register_type_ignore = 4, /**< Do not consider this register when allocating. */ + arch_register_type_ignore = 4, /**< Do not consider this register when allocating. */ } arch_register_type_t; /** @@ -36,7 +36,7 @@ typedef enum _arch_register_type_t { * @return 1, If register is of given kind, 0 if not. */ #define arch_register_type_is(reg, kind) \ - (((reg)->type & arch_register_type_ ## kind) != 0) + (((reg)->type & arch_register_type_ ## kind) != 0) /** * A register. @@ -75,8 +75,12 @@ struct _arch_register_class_t { const arch_register_t *regs; /**< The array of registers. */ }; +/** return the number of registers in this register class */ #define arch_register_class_n_regs(cls) ((cls)->n_regs) +/** return the largest mode of this register class */ +#define arch_register_class_mode(cls) ((cls)->mode) + /** * Put all registers in a class into a bitset. * @param cls The class. @@ -384,13 +388,13 @@ extern arch_irn_class_t arch_irn_classify(const arch_env_t *env, const ir_node * */ extern arch_irn_flags_t arch_irn_get_flags(const arch_env_t *env, const ir_node *irn); -#define arch_irn_is_ignore(env, irn) ((arch_irn_get_flags(env, irn) & arch_irn_flags_ignore) != 0) +#define arch_irn_is(env, irn, flag) ((arch_irn_get_flags(env, irn) & arch_irn_flags_ ## flag) != 0) #define arch_irn_has_reg_class(env, irn, pos, cls) \ ((cls) == arch_get_irn_reg_class(env, irn, pos)) #define arch_irn_consider_in_reg_alloc(env, cls, irn) \ - (arch_irn_has_reg_class(env, irn, -1, cls) && !arch_irn_is_ignore(env, irn)) + (arch_irn_has_reg_class(env, irn, -1, cls) && !arch_irn_is(env, irn, ignore)) /** * Somebody who can be asked about IR nodes. @@ -559,14 +563,22 @@ struct _arch_isa_if_t { */ const list_sched_selector_t *(*get_list_sched_selector)(const void *self); + /** + * Get the necessary alignment for storing a register of given class. + * @param self The isa object. + * @param cls The register class. + * @return The alignment in bytes. + */ + int (*get_reg_class_alignment)(const void *self, const arch_register_class_t *cls); }; -#define arch_isa_get_n_reg_class(isa) ((isa)->impl->get_n_reg_class(isa)) -#define arch_isa_get_reg_class(isa,i) ((isa)->impl->get_reg_class(isa, i)) -#define arch_isa_get_irn_handler(isa) ((isa)->impl->get_irn_handler(isa)) -#define arch_isa_get_call_abi(isa,tp,abi) ((isa)->impl->get_call_abi((isa), (tp), (abi))) -#define arch_isa_get_reg_class_for_mode(isa,mode) ((isa)->impl->get_reg_class_for_mode((isa), (mode))) -#define arch_isa_make_code_generator(isa,irg) ((isa)->impl->make_code_generator(isa, irg)) +#define arch_isa_get_n_reg_class(isa) ((isa)->impl->get_n_reg_class(isa)) +#define arch_isa_get_reg_class(isa,i) ((isa)->impl->get_reg_class(isa, i)) +#define arch_isa_get_irn_handler(isa) ((isa)->impl->get_irn_handler(isa)) +#define arch_isa_get_call_abi(isa,tp,abi) ((isa)->impl->get_call_abi((isa), (tp), (abi))) +#define arch_isa_get_reg_class_for_mode(isa,mode) ((isa)->impl->get_reg_class_for_mode((isa), (mode))) +#define arch_isa_make_code_generator(isa,irg) ((isa)->impl->make_code_generator((isa), (irg))) +#define arch_isa_get_reg_class_alignment(isa, cls) ((isa)->impl->get_reg_class_alignment((isa), (cls))) #define ARCH_MAX_HANDLERS 8