Add ALLOCAN() and ALLOCANZ().
[libfirm] / ir / be / bearch.h
index 56afee5..db99133 100644 (file)
@@ -64,15 +64,6 @@ typedef enum arch_register_type_t {
                                                   bestate code */
 } arch_register_type_t;
 
-typedef enum arch_operand_type_t {
-       arch_operand_type_invalid,
-       arch_operand_type_memory,
-       arch_operand_type_register,
-       arch_operand_type_immediate,
-       arch_operand_type_symconst,
-       arch_operand_type_last
-} arch_operand_type_t;
-
 /**
  * Different types of register allocation requirements.
  */
@@ -99,30 +90,24 @@ extern char *arch_register_req_format(char *buf, size_t len, const arch_register
  * Certain node classes which are relevant for the register allocator.
  */
 typedef enum arch_irn_class_t {
-       arch_irn_class_normal     = 1 << 0,
-       arch_irn_class_spill      = 1 << 1,
-       arch_irn_class_reload     = 1 << 2,
-       arch_irn_class_remat      = 1 << 3,
-       arch_irn_class_copy       = 1 << 4,
-       arch_irn_class_perm       = 1 << 5,
-       arch_irn_class_branch     = 1 << 6,
-       arch_irn_class_call       = 1 << 7,
-       arch_irn_class_load       = 1 << 8,
-       arch_irn_class_store      = 1 << 9,
-       arch_irn_class_stackparam = 1 << 10,
+       arch_irn_class_spill      = 1 << 0,
+       arch_irn_class_reload     = 1 << 1,
+       arch_irn_class_remat      = 1 << 2,
+       arch_irn_class_copy       = 1 << 3,
+       arch_irn_class_perm       = 1 << 4,
+       arch_irn_class_branch     = 1 << 5
 } arch_irn_class_t;
 
 /**
  * Some flags describing a node in more detail.
  */
 typedef enum arch_irn_flags_t {
-       arch_irn_flags_none             = 0, /**< Node flags. */
-       arch_irn_flags_dont_spill       = 1, /**< This must not be spilled. */
-       arch_irn_flags_rematerializable = 2, /**< This can be replicated instead of spilled/reloaded. */
-       arch_irn_flags_ignore           = 4, /**< Ignore node during register allocation. */
-       arch_irn_flags_modify_sp        = 8, /**< I modify the stack pointer. */
-       arch_irn_flags_modify_flags     = 16, /**< I modify flags. */
-       arch_irn_flags_last             = arch_irn_flags_modify_flags
+       arch_irn_flags_none             = 0,       /**< Node flags. */
+       arch_irn_flags_dont_spill       = 1U << 0, /**< This must not be spilled. */
+       arch_irn_flags_rematerializable = 1U << 1, /**< This can be replicated instead of spilled/reloaded. */
+       arch_irn_flags_ignore           = 1U << 2, /**< Ignore node during register allocation. */
+       arch_irn_flags_modify_sp        = 1U << 3, /**< I modify the stack pointer. */
+       arch_irn_flags_modify_flags     = 1U << 4  /**< I modify flags. */
 } arch_irn_flags_t;
 
 void arch_set_frame_offset(ir_node *irn, int bias);
@@ -145,27 +130,7 @@ void            arch_perform_memory_operand(ir_node *irn, ir_node *spill, unsign
  */
 const arch_register_req_t *arch_get_register_req(const ir_node *irn, int pos);
 
-/**
- * Check if an operand is a register operand.
- * @param irn The node.
- * @param pos The position of the operand.
- * @return 1, if the operand is significant for register allocation, 0
- * if not.
- */
-int arch_is_register_operand(const ir_node *irn, int pos);
-
-/**
- * Get the number of allocatable registers concerning
- * a register class for an operand of a node.
- * @param irn The node.
- * @param pos The position of the node's operand.
- * @param bs  The bitset all allocatable registers shall be put into.
- *            Note, that you can also pass NULL here. If you don't,
- *            make sure, the bitset is as large as the register class
- *            has registers.
- * @return    The amount of registers allocatable for that operand.
- */
-int arch_get_allocatable_regs(const ir_node *irn, int pos, bitset_t *bs);
+#define arch_get_register_req_out(irn) arch_get_register_req(irn, -1)
 
 /**
  * Put all registers which shall not be ignored by the register
@@ -184,6 +149,8 @@ extern void arch_put_non_ignore_regs(const arch_register_class_t *cls, bitset_t
  */
 int arch_reg_is_allocatable(const ir_node *irn, int pos, const arch_register_t *reg);
 
+#define arch_reg_out_is_allocatable(irn, reg) arch_reg_is_allocatable(irn, -1, reg)
+
 /**
  * Get the register class of an operand of a node.
  * @param irn The node.
@@ -193,6 +160,8 @@ int arch_reg_is_allocatable(const ir_node *irn, int pos, const arch_register_t *
  */
 const arch_register_class_t *arch_get_irn_reg_class(const ir_node *irn, int pos);
 
+#define arch_get_irn_reg_class_out(irn) arch_get_irn_reg_class(irn, -1)
+
 /**
  * Get the register allocated at a certain output operand of a node.
  * @param irn The node.
@@ -225,11 +194,8 @@ arch_irn_flags_t arch_irn_get_flags(const ir_node *irn);
 
 #define arch_irn_is(irn, flag) ((arch_irn_get_flags(irn) & arch_irn_flags_ ## flag) != 0)
 
-#define arch_irn_has_reg_class(irn, pos, cls) \
-       ((cls) == arch_get_irn_reg_class(irn, pos))
-
 #define arch_irn_consider_in_reg_alloc(cls, irn) \
-       (arch_irn_has_reg_class(irn, -1, cls) && !arch_irn_is(irn, ignore))
+       (arch_get_irn_reg_class_out(irn) == (cls) && !arch_irn_is(irn, ignore))
 
 /**
  * Get the operations of an irn.