typedef enum _arch_register_type_t {
arch_register_type_none = 0,
- arch_register_type_write_invariant,
arch_register_type_caller_saved, /**< The register must be saved by the caller
upon a function call. It thus can be overwritten
in the called function. */
#define arch_register_for_index(cls, idx) \
_arch_register_for_index(cls, idx)
-/**
- * Get the register set for a register class.
- * @param cls The register class.
- * @return The set containing all registers in the class.
- */
-#define arch_get_register_set_for_class(cls) ((cls)->set)
-
typedef enum _arch_operand_type_t {
arch_operand_type_invalid,
arch_operand_type_memory,
arch_register_req_type_t type; /**< The type of the constraint. */
const arch_register_class_t *cls; /**< The register class this constraint belongs to. */
- int (*limited)(const ir_node *irn, int pos, bitset_t *bs);
+ void (*limited)(const ir_node *irn, int pos, bitset_t *bs);
/**< In case of the 'limited'
constraint, this function
must put all allowable
* Some flags describing a node in more detail.
*/
typedef enum _arch_irn_flags_t {
- arch_irn_flags_spillable = 1,
- arch_irn_flags_rematerializable = 2
+ 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, /**< Do not consider the node during register allocation. */
} arch_irn_flags_t;
struct _arch_irn_ops_if_t {
*/
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)
+
#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))
+
/**
* Somebody who can be asked about nodes.
*/