- if(op == op_Proj) {
- ir_node *pred = get_Proj_pred(node);
-
- if(is_Cmp(pred)) {
- ir_node *left = get_Cmp_left(pred);
- ir_node *right = get_Cmp_right(pred);
- ir_mode *mode = get_irn_mode(left);
-
- if ((mode_is_int(mode) || mode_is_reference(mode)) && (
- get_mode_size_bits(mode) < get_mode_size_bits(lowered_mode) ||
- (is_Const(right) && is_Const_null(right))
- )) {
- int pnc = get_Proj_proj(node);
- int need_neg = 0;
- ir_node *a = NULL;
- ir_node *b = NULL;
-
- if(pnc == pn_Cmp_Lt) {
- /* a < b -> (a - b) >> 31 */
- a = left;
- b = right;
- } else if(pnc == pn_Cmp_Le) {
- /* a <= b -> ~(a - b) >> 31 */
- a = right;
- b = left;
- need_neg = 1;
- } else if(pnc == pn_Cmp_Gt) {
- /* a > b -> (b - a) >> 31 */
- a = right;
- b = left;
- } else if(pnc == pn_Cmp_Ge) {
- /* a >= b -> ~(a - b) >> 31 */
- a = left;
- b = right;
- need_neg = 1;
- }
-
- if(a != NULL) {
- tarval *tv = new_tarval_from_long(31, mode_Iu);
- ir_node *shift_cnt = new_d_Const(dbgi, mode_Iu, tv);
-
- if(mode != lowered_mode) {
- a = new_rd_Conv(dbgi, irg, block, a, lowered_mode);
- b = new_rd_Conv(dbgi, irg, block, b, lowered_mode);
- }
-
- res = new_rd_Sub(dbgi, irg, block, a, b, lowered_mode);
- if(need_neg) {
- res = new_rd_Not(dbgi, irg, block, res, lowered_mode);
- }
- res = new_rd_Shr(dbgi, irg, block, res, shift_cnt,
- lowered_mode);
-
- set_irn_link(node, res);
- return res;
- }
- }
-
- {
- /* synthesize the 0/1 value */
- tarval *tv_one = get_tarval_one(lowered_mode);
- ir_node *one = new_d_Const(dbgi, lowered_mode, tv_one);
- tarval *tv_zero = get_tarval_null(lowered_mode);
- ir_node *zero = new_d_Const(dbgi, lowered_mode, tv_zero);
-
- ir_node *vals[2] = { one, zero };
- ir_node *psi = new_rd_Psi(dbgi, irg, block, 1, &node, vals,
- lowered_mode);
-
- set_irn_link(node, psi);
- return psi;
- }
- } else if(is_Proj(pred) && is_Call(get_Proj_pred(pred))) {
- ir_type *type = get_Call_type(get_Proj_pred(pred));
- adjust_method_type(type);
- set_irn_mode(node, lowered_mode);
- return node;
- } else if(is_Proj(pred) && is_Start(get_Proj_pred(pred))) {
- ir_entity *entity = get_irg_entity(irg);
- ir_type *type = get_entity_type(entity);
- adjust_method_type(type);
- set_irn_mode(node, lowered_mode);
- return node;
- }