extern ir_op *op_be_Return;
extern ir_op *op_be_IncSP;
extern ir_op *op_be_AddSP;
+extern ir_op *op_be_SubSP;
extern ir_op *op_be_SetSP;
extern ir_op *op_be_RegParams;
extern ir_op *op_be_StackParam;
beo_Call,
beo_Return,
beo_AddSP,
+ beo_SubSP,
beo_IncSP,
beo_SetSP,
beo_RegParams,
* Position numbers for the be_Spill inputs.
*/
enum {
- be_pos_Spill_frame = 0,
- be_pos_Spill_val = 1
+ be_pos_Spill_val = 0
};
/**
* Make a new Spill node.
*/
-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 *be_new_Spill(const arch_register_class_t *cls, ir_graph *irg, ir_node *bl, ir_node *node_to_spill);
/**
* Position numbers for the be_Reload inputs.
*/
enum {
- be_pos_Reload_frame = 0,
- be_pos_Reload_mem = 1
+ be_pos_Reload_mem = 0
};
/**
* Make a new Reload node.
*/
-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_Reload(const arch_register_class_t *cls, ir_graph *irg, ir_node *bl, ir_node *spill_node, ir_mode *mode);
/**
* Position numbers for the be_Copy inputs.
*/
ir_node *be_new_AddSP(const arch_register_t *sp, ir_graph *irg, ir_node *bl, ir_node *old_sp, ir_node *sz);
+/**
+ * Position numbers for the be_SubSP inputs
+ */
+enum {
+ be_pos_SubSP_old_sp = 0,
+ be_pos_SubSP_size = 1,
+ be_pos_SubSP_last = 2
+};
+
+enum {
+ pn_be_SubSP_res = 0,
+ pn_be_SubSP_M = 1,
+ pn_be_SubSP_last = 2
+};
+
+/**
+ * Make a new SubSP node.
+ * A SubSP node expresses a decrease of the stack pointer in the direction the stack
+ * grows. In contrast to IncSP, the amount of bytes the stack pointer is grown, is not
+ * given by a constant but an ordinary Firm node.
+ * @param sp The stack pointer register.
+ * @param irg The graph.
+ * @param bl The block.
+ * @param old_sp The node representing the old stack pointer value.
+ * @param sz The node expressing the size by which the stack pointer shall be grown.
+ * @return A new DecSP node.
+ */
+ir_node *be_new_SubSP(const arch_register_t *sp, ir_graph *irg, ir_node *bl, 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);
/**
* @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, int offset);
+ir_node *be_new_IncSP(const arch_register_t *sp, ir_graph *irg, ir_node *bl, ir_node *old_sp, int offset);
/** Returns the previous node that computes the stack pointer. */
ir_node *be_get_IncSP_pred(ir_node *incsp);
/** Sets the previous node that computes the stack pointer. */
void be_set_IncSP_pred(ir_node *incsp, ir_node *pred);
-/** Returns the memory input of the IncSP. */
-ir_node *be_get_IncSP_mem(ir_node *irn);
-
/**
* Sets a new offset to a IncSP node.
* A positive offset means expanding the stack, a negative offset shrinking
entity* be_get_frame_entity(const ir_node *irn);
ir_node* be_get_Reload_mem(const ir_node *irn);
-ir_node* be_get_Reload_frame(const ir_node* irn);
-
ir_node* be_get_Spill_val(const ir_node *irn);
-ir_node* be_get_Spill_frame(const ir_node* irn);
void be_set_MemPerm_in_entity(const ir_node *irn, int n, entity* ent);
entity *be_get_MemPerm_in_entity(const ir_node *irn, int n);