+/**
+ * The benode op's. Must be available to register emitter function.
+ */
+extern ir_op *op_be_Spill;
+extern ir_op *op_be_Reload;
+extern ir_op *op_be_Perm;
+extern ir_op *op_be_Copy;
+extern ir_op *op_be_Keep;
+extern ir_op *op_be_Call;
+extern ir_op *op_be_Return;
+extern ir_op *op_be_IncSP;
+extern ir_op *op_be_Alloca;
+extern ir_op *op_be_SetSP;
+extern ir_op *op_be_RegParams;
+extern ir_op *op_be_StackParam;
+extern ir_op *op_be_FrameAddr;
+extern ir_op *op_be_FrameLoad;
+extern ir_op *op_be_FrameStore;
+
+typedef enum {
+ beo_NoBeOp = 0,
+ beo_Spill,
+ beo_Reload,
+ beo_Perm,
+ beo_Copy,
+ beo_Keep,
+ beo_NoReg,
+ beo_Call,
+ beo_Return,
+ beo_Alloca,
+ beo_IncSP,
+ beo_SetSP,
+ beo_RegParams,
+ beo_StackParam,
+ beo_FrameLoad,
+ beo_FrameStore,
+ beo_FrameAddr,
+ beo_Last
+} be_opcode_t;
+
+/** Expresses the direction of the stack pointer increment of IncSP nodes. */
+typedef enum {
+ be_stack_dir_along = 0,
+ be_stack_dir_against = 1
+} be_stack_dir_t;
+
+/** Not used yet. */
+typedef enum {
+ be_frame_flag_spill = 1,
+ be_frame_flag_local = 2,
+ be_frame_flag_arg = 4
+} be_frame_flag_t;
+
+/**
+ * A "symbolic constant" for the size of the stack frame to use with IncSP nodes.
+ * It gets back-patched to the real size as soon it is known.
+ */
+#define BE_STACK_FRAME_SIZE ((unsigned) -1)
+
+void be_node_init(void);
+
+const arch_irn_handler_t be_node_irn_handler;
+
+enum {
+ be_pos_Spill_frame = 0,
+ be_pos_Spill_val = 1
+};
+ir_node *be_new_Spill(const arch_register_class_t *cls, const arch_register_class_t *cls_frame, ir_graph *irg, ir_node *bl, ir_node *frame, ir_node *node_to_spill, ir_node *ctx);
+
+enum {
+ be_pos_Reload_frame = 0,
+ be_pos_Reload_mem = 1
+};
+ir_node *be_new_Reload(const arch_register_class_t *cls, const arch_register_class_t *cls_frame, ir_graph *irg, ir_node *bl, ir_node *frame, ir_node *spill_node, ir_mode *mode);
+ir_node *be_new_Copy(const arch_register_class_t *cls, ir_graph *irg, ir_node *block, ir_node *in);
+ir_node *be_new_Perm(const arch_register_class_t *cls, ir_graph *irg, ir_node *bl, int arity, ir_node *in[]);
+ir_node *be_new_Keep(const arch_register_class_t *cls, ir_graph *irg, ir_node *bl, int arity, ir_node *in[]);
+
+ir_node *be_new_FrameLoad(const arch_register_class_t *cls_frame, const arch_register_class_t *cls_data,
+ ir_graph *irg, ir_node *bl, ir_node *mem, ir_node *frame, entity *ent);
+ir_node *be_new_FrameStore(const arch_register_class_t *cls_frame, const arch_register_class_t *cls_data,
+ ir_graph *irg, ir_node *bl, ir_node *mem, ir_node *frame, ir_node *data, entity *ent);
+ir_node *be_new_FrameAddr(const arch_register_class_t *cls_frame, ir_graph *irg, ir_node *bl, ir_node *frame, entity *ent);
+
+ir_node *be_new_Alloca(const arch_register_t *sp, ir_graph *irg, ir_node *bl, ir_node *mem, ir_node *old_sp, ir_node *sz);
+
+ir_node *be_new_SetSP(const arch_register_t *sp, ir_graph *irg, ir_node *bl, ir_node *old_sp, ir_node *operand, ir_node *mem);
+
+/**
+ * Make a stack pointer increase/decrease node.
+ * @param sp The stack pointer register.
+ * @param irg The graph to insert the node to.
+ * @param bl The block to insert the node into.
+ * @param old_sp The node defining the former stack pointer.
+ * @param amount The mount of bytes the stack pointer shall be increased/decreased.
+ * @param dir The direction in which the stack pointer shall be modified:
+ * Along the stack's growing direction or against.
+ * @return A new stack pointer increment/decrement node.
+ * @note This node sets a register constraint to the @p sp register on its output.
+ */
+ir_node *be_new_IncSP(const arch_register_t *sp, ir_graph *irg, ir_node *bl, ir_node *old_sp, ir_node *mem, unsigned amount, be_stack_dir_t dir);
+
+void be_set_IncSP_offset(ir_node *irn, unsigned offset);
+unsigned be_get_IncSP_offset(const ir_node *irn);
+
+void be_set_IncSP_direction(ir_node *irn, be_stack_dir_t dir);
+be_stack_dir_t be_get_IncSP_direction(const ir_node *irn);