const TEMPLATE_register_req_t *irn_req;
long node_pos = pos == -1 ? 0 : pos;
ir_mode *mode = get_irn_mode(irn);
- firm_dbg_module_t *mod = firm_dbg_register(DEBUG_MODULE);
+ FIRM_DBG_REGISTER(firm_dbg_module_t *mod, DEBUG_MODULE);
if (mode == mode_T || mode == mode_M) {
DBG((mod, LEVEL_1, "ignoring mode_T, mode_M node %+F\n", irn));
static void TEMPLATE_emit_and_done(void *self) {
TEMPLATE_code_gen_t *cg = self;
ir_graph *irg = cg->irg;
- FILE *out = cg->out;
+ FILE *out = cg->isa->out;
if (cg->emit_decls) {
- TEMPLATE_gen_decls(cg->out);
+ TEMPLATE_gen_decls(out);
cg->emit_decls = 0;
}
free(self);
}
-static void *TEMPLATE_cg_init(FILE *F, const be_irg_t *birg);
+static void *TEMPLATE_cg_init(const be_irg_t *birg);
static const arch_code_generator_if_t TEMPLATE_code_gen_if = {
TEMPLATE_cg_init,
/**
* Initializes the code generator.
*/
-static void *TEMPLATE_cg_init(FILE *F, const be_irg_t *birg) {
+static void *TEMPLATE_cg_init(const be_irg_t *birg) {
TEMPLATE_isa_t *isa = (TEMPLATE_isa_t *)birg->main_env->arch_env->isa;
TEMPLATE_code_gen_t *cg = xmalloc(sizeof(*cg));
cg->impl = &TEMPLATE_code_gen_if;
cg->irg = birg->irg;
cg->reg_set = new_set(TEMPLATE_cmp_irn_reg_assoc, 1024);
- cg->mod = firm_dbg_register("firm.be.TEMPLATE.cg");
- cg->out = F;
cg->arch_env = birg->main_env->arch_env;
+ cg->isa = isa;
cg->birg = birg;
+ FIRM_DBG_REGISTER(cg->mod, "firm.be.TEMPLATE.cg");
isa->num_codegens++;
/**
* Initializes the backend ISA and opens the output file.
*/
-static void *TEMPLATE_init(void) {
+static void *TEMPLATE_init(FILE *outfile) {
static int inited = 0;
TEMPLATE_isa_t *isa;
isa = xcalloc(1, sizeof(*isa));
memcpy(isa, &TEMPLATE_isa_template, sizeof(*isa));
+ isa->out = outfile;
+
TEMPLATE_register_init(isa);
TEMPLATE_create_opcodes();
/* be_abi_call_param_reg(abi, i, reg); */
/* default: all parameters on stack */
- be_abi_call_param_stack(abi, i);
+ be_abi_call_param_stack(abi, i, 4, 0, 0);
}
/* TODO: set correct return register */
return &TEMPLATE_sched_selector;
}
+/**
+ * Returns the necessary byte alignment for storing a register of given class.
+ */
+static int TEMPLATE_get_reg_class_alignment(const void *self, const arch_register_class_t *cls) {
+ ir_mode *mode = arch_register_class_mode(cls);
+ return get_mode_size_bytes(mode);
+}
+
+/**
+ * Returns the libFirm configuration parameter for this backend.
+ */
+static const backend_params *TEMPLATE_get_libfirm_params(void) {
+ static arch_dep_params_t ad = {
+ 1, /* allow subs */
+ 0, /* Muls are fast enough on Firm */
+ 31, /* shift would be ok */
+ 0, /* no Mulhs */
+ 0, /* no Mulhu */
+ 0, /* no Mulh */
+ };
+ static backend_params p = {
+ NULL, /* no additional opcodes */
+ NULL, /* will be set later */
+ 0, /* no dword lowering */
+ NULL, /* no creator function */
+ NULL, /* context for create_intrinsic_fkt */
+ };
+
+ p.dep_param = &ad;
+ return &p;
+}
+
#ifdef WITH_LIBCORE
static void TEMPLATE_register_options(lc_opt_entry_t *ent)
{
#endif /* WITH_LIBCORE */
const arch_isa_if_t TEMPLATE_isa_if = {
-#ifdef WITH_LIBCORE
- TEMPLATE_register_options,
-#endif
TEMPLATE_init,
TEMPLATE_done,
TEMPLATE_get_n_reg_class,
TEMPLATE_get_irn_handler,
TEMPLATE_get_code_generator_if,
TEMPLATE_get_list_sched_selector,
+ TEMPLATE_get_reg_class_alignment,
+ TEMPLETE_get_libfirm_params,
+#ifdef WITH_LIBCORE
+ TEMPLATE_register_options
+#endif
};