- if(op == op_Conv) {
- 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_mode *mode = get_irn_mode(node);
- tarval *tv_zeroc = get_tarval_null(mode);
- ir_node *zero_cmp = new_d_Const(dbgi, mode, tv_zeroc);
-
- ir_node *cmp = new_rd_Cmp(dbgi, irg, block, node, zero_cmp);
- ir_node *proj = new_rd_Proj(dbgi, irg, block, cmp, mode_b,
- pn_Cmp_Lg);
- ir_node *vals[2] = { one, zero };
- ir_node *psi = new_rd_Psi(dbgi, irg, block, 1, &proj, vals,
- lowered_mode);
-
- return psi;
- }
- if(op == op_Proj) {
- ir_node *pred = get_Proj_pred(node);
-
- assert(!is_Load(pred));
- if(is_Cmp(pred)) {
- ir_mode *mode = get_irn_mode(pred);
- ir_node *left = get_Cmp_left(pred);
- ir_node *right = get_Cmp_right(pred);
-
- if(get_mode_size_bits(mode) < get_mode_size_bits(lowered_mode)
- || is_Const_0(right)) {
- int pnc = get_Proj_proj(node);
- ir_node *res = NULL;
- int need_not = 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) ^ 1 */
- a = right;
- b = left;
- need_not = 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) ^ 1 */
- a = left;
- b = right;
- need_not = 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);
- res = new_rd_Shr(dbgi, irg, block, res, shift_cnt,
- lowered_mode);
-
- if(need_not) {
- res = create_not(dbgi, 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);
-
- return psi;
- }
- }