+ return new_op;
+}
+
+/**
+ * Transform a be_SubSP into an arm_SubSP. Eat up const sizes.
+ */
+static ir_node *gen_be_SubSP(ir_node *node) {
+ ir_node *block = be_transform_node(get_nodes_block(node));
+ ir_node *sz = get_irn_n(node, be_pos_SubSP_size);
+ ir_node *new_sz = be_transform_node(sz);
+ ir_node *sp = get_irn_n(node, be_pos_SubSP_old_sp);
+ ir_node *new_sp = be_transform_node(sp);
+ ir_graph *irg = current_ir_graph;
+ dbg_info *dbgi = get_irn_dbg_info(node);
+ ir_node *nomem = new_NoMem();
+ ir_node *new_op;
+
+ /* ARM stack grows in reverse direction, make an AddSP */
+ new_op = new_rd_arm_AddSP(dbgi, irg, block, new_sp, new_sz, nomem);
+
+ return new_op;
+}
+
+/**
+ * Transform a be_Copy.
+ */
+static ir_node *gen_be_Copy(ir_node *node) {
+ ir_node *result = be_duplicate_node(node);
+ ir_mode *mode = get_irn_mode(result);
+
+ if (mode_needs_gp_reg(mode)) {
+ set_irn_mode(node, mode_Iu);
+ }
+
+ return result;
+}
+
+/**
+ * Transform a Proj from a Load.
+ */
+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);
+ ir_graph *irg = current_ir_graph;
+ dbg_info *dbgi = get_irn_dbg_info(node);
+ long proj = get_Proj_proj(node);
+
+ /* renumber the proj */
+ switch (get_arm_irn_opcode(new_load)) {
+ case iro_arm_Load:
+ case iro_arm_Loadb:
+ case iro_arm_Loadbs:
+ case iro_arm_Loadh:
+ case iro_arm_Loadhs:
+ /* handle all gp loads equal: they have the same proj numbers. */
+ if (proj == pn_Load_res) {
+ return new_rd_Proj(dbgi, irg, block, new_load, mode_Iu, pn_arm_Load_res);
+ } else if (proj == pn_Load_M) {
+ return new_rd_Proj(dbgi, irg, block, new_load, mode_M, pn_arm_Load_M);
+ }
+ break;
+ case iro_arm_fpaLdf:
+ if (proj == pn_Load_res) {
+ ir_mode *mode = get_Load_mode(load);
+ return new_rd_Proj(dbgi, irg, block, new_load, mode, pn_arm_fpaLdf_res);
+ } else if (proj == pn_Load_M) {
+ return new_rd_Proj(dbgi, irg, block, new_load, mode_M, pn_arm_fpaLdf_M);
+ }
+ break;
+ default:
+ break;
+ }
+ assert(0);
+ return new_rd_Unknown(irg, get_irn_mode(node));
+}
+
+/**
+ * Transform and renumber the Projs from a CopyB.
+ */
+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);
+ ir_graph *irg = current_ir_graph;
+ dbg_info *dbgi = get_irn_dbg_info(node);
+ ir_mode *mode = get_irn_mode(node);
+ long proj = get_Proj_proj(node);
+
+ switch(proj) {
+ case pn_CopyB_M_regular:
+ if (is_arm_CopyB(new_pred)) {
+ return new_rd_Proj(dbgi, irg, block, new_pred, mode_M, pn_arm_CopyB_M);