- renamed access offset functions
[libfirm] / ir / be / bearch.h
index 0b5c676..0013c38 100644 (file)
@@ -12,6 +12,7 @@
 #include "bitset.h"
 
 #include "belistsched.h"
+#include "beilpsched.h"
 #include "beabi_t.h"
 #include "bearch_t.h"
 #include "be_t.h"
@@ -45,11 +46,11 @@ typedef enum _arch_register_type_t {
  * A register.
  */
 struct _arch_register_t {
-  const char *name;                         /**< The name of the register. */
+  const char                  *name;        /**< The name of the register. */
   const arch_register_class_t *reg_class;   /**< The class the register belongs to. */
-  int index;                                /**< The index of the register in the class. */
-  arch_register_type_t type;                /**< The type of the register. */
-  void *data;                               /**< Custom data. */
+  int                         index;        /**< The index of the register in the class. */
+  arch_register_type_t        type;         /**< The type of the register. */
+  void                        *data;        /**< Custom data. */
 };
 
 static INLINE const arch_register_class_t *
@@ -538,6 +539,12 @@ struct _arch_code_generator_if_t {
         */
        void (*prepare_graph)(void *self);
 
+       /**
+        * Backend may provide an own spiller.
+        * This spiller needs to spill all register classes.
+        */
+       void (*spill)(void *self, void *env);
+
        /**
         * Called before scheduling.
         */
@@ -577,6 +584,12 @@ do { \
                (cg)->impl->func(cg); \
 } while(0)
 
+#define _arch_cg_call_env(cg, env, func) \
+do { \
+       if((cg)->impl->func) \
+               (cg)->impl->func(cg, env); \
+} while(0)
+
 #define arch_code_generator_before_abi(cg)      _arch_cg_call(cg, before_abi)
 #define arch_code_generator_prepare_graph(cg)   _arch_cg_call(cg, prepare_graph)
 #define arch_code_generator_before_sched(cg)    _arch_cg_call(cg, before_sched)
@@ -584,6 +597,8 @@ do { \
 #define arch_code_generator_after_ra(cg)        _arch_cg_call(cg, after_ra)
 #define arch_code_generator_finish(cg)          _arch_cg_call(cg, finish)
 #define arch_code_generator_done(cg)            _arch_cg_call(cg, done)
+#define arch_code_generator_spill(cg, env)      _arch_cg_call_env(cg, env, spill)
+#define arch_code_generator_has_spiller(cg)     ((cg)->impl->spill != NULL)
 
 /**
  * Code generator base class.
@@ -597,10 +612,10 @@ struct _arch_code_generator_t {
  */
 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. */
-       const be_main_env_t   *main_env; /** the be main environment */
+       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. */
+       const be_main_env_t   *main_env;  /** the be main environment */
 };
 
 #define arch_isa_stack_dir(isa)  ((isa)->stack_dir)
@@ -675,10 +690,17 @@ struct _arch_isa_if_t {
    *
    * @param self     The isa object.
    * @param selector The selector given by options.
-   * @return      The list scheduler selector.
+   * @return         The list scheduler selector.
    */
   const list_sched_selector_t *(*get_list_sched_selector)(const void *self, list_sched_selector_t *selector);
 
+  /**
+   * Get the ILP scheduler to use.
+   * @param self  The isa object.
+   * @return      The ILP scheduler selector
+   */
+  const ilp_sched_selector_t *(*get_ilp_sched_selector)(const void *self);
+
   /**
    * Get the necessary alignment for storing a register of given class.
    * @param self  The isa object.
@@ -694,11 +716,11 @@ struct _arch_isa_if_t {
   const backend_params *(*get_params)(void);
 
   /**
-   * Returns an 2-dim array of execution units, this node can be executed on.
+   * Returns an 2-dim array of execution units, @p irn can be executed on.
    * The first dimension is the type, the second the allowed units of this type.
    * Each dimension is a NULL terminated list.
-   * @param self  The this pointer.
-   * @param irn   The node
+   * @param self  The isa object.
+   * @param irn   The node.
    * @return An array of allowed execution units.
    *         exec_unit = {
    *                       { unit1_of_tp1, ..., unitX1_of_tp1, NULL },
@@ -711,7 +733,7 @@ struct _arch_isa_if_t {
 
   /**
    * Return the abstract machine for this isa.
-   * @param self The this pointer.
+   * @param self  The isa object.
    */
   const be_machine_t *(*get_machine)(const void *self);