From: Sebastian Buchwald Date: Mon, 18 Aug 2008 12:23:42 +0000 (+0000) Subject: Moved transformation of CopyB nodes into ia32_common_transform and use it in the... X-Git-Url: http://nsz.repo.hu/git/?a=commitdiff_plain;h=5be4ee80458530a271460a4f53b8424288e35738;p=libfirm Moved transformation of CopyB nodes into ia32_common_transform and use it in the pbqp transformer. [r21241] --- diff --git a/ir/be/ia32/ia32_common_transform.c b/ir/be/ia32/ia32_common_transform.c index 8d1b9e002..6d124719d 100644 --- a/ir/be/ia32/ia32_common_transform.c +++ b/ir/be/ia32/ia32_common_transform.c @@ -667,6 +667,66 @@ ir_node *gen_ASM(ir_node *node) return new_node; } +ir_node *gen_CopyB(ir_node *node) { + ir_node *block = NULL; + ir_node *src = NULL; + ir_node *new_src = NULL; + ir_node *dst = NULL; + ir_node *new_dst = NULL; + ir_node *mem = NULL; + ir_node *new_mem = NULL; + ir_node *res = NULL; + ir_graph *irg = current_ir_graph; + dbg_info *dbgi = get_irn_dbg_info(node); + int size = get_type_size_bytes(get_CopyB_type(node)); + int rem; + + switch (be_transformer) { + case TRANSFORMER_DEFAULT: + block = be_transform_node(get_nodes_block(node)); + src = get_CopyB_src(node); + new_src = be_transform_node(src); + dst = get_CopyB_dst(node); + new_dst = be_transform_node(dst); + mem = get_CopyB_mem(node); + new_mem = be_transform_node(mem); + break; + +#ifdef FIRM_GRGEN_BE + case TRANSFORMER_PBQP: + block = get_nodes_block(node); + new_src = get_CopyB_src(node); + new_dst = get_CopyB_dst(node); + new_mem = get_CopyB_mem(node); + break; +#endif + + default: panic("invalid transformer"); + } + + /* If we have to copy more than 32 bytes, we use REP MOVSx and */ + /* then we need the size explicitly in ECX. */ + if (size >= 32 * 4) { + rem = size & 0x3; /* size % 4 */ + size >>= 2; + + res = new_rd_ia32_Const(dbgi, irg, block, NULL, 0, size); + add_irn_dep(res, get_irg_frame(irg)); + + res = new_rd_ia32_CopyB(dbgi, irg, block, new_dst, new_src, res, new_mem, rem); + } else { + if(size == 0) { + ir_fprintf(stderr, "Optimization warning copyb %+F with size <4\n", + node); + } + res = new_rd_ia32_CopyB_i(dbgi, irg, block, new_dst, new_src, new_mem, size); + } + + SET_IA32_ORIG_NODE(res, ia32_get_old_node_name(env_cg, node)); + + return res; +} + ir_node *gen_Unknown(ir_node *node) { ir_mode *mode = get_irn_mode(node); diff --git a/ir/be/ia32/ia32_common_transform.h b/ir/be/ia32/ia32_common_transform.h index 6d6b3bf70..8c1b62c65 100644 --- a/ir/be/ia32/ia32_common_transform.h +++ b/ir/be/ia32/ia32_common_transform.h @@ -86,6 +86,13 @@ int ia32_mode_needs_gp_reg(ir_mode *mode); */ ir_node *gen_ASM(ir_node *node); +/** + * Transforms a CopyB node. + * + * @return The transformed node. + */ +ir_node *gen_CopyB(ir_node *node) ; + /** * This function just sets the register for the Unknown node * as this is not done during register allocation because Unknown diff --git a/ir/be/ia32/ia32_transform.c b/ir/be/ia32/ia32_transform.c index d6e588e1c..594c78145 100644 --- a/ir/be/ia32/ia32_transform.c +++ b/ir/be/ia32/ia32_transform.c @@ -2627,48 +2627,6 @@ static ir_node *gen_Cond(ir_node *node) { return new_node; } -/** - * Transforms a CopyB node. - * - * @return The transformed node. - */ -static ir_node *gen_CopyB(ir_node *node) { - ir_node *block = be_transform_node(get_nodes_block(node)); - ir_node *src = get_CopyB_src(node); - ir_node *new_src = be_transform_node(src); - ir_node *dst = get_CopyB_dst(node); - ir_node *new_dst = be_transform_node(dst); - ir_node *mem = get_CopyB_mem(node); - ir_node *new_mem = be_transform_node(mem); - ir_node *res = NULL; - ir_graph *irg = current_ir_graph; - dbg_info *dbgi = get_irn_dbg_info(node); - int size = get_type_size_bytes(get_CopyB_type(node)); - int rem; - - /* If we have to copy more than 32 bytes, we use REP MOVSx and */ - /* then we need the size explicitly in ECX. */ - if (size >= 32 * 4) { - rem = size & 0x3; /* size % 4 */ - size >>= 2; - - res = new_rd_ia32_Const(dbgi, irg, block, NULL, 0, size); - add_irn_dep(res, get_irg_frame(irg)); - - res = new_rd_ia32_CopyB(dbgi, irg, block, new_dst, new_src, res, new_mem, rem); - } else { - if(size == 0) { - ir_fprintf(stderr, "Optimization warning copyb %+F with size <4\n", - node); - } - res = new_rd_ia32_CopyB_i(dbgi, irg, block, new_dst, new_src, new_mem, size); - } - - SET_IA32_ORIG_NODE(res, ia32_get_old_node_name(env_cg, node)); - - return res; -} - static ir_node *gen_be_Copy(ir_node *node) { ir_node *new_node = be_duplicate_node(node);