modernize TEMPLATE backend and simplify some backend APIs
[libfirm] / ir / be / arm / arm_transform.c
index bed3373..96353fb 100644 (file)
@@ -218,10 +218,8 @@ static ir_node *gen_Conv(ir_node *node)
                        }
                } else if (USE_VFP(env_cg->isa)) {
                        panic("VFP not supported yet");
-                       return NULL;
                } else {
                        panic("Softfloat not supported yet");
-                       return NULL;
                }
        } else { /* complete in gp registers */
                int src_bits = get_mode_size_bits(src_mode);
@@ -403,11 +401,9 @@ static ir_node *gen_Add(ir_node *node)
                } else if (USE_VFP(env_cg->isa)) {
                        assert(mode != mode_E && "IEEE Extended FP not supported");
                        panic("VFP not supported yet");
-                       return NULL;
                }
                else {
                        panic("Softfloat not supported yet");
-                       return NULL;
                }
        } else {
 #if 0
@@ -462,11 +458,9 @@ static ir_node *gen_Mul(ir_node *node)
                else if (USE_VFP(env_cg->isa)) {
                        assert(mode != mode_E && "IEEE Extended FP not supported");
                        panic("VFP not supported yet");
-                       return NULL;
                }
                else {
                        panic("Softfloat not supported yet");
-                       return NULL;
                }
        }
        assert(mode_is_data(mode));
@@ -506,7 +500,6 @@ static ir_node *gen_Quot(ir_node *node)
        }
        else {
                panic("Softfloat not supported yet");
-               return NULL;
        }
 }
 
@@ -572,10 +565,8 @@ static ir_node *gen_Sub(ir_node *node)
                } else if (USE_VFP(env_cg->isa)) {
                        assert(mode != mode_E && "IEEE Extended FP not supported");
                        panic("VFP not supported yet");
-                       return NULL;
                } else {
                        panic("Softfloat not supported yet");
-                       return NULL;
                }
        } else {
                return gen_int_binop(node, MATCH_SIZE_NEUTRAL,
@@ -843,7 +834,7 @@ static ir_node *gen_Load(ir_node *node)
        /* check for special case: the loaded value might not be used */
        if (be_get_Proj_for_pn(node, pn_Load_res) == NULL) {
                /* add a result proj and a Keep to produce a pseudo use */
-               ir_node *proj = new_r_Proj(block, new_load, mode_Iu, pn_arm_Ldr_res);
+               ir_node *proj = new_r_Proj(new_load, mode_Iu, pn_arm_Ldr_res);
                be_new_Keep(block, 1, &proj);
        }
 
@@ -1226,7 +1217,6 @@ static ir_node *gen_be_Copy(ir_node *node)
  */
 static ir_node *gen_Proj_Load(ir_node *node)
 {
-       ir_node  *block    = be_transform_node(get_nodes_block(node));
        ir_node  *load     = get_Proj_pred(node);
        ir_node  *new_load = be_transform_node(load);
        dbg_info *dbgi     = get_irn_dbg_info(node);
@@ -1237,17 +1227,17 @@ static ir_node *gen_Proj_Load(ir_node *node)
        case iro_arm_Ldr:
                /* handle all gp loads equal: they have the same proj numbers. */
                if (proj == pn_Load_res) {
-                       return new_rd_Proj(dbgi, block, new_load, mode_Iu, pn_arm_Ldr_res);
+                       return new_rd_Proj(dbgi, new_load, mode_Iu, pn_arm_Ldr_res);
                } else if (proj == pn_Load_M) {
-                       return new_rd_Proj(dbgi, block, new_load, mode_M, pn_arm_Ldr_M);
+                       return new_rd_Proj(dbgi, new_load, mode_M, pn_arm_Ldr_M);
                }
                break;
        case iro_arm_fpaLdf:
                if (proj == pn_Load_res) {
                        ir_mode *mode = get_Load_mode(load);
-                       return new_rd_Proj(dbgi, block, new_load, mode, pn_arm_fpaLdf_res);
+                       return new_rd_Proj(dbgi, new_load, mode, pn_arm_fpaLdf_res);
                } else if (proj == pn_Load_M) {
-                       return new_rd_Proj(dbgi, block, new_load, mode_M, pn_arm_fpaLdf_M);
+                       return new_rd_Proj(dbgi, new_load, mode_M, pn_arm_fpaLdf_M);
                }
                break;
        default:
@@ -1261,7 +1251,6 @@ static ir_node *gen_Proj_Load(ir_node *node)
  */
 static ir_node *gen_Proj_CopyB(ir_node *node)
 {
-       ir_node  *block    = be_transform_node(get_nodes_block(node));
        ir_node  *pred     = get_Proj_pred(node);
        ir_node  *new_pred = be_transform_node(pred);
        dbg_info *dbgi     = get_irn_dbg_info(node);
@@ -1270,7 +1259,7 @@ static ir_node *gen_Proj_CopyB(ir_node *node)
        switch (proj) {
        case pn_CopyB_M_regular:
                if (is_arm_CopyB(new_pred)) {
-                       return new_rd_Proj(dbgi, block, new_pred, mode_M, pn_arm_CopyB_M);
+                       return new_rd_Proj(dbgi, new_pred, mode_M, pn_arm_CopyB_M);
                }
                break;
        default:
@@ -1284,7 +1273,6 @@ static ir_node *gen_Proj_CopyB(ir_node *node)
  */
 static ir_node *gen_Proj_Quot(ir_node *node)
 {
-       ir_node  *block    = be_transform_node(get_nodes_block(node));
        ir_node  *pred     = get_Proj_pred(node);
        ir_node  *new_pred = be_transform_node(pred);
        dbg_info *dbgi     = get_irn_dbg_info(node);
@@ -1294,24 +1282,24 @@ static ir_node *gen_Proj_Quot(ir_node *node)
        switch (proj) {
        case pn_Quot_M:
                if (is_arm_fpaDvf(new_pred)) {
-                       return new_rd_Proj(dbgi, block, new_pred, mode_M, pn_arm_fpaDvf_M);
+                       return new_rd_Proj(dbgi, new_pred, mode_M, pn_arm_fpaDvf_M);
                } else if (is_arm_fpaRdf(new_pred)) {
-                       return new_rd_Proj(dbgi, block, new_pred, mode_M, pn_arm_fpaRdf_M);
+                       return new_rd_Proj(dbgi, new_pred, mode_M, pn_arm_fpaRdf_M);
                } else if (is_arm_fpaFdv(new_pred)) {
-                       return new_rd_Proj(dbgi, block, new_pred, mode_M, pn_arm_fpaFdv_M);
+                       return new_rd_Proj(dbgi, new_pred, mode_M, pn_arm_fpaFdv_M);
                } else if (is_arm_fpaFrd(new_pred)) {
-                       return new_rd_Proj(dbgi, block, new_pred, mode_M, pn_arm_fpaFrd_M);
+                       return new_rd_Proj(dbgi, new_pred, mode_M, pn_arm_fpaFrd_M);
                }
                break;
        case pn_Quot_res:
                if (is_arm_fpaDvf(new_pred)) {
-                       return new_rd_Proj(dbgi, block, new_pred, mode, pn_arm_fpaDvf_res);
+                       return new_rd_Proj(dbgi, new_pred, mode, pn_arm_fpaDvf_res);
                } else if (is_arm_fpaRdf(new_pred)) {
-                       return new_rd_Proj(dbgi, block, new_pred, mode, pn_arm_fpaRdf_res);
+                       return new_rd_Proj(dbgi, new_pred, mode, pn_arm_fpaRdf_res);
                } else if (is_arm_fpaFdv(new_pred)) {
-                       return new_rd_Proj(dbgi, block, new_pred, mode, pn_arm_fpaFdv_res);
+                       return new_rd_Proj(dbgi, new_pred, mode, pn_arm_fpaFdv_res);
                } else if (is_arm_fpaFrd(new_pred)) {
-                       return new_rd_Proj(dbgi, block, new_pred, mode, pn_arm_fpaFrd_res);
+                       return new_rd_Proj(dbgi, new_pred, mode, pn_arm_fpaFrd_res);
                }
                break;
        default:
@@ -1325,21 +1313,20 @@ static ir_node *gen_Proj_Quot(ir_node *node)
  */
 static ir_node *gen_Proj_be_AddSP(ir_node *node)
 {
-       ir_node  *block    = be_transform_node(get_nodes_block(node));
        ir_node  *pred     = get_Proj_pred(node);
        ir_node  *new_pred = be_transform_node(pred);
        dbg_info *dbgi     = get_irn_dbg_info(node);
        long     proj      = get_Proj_proj(node);
 
        if (proj == pn_be_AddSP_sp) {
-               ir_node *res = new_rd_Proj(dbgi, block, new_pred, mode_Iu,
+               ir_node *res = new_rd_Proj(dbgi, new_pred, mode_Iu,
                                           pn_arm_SubSPandCopy_stack);
                arch_set_irn_register(res, &arm_gp_regs[REG_SP]);
                return res;
        } else if (proj == pn_be_AddSP_res) {
-               return new_rd_Proj(dbgi, block, new_pred, mode_Iu, pn_arm_SubSPandCopy_addr);
+               return new_rd_Proj(dbgi, new_pred, mode_Iu, pn_arm_SubSPandCopy_addr);
        } else if (proj == pn_be_AddSP_M) {
-               return new_rd_Proj(dbgi, block, new_pred, mode_M, pn_arm_SubSPandCopy_M);
+               return new_rd_Proj(dbgi, new_pred, mode_M, pn_arm_SubSPandCopy_M);
        }
        panic("Unsupported Proj from AddSP");
 }
@@ -1349,19 +1336,18 @@ static ir_node *gen_Proj_be_AddSP(ir_node *node)
  */
 static ir_node *gen_Proj_be_SubSP(ir_node *node)
 {
-       ir_node  *block    = be_transform_node(get_nodes_block(node));
        ir_node  *pred     = get_Proj_pred(node);
        ir_node  *new_pred = be_transform_node(pred);
        dbg_info *dbgi     = get_irn_dbg_info(node);
        long     proj      = get_Proj_proj(node);
 
        if (proj == pn_be_SubSP_sp) {
-               ir_node *res = new_rd_Proj(dbgi, block, new_pred, mode_Iu,
+               ir_node *res = new_rd_Proj(dbgi, new_pred, mode_Iu,
                                           pn_arm_AddSP_stack);
                arch_set_irn_register(res, &arm_gp_regs[REG_SP]);
                return res;
        } else if (proj == pn_be_SubSP_M) {
-               return new_rd_Proj(dbgi,  block, new_pred, mode_M, pn_arm_AddSP_M);
+               return new_rd_Proj(dbgi, new_pred, mode_M, pn_arm_AddSP_M);
        }
        panic("Unsupported Proj from SubSP");
 }
@@ -1432,8 +1418,7 @@ static ir_node *gen_Proj(ir_node *node)
                ir_node *new_pred = be_transform_node(pred);
                ir_mode *mode     = get_irn_mode(node);
                if (mode_needs_gp_reg(mode)) {
-                       ir_node *block    = be_transform_node(get_nodes_block(node));
-                       ir_node *new_proj = new_r_Proj(block, new_pred, mode_Iu,
+                       ir_node *new_proj = new_r_Proj(new_pred, mode_Iu,
                                                       get_Proj_proj(node));
                        new_proj->node_nr = node->node_nr;
                        return new_proj;
@@ -1507,7 +1492,7 @@ static ir_node *gen_Phi(ir_node *node)
         * and fix this later */
        phi = new_ir_node(dbgi, irg, block, op_Phi, mode, get_irn_arity(node),
                          get_irn_in(node) + 1);
-       copy_node_attr(node, phi);
+       copy_node_attr(irg, node, phi);
        be_duplicate_deps(node, phi);
 
        arch_set_out_register_req(phi, 0, req);
@@ -1522,7 +1507,7 @@ static ir_node *gen_Phi(ir_node *node)
  */
 static ir_node *bad_transform(ir_node *irn)
 {
-       panic("ARM backend: Not implemented: %+F", irn);
+       panic("ARM backend: unexpected node %+F", irn);
 }
 
 /**
@@ -1592,17 +1577,6 @@ static void arm_register_transformers(void)
        set_transformer(op_Tuple,     bad_transform);
 }
 
-/**
- * Pre-transform all unknown nodes.
- */
-static void arm_pretransform_node(void)
-{
-       arm_code_gen_t *cg = env_cg;
-
-       cg->unknown_gp  = be_pre_transform_node(cg->unknown_gp);
-       cg->unknown_fpa = be_pre_transform_node(cg->unknown_fpa);
-}
-
 /**
  * Initialize fpa Immediate support.
  */
@@ -1650,7 +1624,7 @@ void arm_transform_graph(arm_code_gen_t *cg)
        }
        arm_register_transformers();
        env_cg = cg;
-       be_transform_graph(cg->birg, arm_pretransform_node);
+       be_transform_graph(cg->irg, NULL);
 }
 
 void arm_init_transform(void)