#ifndef _FIRM_BEARCH_H
#define _FIRM_BEARCH_H
-#ifdef HAVE_CONFIG_H
-#include "config.h"
-#endif
-
+#include "firm_config.h"
#ifdef WITH_LIBCORE
#include <libcore/lc_opts.h>
#endif
-#include "type.h"
-
-#include "irnode.h"
-#include "irmode.h"
+#include "firm_types.h"
#include "bitset.h"
-#include "hashptr.h"
-#include "fourcc.h"
-#include "set.h"
-#include "list.h"
-#include "ident.h"
#include "belistsched.h"
#include "beabi_t.h"
+#include "bearch_t.h"
#include "be_t.h"
-typedef struct _arch_register_class_t arch_register_class_t;
-typedef struct _arch_register_t arch_register_t;
-typedef struct _arch_isa_if_t arch_isa_if_t;
-typedef struct _arch_isa_t arch_isa_t;
-typedef struct _arch_env_t arch_env_t;
-typedef struct _arch_irn_ops_if_t arch_irn_ops_if_t;
-typedef struct _arch_irn_ops_t arch_irn_ops_t;
-typedef struct _arch_irn_handler_t arch_irn_handler_t;
-typedef struct _arch_code_generator_t arch_code_generator_t;
-typedef struct _arch_code_generator_if_t arch_code_generator_if_t;
-
struct _be_node_factory_t;
typedef enum _arch_register_type_t {
arch_register_req_type_should_be_different = 8, /**< The register must be unequal
to some other at the node. */
+ arch_register_req_type_should_be_different_from_all = 16, /**< The register must be different from
+ all in's at the node */
} arch_register_req_type_t;
/**
*/
extern arch_irn_flags_t arch_irn_get_flags(const arch_env_t *env, const ir_node *irn);
-#define arch_irn_is_ignore(env, irn) ((arch_irn_get_flags(env, irn) & arch_irn_flags_ignore) != 0)
+#define arch_irn_is(env, irn, flag) ((arch_irn_get_flags(env, irn) & arch_irn_flags_ ## flag) != 0)
#define arch_irn_has_reg_class(env, irn, pos, cls) \
((cls) == arch_get_irn_reg_class(env, irn, pos))
#define arch_irn_consider_in_reg_alloc(env, cls, irn) \
- (arch_irn_has_reg_class(env, irn, -1, cls) && !arch_irn_is_ignore(env, irn))
+ (arch_irn_has_reg_class(env, irn, -1, cls) && !arch_irn_is(env, irn, ignore))
/**
- * Somebody who can be asked about nodes.
+ * Somebody who can be asked about IR nodes.
*/
struct _arch_irn_handler_t {
*/
const void *(*get_irn_ops)(const arch_irn_handler_t *handler,
const ir_node *irn);
-
};
/**
- * The code generator.
+ * The code generator interface.
*/
struct _arch_code_generator_if_t {
-
-
/**
* Initialize the code generator.
* @param file The file to dump to.
*/
void *(*init)(FILE *file, const be_irg_t *birg);
+ /**
+ * Called before abi introduce.
+ */
+ void (*before_abi)(void *self);
+
/**
* Called, when the graph is being normalized.
*/
*/
void (*before_ra)(void *self);
+ /**
+ * Called after register allocation.
+ */
+ void (*after_ra)(void *self);
+
/**
* Called after everything happened.
* The code generator must also be de-allocated here.
*/
void (*done)(void *self);
-
};
+/**
+ * helper macro: call function func from the code generator
+ * if it's implemented.
+ */
#define _arch_cg_call(cg, func) \
do { \
if((cg)->impl->func) \
(cg)->impl->func(cg); \
} 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_before_ra(cg) _arch_cg_call(cg, before_ra)
+#define arch_code_generator_after_ra(cg) _arch_cg_call(cg, after_ra)
#define arch_code_generator_done(cg) _arch_cg_call(cg, done)
/**