static ir_node *gen_Phi(ir_node *node)
{
+ ir_mode *mode = get_irn_mode(node);
const arch_register_req_t *req;
- ir_node *block = get_nodes_block(node);
- ir_node *new_block = be_transform_node(block);
- dbg_info *dbgi = get_irn_dbg_info(node);
- ir_mode *mode = get_irn_mode(node);
- ir_graph *irg = get_irn_irg(node);
- ir_node *phi;
-
if (mode_needs_gp_reg(mode)) {
mode = mode_Iu;
req = TEMPLATE_reg_classes[CLASS_TEMPLATE_gp].class_req;
req = arch_no_register_req;
}
- phi = new_ir_node(dbgi, irg, new_block, op_Phi, mode, get_irn_arity(node),
- get_irn_in(node)+1);
- copy_node_attr(irg, node, phi);
- be_duplicate_deps(node, phi);
-
- arch_set_irn_register_req_out(phi, 0, req);
- be_enqueue_preds(node);
- return phi;
+ return be_transform_phi(node, req);
}
static ir_node *gen_Proj_Start(ir_node *node)
}
#endif
-/**
- * Change some phi modes
- */
static ir_node *gen_Phi(ir_node *node)
{
+ ir_mode *mode = get_irn_mode(node);
const arch_register_req_t *req;
- ir_node *block = be_transform_node(get_nodes_block(node));
- ir_graph *irg = current_ir_graph;
- dbg_info *dbgi = get_irn_dbg_info(node);
- ir_mode *mode = get_irn_mode(node);
- ir_node *phi;
-
if (mode_needs_gp_reg(mode)) {
/* all integer operations are on 64bit registers now */
mode = mode_Lu;
req = arch_no_register_req;
}
- /* phi nodes allow loops, so we use the old arguments for now
- * 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(irg, node, phi);
- be_duplicate_deps(node, phi);
-
- arch_set_irn_register_req_out(phi, 0, req);
-
- be_enqueue_preds(node);
-
- return phi;
+ return be_transform_phi(node, req);
}
-
-
/**
* Transforms a Conv node.
*
return new_bd_arm_FrameAddr(dbgi, new_block, new_ptr, entity, 0);
}
-/**
- * Change some phi modes
- */
static ir_node *gen_Phi(ir_node *node)
{
+ ir_mode *mode = get_irn_mode(node);
const arch_register_req_t *req;
- ir_node *block = be_transform_node(get_nodes_block(node));
- ir_graph *irg = current_ir_graph;
- dbg_info *dbgi = get_irn_dbg_info(node);
- ir_mode *mode = get_irn_mode(node);
- ir_node *phi;
-
if (mode_needs_gp_reg(mode)) {
/* we shouldn't have any 64bit stuff around anymore */
assert(get_mode_size_bits(mode) <= 32);
req = arch_no_register_req;
}
- /* phi nodes allow loops, so we use the old arguments for now
- * 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(irg, node, phi);
- be_duplicate_deps(node, phi);
-
- arch_set_irn_register_req_out(phi, 0, req);
-
- be_enqueue_preds(node);
-
- return phi;
+ return be_transform_phi(node, req);
}
-
/**
* Enters all transform functions into the generic pointer
*/
}
}
+ir_node *be_transform_phi(ir_node *node, const arch_register_req_t *req)
+{
+ ir_node *block = be_transform_node(get_nodes_block(node));
+ ir_graph *irg = current_ir_graph;
+ dbg_info *dbgi = get_irn_dbg_info(node);
+
+ /* phi nodes allow loops, so we use the old arguments for now
+ * and fix this later */
+ ir_node **ins = get_irn_in(node)+1;
+ int arity = get_irn_arity(node);
+ ir_mode *mode = req->cls != NULL ? req->cls->mode : get_irn_mode(node);
+ ir_node *phi = new_ir_node(dbgi, irg, block, op_Phi, mode, arity, ins);
+ copy_node_attr(irg, node, phi);
+ be_duplicate_deps(node, phi);
+
+ backend_info_t *info = be_get_info(phi);
+ struct obstack *obst = be_get_be_obst(irg);
+ info->in_reqs = OALLOCN(obst, const arch_register_req_t*, arity);
+ for (int i = 0; i < arity; ++i) {
+ info->in_reqs[i] = req;
+ }
+
+ arch_set_irn_register_req_out(phi, 0, req);
+ be_enqueue_preds(node);
+
+ return phi;
+}
+
void be_set_transform_function(ir_op *op, be_transform_func func)
{
/* shouldn't be assigned twice (except for exchanging the default
*/
ir_node *be_transform_node(ir_node *node);
+/**
+ * Creates a new phi (needs some special handling since we can't transform
+ * all predecessors yet).
+ */
+ir_node *be_transform_phi(ir_node *node, const arch_register_req_t *req);
+
/**
* Duplicate all dependency edges of a node.
*/
return new_node;
}
-/**
- * Change some phi modes
- */
static ir_node *gen_Phi(ir_node *node)
{
+ ir_mode *mode = get_irn_mode(node);
const arch_register_req_t *req;
- ir_node *block = be_transform_node(get_nodes_block(node));
- ir_graph *irg = current_ir_graph;
- dbg_info *dbgi = get_irn_dbg_info(node);
- ir_mode *mode = get_irn_mode(node);
- ir_node *phi;
-
if (ia32_mode_needs_gp_reg(mode)) {
/* we shouldn't have any 64bit stuff around anymore */
assert(get_mode_size_bits(mode) <= 32);
req = arch_no_register_req;
}
- /* phi nodes allow loops, so we use the old arguments for now
- * 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(irg, node, phi);
- be_duplicate_deps(node, phi);
-
- arch_set_irn_register_req_out(phi, 0, req);
-
- be_enqueue_preds(node);
-
- return phi;
+ return be_transform_phi(node, req);
}
static ir_node *gen_Jmp(ir_node *node)
}
}
-/**
- * Transform some Phi nodes
- */
static ir_node *gen_Phi(ir_node *node)
{
+ ir_mode *mode = get_irn_mode(node);
const arch_register_req_t *req;
- ir_node *block = be_transform_node(get_nodes_block(node));
- ir_graph *irg = current_ir_graph;
- dbg_info *dbgi = get_irn_dbg_info(node);
- ir_mode *mode = get_irn_mode(node);
- ir_node *phi;
-
if (mode_needs_gp_reg(mode)) {
/* we shouldn't have any 64bit stuff around anymore */
assert(get_mode_size_bits(mode) <= 32);
req = arch_no_register_req;
}
- /* phi nodes allow loops, so we use the old arguments for now
- * 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(irg, node, phi);
- be_duplicate_deps(node, phi);
- arch_set_irn_register_req_out(phi, 0, req);
- be_enqueue_preds(node);
- return phi;
+ return be_transform_phi(node, req);
}
/**