#include "bitset.h"
#include "belistsched.h"
+#include "beilpsched.h"
#include "beabi_t.h"
#include "bearch_t.h"
#include "be_t.h"
* 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 *
*/
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.
*/
(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)
#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.
*/
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)
*
* @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.
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 },
/**
* 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);