- return 0;
- } /* switch */
-} /* always_lower */
-
-/**
- * lower boolean Proj(Cmp)
- */
-static ir_node *lower_boolean_Proj_Cmp(ir_node *proj, ir_node *cmp, lower_env_t *env) {
- int lidx, ridx;
- ir_node *l, *r, *low, *high, *t, *res;
- pn_Cmp pnc;
- ir_node *blk;
- ir_graph *irg = current_ir_graph;
- dbg_info *db;
-
- l = get_Cmp_left(cmp);
- lidx = get_irn_idx(l);
- if (! env->entries[lidx]->low_word) {
- /* still not ready */
- return NULL;
- } /* if */
-
- r = get_Cmp_right(cmp);
- ridx = get_irn_idx(r);
- if (! env->entries[ridx]->low_word) {
- /* still not ready */
- return NULL;
- } /* if */
-
- pnc = get_Proj_proj(proj);
- blk = get_nodes_block(cmp);
- db = get_irn_dbg_info(cmp);
- low = new_rd_Cmp(db, irg, blk, env->entries[lidx]->low_word, env->entries[ridx]->low_word);
- high = new_rd_Cmp(db, irg, blk, env->entries[lidx]->high_word, env->entries[ridx]->high_word);
-
- if (pnc == pn_Cmp_Eq) {
- /* simple case:a == b <==> a_h == b_h && a_l == b_l */
- res = new_rd_And(db, irg, blk,
- new_r_Proj(irg, blk, low, mode_b, pnc),
- new_r_Proj(irg, blk, high, mode_b, pnc),
- mode_b);
- } else if (pnc == pn_Cmp_Lg) {
- /* simple case:a != b <==> a_h != b_h || a_l != b_l */
- res = new_rd_Or(db, irg, blk,
- new_r_Proj(irg, blk, low, mode_b, pnc),
- new_r_Proj(irg, blk, high, mode_b, pnc),
- mode_b);
- } else {
- /* a rel b <==> a_h REL b_h || (a_h == b_h && a_l rel b_l) */
- t = new_rd_And(db, irg, blk,
- new_r_Proj(irg, blk, low, mode_b, pnc),
- new_r_Proj(irg, blk, high, mode_b, pn_Cmp_Eq),
- mode_b);
- res = new_rd_Or(db, irg, blk,
- new_r_Proj(irg, blk, high, mode_b, pnc & ~pn_Cmp_Eq),
- t,
- mode_b);
- } /* if */
- return res;
-} /* lower_boolean_Proj_Cmp */
-
-/**
- * The type of a lower function.
- *
- * @param node the node to be lowered
- * @param mode the low mode for the destination node
- * @param env the lower environment
- */
-typedef void (*lower_func)(ir_node *node, ir_mode *mode, lower_env_t *env);
-
-/**
- * Lower a node.
- */
-static void lower_ops(ir_node *node, void *env)
-{
- lower_env_t *lenv = env;
- node_entry_t *entry;
- int idx = get_irn_idx(node);
- ir_mode *mode = get_irn_mode(node);
-
- if (mode == mode_b || is_Mux(node) || is_Conv(node)) {
- int i;
-
- for (i = get_irn_arity(node) - 1; i >= 0; --i) {
- ir_node *proj = get_irn_n(node, i);
-
- if (is_Proj(proj)) {
- ir_node *cmp = get_Proj_pred(proj);
-
- if (is_Cmp(cmp)) {
- ir_node *arg = get_Cmp_left(cmp);
-
- mode = get_irn_mode(arg);
- if (mode == lenv->params->high_signed ||
- mode == lenv->params->high_unsigned) {
- ir_node *res = lower_boolean_Proj_Cmp(proj, cmp, lenv);
-
- if (res == NULL) {
- /* could not lower because predecessors not ready */
- waitq_put(lenv->waitq, node);
- return;
- } /* if */
- set_irn_n(node, i, res);
- } /* if */
- } /* if */
- } /* if */
- } /* for */
- } /* if */
-
- entry = idx < lenv->n_entries ? lenv->entries[idx] : NULL;
- if (entry || always_lower(get_irn_opcode(node))) {
- ir_op *op = get_irn_op(node);
- lower_func func = (lower_func)op->ops.generic;
-
- if (func) {
- mode = get_irn_op_mode(node);
-
- if (mode == lenv->params->high_signed)
- mode = lenv->params->low_signed;
- else
- mode = lenv->params->low_unsigned;
-
- DB((dbg, LEVEL_1, " %+F\n", node));
- func(node, mode, lenv);
- } /* if */
- } /* if */
-} /* lower_ops */
-
-#define IDENT(s) new_id_from_chars(s, sizeof(s)-1)