X-Git-Url: http://nsz.repo.hu/git/?a=blobdiff_plain;f=ir%2Fbe%2Fbenode_t.h;h=aa426e6534e6d2151f5fbf6d0f4a98a31f7a5846;hb=4ed245f5007168dab7850942a7ee6b6b29a19817;hp=035257f3eca241556351876275d06f46aa8aa05e;hpb=0d5be81726ac97d9c03854f92248f5f803e587cb;p=libfirm diff --git a/ir/be/benode_t.h b/ir/be/benode_t.h index 035257f3e..aa426e653 100644 --- a/ir/be/benode_t.h +++ b/ir/be/benode_t.h @@ -29,6 +29,7 @@ extern ir_op *op_be_Spill; extern ir_op *op_be_Reload; extern ir_op *op_be_Perm; +extern ir_op *op_be_MemPerm; extern ir_op *op_be_Copy; extern ir_op *op_be_Keep; extern ir_op *op_be_CopyKeep; @@ -49,6 +50,7 @@ typedef enum { beo_Spill, beo_Reload, beo_Perm, + beo_MemPerm, beo_Copy, beo_Keep, beo_CopyKeep, @@ -85,6 +87,11 @@ typedef enum { */ #define BE_STACK_FRAME_SIZE ((unsigned) -1) +/** + * Determines if irn is a be_node. + */ +int is_be_node(const ir_node *irn); + /** * Create all BE specific opcodes. */ @@ -101,7 +108,7 @@ enum { /** * 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 *ctx); +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); /** * Position numbers for the be_Reload inputs. @@ -129,11 +136,17 @@ enum { ir_node *be_new_Copy(const arch_register_class_t *cls, ir_graph *irg, ir_node *block, ir_node *in); /** Returns the Copy Argument. */ ir_node *be_get_Copy_op(const ir_node *cpy); +/** Sets the Copy Argument. */ +void be_set_Copy_op(ir_node *cpy, ir_node *op); /** * Make a new Perm node. */ ir_node *be_new_Perm(const arch_register_class_t *cls, ir_graph *irg, ir_node *bl, int arity, ir_node *in[]); +/** + * Create a new MemPerm node. + */ +ir_node *be_new_MemPerm(const arch_env_t *arch_env, ir_graph *irg, ir_node *bl, int n, 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, @@ -151,6 +164,12 @@ enum { be_pos_AddSP_last = 2 }; +enum { + pn_be_AddSP_res = 0, + pn_be_AddSP_M = 1, + pn_be_AddSP_last = 2 +}; + /** * Make a new AddSP node. * An AddSP node expresses an increase of the stack pointer in the direction the stack @@ -265,12 +284,35 @@ ir_node *be_new_RegParams(ir_graph *irg, ir_node *bl, int n_out); ir_node *be_new_Barrier(ir_graph *irg, ir_node *bl, int n, ir_node *in[]); -ir_node *be_spill(const arch_env_t *arch_env, ir_node *irn, ir_node *spill_ctx); -ir_node *be_reload(const arch_env_t *arch_env, const arch_register_class_t *cls, ir_node *reloader, ir_mode *mode, ir_node *spill); +/** + * Make a spill node. + * + * @param arch_env The architecture environment. + * @param irn The node to be spilled. + * @param spill_ctx The context in which the spill is introduced (This is mostly == irn up to the case of Phis). + * @return The new spill node. + */ +ir_node *be_spill(const arch_env_t *arch_env, ir_node *irn); + +/** + * Make a reload and insert it into the schedule. + * + * @param arch_env The architecture environment. + * @param cls The register class of the reloaded value. + * @param insert The node in the schedule in front of which the reload is inserted. + * @param mode The mode of the original (spilled) value. + * @param spill The spill node corresponding to this reload. + * @return A freshly made reload. + */ +ir_node *be_reload(const arch_env_t *arch_env, const arch_register_class_t *cls, ir_node *insert, ir_mode *mode, ir_node *spill); +enum { + be_pos_CopyKeep_op = 0 +}; ir_node *be_new_CopyKeep(const arch_register_class_t *cls, ir_graph *irg, ir_node *bl, ir_node *src, int n, ir_node *in_keep[], ir_mode *mode); ir_node *be_new_CopyKeep_single(const arch_register_class_t *cls, ir_graph *irg, ir_node *bl, ir_node *src, ir_node *keep, ir_mode *mode); - +ir_node *be_get_CopyKeep_op(const ir_node *cpy); +void be_set_CopyKeep_op(ir_node *cpy, ir_node *op); /** * Get the backend opcode of a backend node. @@ -283,6 +325,7 @@ int be_is_Spill(const ir_node *irn); int be_is_Reload(const ir_node *irn); int be_is_Copy(const ir_node *irn); int be_is_Perm(const ir_node *irn); +int be_is_MemPerm(const ir_node *irn); int be_is_Keep(const ir_node *irn); int be_is_CopyKeep(const ir_node *irn); int be_is_Call(const ir_node *irn); @@ -298,24 +341,22 @@ int be_is_FrameStore(const ir_node *irn); int be_is_Barrier(const ir_node *irn); /** - * Get the entity on the stack frame the given node uses. - * @param irn The node. - * @return The entity on the stack frame used by the node or NULL, - * if the node does not access the stack frame or is no back-end node. + * Try to avoid this function and better call arch_get_frame_entity! * + * Returns the frame entity used by the be node */ -entity *be_get_frame_entity(const ir_node *irn); +entity* be_get_frame_entity(const ir_node *irn); -void be_set_Spill_entity(ir_node *irn, entity *ent); -entity *be_get_spill_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_context(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); -/** - * Set the entities of a Reload to the ones of the Spill it is pointing to. - * @param irg The graph. - */ -void be_copy_entities_to_reloads(ir_graph *irg); +void be_set_MemPerm_out_entity(const ir_node *irn, int n, entity* ent); +entity *be_get_MemPerm_out_entity(const ir_node *irn, int n); + +int be_get_MemPerm_entity_arity(const ir_node *irn); /** * Impose a register constraint on a backend node.