static arch_irn_class_t TEMPLATE_classify(const ir_node *irn)
{
(void) irn;
- return 0;
+ return arch_irn_class_none;
}
static ir_entity *TEMPLATE_get_frame_entity(const ir_node *node)
-const arch_isa_if_t TEMPLATE_isa_if;
+extern const arch_isa_if_t TEMPLATE_isa_if;
static TEMPLATE_isa_t TEMPLATE_isa_template = {
{
&TEMPLATE_isa_if, /* isa interface implementation */
- &TEMPLATE_gp_regs[REG_SP], /* stack pointer register */
- &TEMPLATE_gp_regs[REG_BP], /* base pointer register */
+ N_TEMPLATE_REGISTERS,
+ TEMPLATE_registers,
+ N_TEMPLATE_CLASSES,
+ TEMPLATE_reg_classes,
+ &TEMPLATE_registers[REG_SP], /* stack pointer register */
+ &TEMPLATE_registers[REG_BP], /* base pointer register */
&TEMPLATE_reg_classes[CLASS_TEMPLATE_gp], /* link pointer register class */
-1, /* stack direction */
2, /* power of two stack alignment for calls, 2^2 == 4 */
*/
static arch_env_t *TEMPLATE_init(FILE *outfile)
{
- static int run_once = 0;
- TEMPLATE_isa_t *isa;
-
- if (run_once)
- return NULL;
- run_once = 1;
-
- isa = XMALLOC(TEMPLATE_isa_t);
+ TEMPLATE_isa_t *isa = XMALLOC(TEMPLATE_isa_t);
memcpy(isa, &TEMPLATE_isa_template, sizeof(*isa));
be_emit_init(outfile);
return &isa->base;
}
-
-
/**
* Closes the output file and frees the ISA structure.
*/
static void TEMPLATE_done(void *self)
{
- TEMPLATE_isa_t *isa = self;
+ TEMPLATE_isa_t *isa = (TEMPLATE_isa_t*)self;
/* emit now all global declarations */
be_gas_emit_decls(isa->base.main_env);
free(self);
}
-
-static unsigned TEMPLATE_get_n_reg_class(void)
-{
- return N_CLASSES;
-}
-
-static const arch_register_class_t *TEMPLATE_get_reg_class(unsigned i)
-{
- assert(i < N_CLASSES);
- return &TEMPLATE_reg_classes[i];
-}
-
-
-
/**
* Get the register class which shall be used to store a value of a given mode.
* @param self The this pointer.
static const arch_register_t *TEMPLATE_abi_prologue(void *self, ir_node **mem,
pmap *reg_map, int *stack_bias)
{
- TEMPLATE_abi_env_t *env = self;
+ TEMPLATE_abi_env_t *env = (TEMPLATE_abi_env_t*)self;
const arch_env_t *arch_env = be_get_irg_arch_env(env->irg);
(void) reg_map;
(void) mem;
mode = get_type_mode(tp);
be_abi_call_res_reg(abi, 0,
- mode_is_float(mode) ? &TEMPLATE_fp_regs[REG_F0] : &TEMPLATE_gp_regs[REG_R0], ABI_CONTEXT_BOTH);
+ mode_is_float(mode) ? &TEMPLATE_registers[REG_F0] : &TEMPLATE_registers[REG_R0], ABI_CONTEXT_BOTH);
}
}
static void TEMPLATE_lower_for_target(void)
{
+ lower_params_t params = {
+ 4, /* def_ptr_alignment */
+ LF_COMPOUND_RETURN | LF_RETURN_HIDDEN, /* flags */
+ ADD_HIDDEN_ALWAYS_IN_FRONT, /* hidden_params */
+ NULL, /* find pointer type */
+ NULL, /* ret_compound_in_regs */
+ };
+
+ /* lower compound param handling */
+ lower_calls_with_compounds(¶ms);
+}
+
+static int TEMPLATE_is_mux_allowed(ir_node *sel, ir_node *mux_false,
+ ir_node *mux_true)
+{
+ (void) sel;
+ (void) mux_false;
+ (void) mux_true;
+ return false;
}
/**
0, /* no inline assembly */
0, /* no support for Rotl nodes */
0, /* 0: little-endian, 1: big-endian */
- TEMPLATE_lower_for_target, /* lowering for target */
NULL, /* architecture dependent settings, will be set later */
- NULL, /* parameter for if conversion */
+ TEMPLATE_is_mux_allowed, /* parameter for if conversion */
NULL, /* float arithmetic mode */
0, /* no trampoline support: size 0 */
0, /* no trampoline support: align 0 */
const arch_isa_if_t TEMPLATE_isa_if = {
TEMPLATE_init,
+ TEMPLATE_lower_for_target,
TEMPLATE_done,
NULL, /* handle intrinsics */
- TEMPLATE_get_n_reg_class,
- TEMPLATE_get_reg_class,
TEMPLATE_get_reg_class_for_mode,
TEMPLATE_get_call_abi,
TEMPLATE_get_reg_class_alignment,