From d65cd734137c0059ec181d33791335c667b3a846 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Christian=20W=C3=BCrdig?= Date: Mon, 4 Dec 2006 15:54:09 +0000 Subject: [PATCH] added ilp scheduler interface --- ir/be/beilpsched.h | 103 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 103 insertions(+) diff --git a/ir/be/beilpsched.h b/ir/be/beilpsched.h index 3b8240d2e..277e3372d 100644 --- a/ir/be/beilpsched.h +++ b/ir/be/beilpsched.h @@ -3,6 +3,109 @@ #include "firm_config.h" +#include "bemachine.h" + +typedef struct _ilp_sched_selector_t ilp_sched_selector_t; + +/** + * A selector interface which is used by the ILP schedule framework. + * These functions provide the ILP scheduler with necessary information + * from the backend or they pass back information to the backend about + * the state of scheduling. + */ +struct _ilp_sched_selector_t { + + /** + * This function is called before the scheduling of the irg. + * @param self The this pointer. + * @param irg The irg being scheduled. + * @return An irg scheduling environment. + */ + void *(*init_irg_ilp_schedule)(const void *self, ir_graph *irg); + + /** + * This functions is called after an irg has been scheduled. + * @param self The this pointer. + * @param irg The irg which has been scheduled. + * @param irg_env The irg scheduling environment. + */ + void (*finish_irg_ilp_schedule)(const void *self, ir_graph *irg, void *irg_env); + + /** + * This function is called before the scheduling of a block starts. + * @param self The this pointer. + * @param block The block being scheduled. + * @return A block scheduling environment. + */ + void *(*init_block_ilp_schedule)(const void *self, ir_node *block); + + /** + * This functions is called after a block has been scheduled. + * @param self The this pointer. + * @param block The block which has been scheduled. + * @param block_env The block scheduling environment. + */ + void (*finish_block_ilp_schedule)(const void *self, ir_node *block, void *block_env); + + /** + * Calculates the latency of node @p irn. + * @param self The this pointer. + * @param irn The node. + * @param block_env The block scheduling environment. + * @return The latency in cycles of node @p irn. + */ + unsigned (*latency)(const void *self, ir_node *irn, void *block_env); + + /** + * This function is called after a certain node has been scheduled. + * @param self The this pointer. + * @param irn The node which has been scheduled. + * @param cycle The cycle at which the node is scheduled. + * @param block_env The block scheduling environment. + */ + void (*node_scheduled)(const void *self, ir_node *irn, unsigned cycle, void *block_env); +}; + +#define BE_ILP_SCHED_CALL(func, self, obj, env) \ + do { \ + if ((self)->func) \ + (self)->func((self), (obj), (env)); \ + } while (0) + +#define BE_ILP_SCHED_CALL2(func, self, obj, obj2, env) \ + do { \ + if ((self)->func) \ + (self)->func((self), (obj), (obj2), (env)); \ + } while (0) + +#define BE_ILP_SCHED_CALL_ENVRET(func, self, obj, defret) \ + ((self)->func ? (self)->func((self), (obj)) : (defret)) + +#define BE_ILP_SCHED_CALL_RET(func, self, obj, env, defret) \ + ((self)->func ? (self)->func((self), (obj), (env)) : (defret)) + +/** + * Convenience macros for all functions. + */ + +#define be_ilp_sched_init_irg_ilp_schedule(self, irg) \ + BE_ILP_SCHED_CALL_ENVRET(init_irg_ilp_schedule, self, irg, NULL) + +#define be_ilp_sched_finish_irg_ilp_schedule(self, irg, irg_env) \ + BE_ILP_SCHED_CALL(finish_irg_ilp_schedule, self, irg, irg_env) + +#define be_ilp_sched_init_block_ilp_schedule(self, block) \ + BE_ILP_SCHED_CALL_ENVRET(init_block_ilp_schedule, self, block, NULL) + +#define be_ilp_sched_finish_block_ilp_schedule(self, block, block_env) \ + BE_ILP_SCHED_CALL(finish_block_ilp_schedule, self, block, block_env) + +#define be_ilp_sched_latency(self, irn, block_env) \ + BE_ILP_SCHED_CALL_RET(latency, self, irn, block_env, 0) + +#define be_ilp_sched_node_scheduled(self, irn, cycle, block_env) \ + BE_ILP_SCHED_CALL2(node_scheduled, self, irn, cycle, block_env) + /** * Perform ILP scheduling on given birg. */ -- 2.20.1