Moved transformation of CopyB nodes into ia32_common_transform and use it in the...
authorSebastian Buchwald <Sebastian.Buchwald@kit.edu>
Mon, 18 Aug 2008 12:23:42 +0000 (12:23 +0000)
committerSebastian Buchwald <Sebastian.Buchwald@kit.edu>
Mon, 18 Aug 2008 12:23:42 +0000 (12:23 +0000)
[r21241]

ir/be/ia32/ia32_common_transform.c
ir/be/ia32/ia32_common_transform.h
ir/be/ia32/ia32_transform.c

index 8d1b9e0..6d12471 100644 (file)
@@ -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);
index 6d6b3bf..8c1b62c 100644 (file)
@@ -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
index d6e588e..594c781 100644 (file)
@@ -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);