static unsigned *delay_slot_fillers;
static pmap *delay_slots;
-static void sparc_emit_node(const ir_node *node);
static bool emitting_delay_slot;
/**
if (filler != NULL) {
assert(!is_no_instruction(filler));
assert(!emits_multiple_instructions(filler));
- sparc_emit_node(filler);
+ be_emit_node(filler);
} else {
sparc_emitf(NULL, "nop");
}
}
}
-static void emit_nothing(const ir_node *irn)
-{
- (void) irn;
-}
-
-typedef void (*emit_func) (const ir_node *);
-
-static inline void set_emitter(ir_op *op, emit_func sparc_emit_node)
-{
- op->ops.generic = (op_func)sparc_emit_node;
-}
-
/**
* Enters the emitter functions for handled nodes into the generic
* pointer of an opcode.
sparc_register_spec_emitters();
/* custom emitter */
- set_emitter(op_be_Copy, emit_be_Copy);
- set_emitter(op_be_CopyKeep, emit_be_Copy);
- set_emitter(op_be_IncSP, emit_be_IncSP);
- set_emitter(op_be_MemPerm, emit_be_MemPerm);
- set_emitter(op_be_Perm, emit_be_Perm);
- set_emitter(op_sparc_Ba, emit_sparc_Ba);
- set_emitter(op_sparc_Bicc, emit_sparc_Bicc);
- set_emitter(op_sparc_Call, emit_sparc_Call);
- set_emitter(op_sparc_fbfcc, emit_sparc_fbfcc);
- set_emitter(op_sparc_FrameAddr, emit_sparc_FrameAddr);
- set_emitter(op_sparc_SubSP, emit_sparc_SubSP);
- set_emitter(op_sparc_Restore, emit_sparc_Restore);
- set_emitter(op_sparc_Return, emit_sparc_Return);
- set_emitter(op_sparc_SDiv, emit_sparc_SDiv);
- set_emitter(op_sparc_SwitchJmp, emit_sparc_SwitchJmp);
- set_emitter(op_sparc_UDiv, emit_sparc_UDiv);
+ be_set_emitter(op_be_Copy, emit_be_Copy);
+ be_set_emitter(op_be_CopyKeep, emit_be_Copy);
+ be_set_emitter(op_be_IncSP, emit_be_IncSP);
+ be_set_emitter(op_be_MemPerm, emit_be_MemPerm);
+ be_set_emitter(op_be_Perm, emit_be_Perm);
+ be_set_emitter(op_sparc_Ba, emit_sparc_Ba);
+ be_set_emitter(op_sparc_Bicc, emit_sparc_Bicc);
+ be_set_emitter(op_sparc_Call, emit_sparc_Call);
+ be_set_emitter(op_sparc_FrameAddr, emit_sparc_FrameAddr);
+ be_set_emitter(op_sparc_Restore, emit_sparc_Restore);
+ be_set_emitter(op_sparc_Return, emit_sparc_Return);
+ be_set_emitter(op_sparc_SDiv, emit_sparc_SDiv);
+ be_set_emitter(op_sparc_SubSP, emit_sparc_SubSP);
+ be_set_emitter(op_sparc_SwitchJmp, emit_sparc_SwitchJmp);
+ be_set_emitter(op_sparc_UDiv, emit_sparc_UDiv);
+ be_set_emitter(op_sparc_fbfcc, emit_sparc_fbfcc);
/* no need to emit anything for the following nodes */
- set_emitter(op_be_Keep, emit_nothing);
- set_emitter(op_sparc_Start, emit_nothing);
- set_emitter(op_Phi, emit_nothing);
-}
-
-/**
- * Emits code for a node.
- */
-static void sparc_emit_node(const ir_node *node)
-{
- ir_op *op = get_irn_op(node);
-
- if (op->ops.generic) {
- emit_func func = (emit_func) op->ops.generic;
- be_dwarf_location(get_irn_dbg_info(node));
- (*func) (node);
- } else {
- panic("No emit handler for node %+F (graph %+F)\n", node,
- get_irn_irg(node));
- }
+ be_set_emitter(op_Phi, be_emit_nothing);
+ be_set_emitter(op_be_Keep, be_emit_nothing);
+ be_set_emitter(op_sparc_Start, be_emit_nothing);
}
static bool block_needs_label(const ir_node *block, const ir_node *sched_prev)
sched_foreach(block, node) {
if (rbitset_is_set(delay_slot_fillers, get_irn_idx(node)))
continue;
- sparc_emit_node(node);
+ be_emit_node(node);
}
}