#include <limits.h>
+#include "be_t.h"
#include "error.h"
#include "xmalloc.h"
#include "tv.h"
*
***********************************************************************************/
-/**
- * Default emitter for anything that we don't want to generate code for.
- */
-static void emit_nothing(const ir_node *node)
-{
- (void) node;
-}
-
/**
* Emit a SymConst.
*/
emit_amd64_binop_op(irn, second_op);
}
-/**
- * The type of a emitter function.
- */
-typedef void (emit_func)(const ir_node *irn);
-
-/**
- * Set a node emitter. Make it a bit more type safe.
- */
-static inline void set_emitter(ir_op *op, emit_func arm_emit_node)
-{
- op->ops.generic = (op_func)arm_emit_node;
-}
-
/**
* Enters the emitter functions for handled nodes into the generic
* pointer of an opcode.
/* register all emitter functions defined in spec */
amd64_register_spec_emitters();
- set_emitter(op_amd64_SymConst, emit_amd64_SymConst);
- set_emitter(op_amd64_Jmp, emit_amd64_Jmp);
- set_emitter(op_amd64_Jcc, emit_amd64_Jcc);
- set_emitter(op_amd64_Conv, emit_amd64_Conv);
- set_emitter(op_amd64_FrameAddr, emit_amd64_FrameAddr);
- set_emitter(op_be_Return, emit_be_Return);
- set_emitter(op_be_Call, emit_be_Call);
- set_emitter(op_be_Copy, emit_be_Copy);
- set_emitter(op_be_IncSP, emit_be_IncSP);
- set_emitter(op_be_Perm, emit_be_Perm);
-
- set_emitter(op_amd64_Add, emit_amd64_binop);
- set_emitter(op_amd64_Sub, emit_amd64_binop);
-
- set_emitter(op_be_Start, emit_nothing);
- set_emitter(op_be_Keep, emit_nothing);
- set_emitter(op_Phi, emit_nothing);
-}
-
-typedef void (*emit_func_ptr) (const ir_node *);
-
-/**
- * Emits code for a node.
- */
-static void amd64_emit_node(const ir_node *node)
-{
- ir_op *op = get_irn_op(node);
-
- if (op->ops.generic) {
- emit_func_ptr func = (emit_func_ptr) op->ops.generic;
- (*func) (node);
- } else {
- ir_fprintf(stderr, "No emitter for node %+F\n", node);
- }
+ be_set_emitter(op_amd64_Add, emit_amd64_binop);
+ be_set_emitter(op_amd64_Conv, emit_amd64_Conv);
+ be_set_emitter(op_amd64_FrameAddr, emit_amd64_FrameAddr);
+ be_set_emitter(op_amd64_Jcc, emit_amd64_Jcc);
+ be_set_emitter(op_amd64_Jmp, emit_amd64_Jmp);
+ be_set_emitter(op_amd64_Sub, emit_amd64_binop);
+ be_set_emitter(op_amd64_SymConst, emit_amd64_SymConst);
+ be_set_emitter(op_be_Call, emit_be_Call);
+ be_set_emitter(op_be_Copy, emit_be_Copy);
+ be_set_emitter(op_be_IncSP, emit_be_IncSP);
+ be_set_emitter(op_be_Perm, emit_be_Perm);
+ be_set_emitter(op_be_Return, emit_be_Return);
+
+ be_set_emitter(op_Phi, be_emit_nothing);
+ be_set_emitter(op_be_Keep, be_emit_nothing);
+ be_set_emitter(op_be_Start, be_emit_nothing);
}
/**
be_gas_begin_block(block, true);
sched_foreach(block, node) {
- amd64_emit_node(node);
+ be_emit_node(node);
}
}