- reorder if to place cheapest test first
[libfirm] / ir / be / bearch_t.h
index 80c7f62..0e7590b 100644 (file)
@@ -33,6 +33,7 @@
 #include "bemachine.h"
 #include "beirg.h"
 #include "beabi.h"
+#include "raw_bitset.h"
 
 /**
  * A register.
@@ -139,6 +140,32 @@ struct arch_register_req_t {
                                                 (must_be_different) */
 };
 
+static INLINE int reg_reqs_equal(const arch_register_req_t *req1,
+                                 const arch_register_req_t *req2)
+{
+       if (req1 == req2)
+               return 1;
+
+       if (req1->type != req2->type
+                       || req1->cls != req2->cls
+                       || req1->other_same != req2->other_same
+                       || req1->other_different != req2->other_different)
+               return 0;
+
+       if (req1->limited != NULL) {
+               size_t n_regs;
+
+               if (req2->limited == NULL)
+                       return 0;
+
+               n_regs = arch_register_class_n_regs(req1->cls);
+               if (!rbitset_equal(req1->limited, req2->limited, n_regs))
+                       return 0;
+       }
+
+       return 1;
+}
+
 /**
  * An inverse operation returned by the backend
  */
@@ -317,6 +344,11 @@ struct arch_code_generator_if_t {
         */
        void *(*init)(be_irg_t *birg);
 
+       /**
+        * return node used as base in pic code addresses
+        */
+       ir_node* (*get_pic_base)(void *self);
+
        /**
         * Called before abi introduce.
         */
@@ -387,6 +419,8 @@ do { \
 #define arch_code_generator_done(cg)            _arch_cg_call(cg, done)
 #define arch_code_generator_spill(cg, birg)     _arch_cg_call_env(cg, birg, spill)
 #define arch_code_generator_has_spiller(cg)     ((cg)->impl->spill != NULL)
+#define arch_code_generator_get_pic_base(cg)    \
+       ((cg)->impl->get_pic_base != NULL ? (cg)->impl->get_pic_base(cg) : NULL)
 
 /**
  * Code generator base class.
@@ -402,10 +436,11 @@ struct arch_isa_t {
        const arch_isa_if_t   *impl;
        const arch_register_t *sp;        /** The stack pointer register. */
        const arch_register_t *bp;        /** The base pointer register. */
-       const int              stack_dir; /** -1 for decreasing, 1 for increasing. */
+       int                    stack_dir; /** -1 for decreasing, 1 for increasing. */
+       int                    stack_alignment; /** stack alignment */
        const be_main_env_t   *main_env;  /** the be main environment */
-       const int              spill_cost;  /** cost for a be_Spill node */
-       const int              reload_cost; /** cost for a be_Reload node */
+       int                    spill_cost;  /** cost for a be_Spill node */
+       int                    reload_cost; /** cost for a be_Reload node */
 };
 
 #define arch_isa_stack_dir(isa)  ((isa)->stack_dir)