> -       tree lhs = gimple_assign_lhs (g);
>         enum machine_mode mode = TYPE_MODE (TREE_TYPE (lhs));
>         rtx target = gen_reg_rtx (mode);
> +
> +       start_sequence ();
>         tmp = emit_cstore (target, icode, NE, cc_mode, cc_mode,
>                            0, tmp, const0_rtx, 1, mode);
>         if (tmp)
> -         return tmp;
> +         {
> +           rtx seq = get_insns ();
> +           end_sequence ();
> +           emit_insn (prep_seq);
> +           emit_insn (gen_seq);
> +           emit_insn (seq);
> +           return tmp;
> +         }
> +       end_sequence ();
Given that you're already doing delete_insns_since (last)
at the end of this function, I don't think you need a new
sequence around the emit_cstore.  Just

        emit_insn (prep_seq);
        emit_insn (gen_seq);
        tmp = emit_cstore (...);
        if (tmp)
          return tmp;

> +  int unsignedp = code == LTU || code == LEU || code == GTU || code == GEU;

You don't need to examine the code, you can look at the argument:

  TYPE_UNSIGNED (TREE_TYPE (treeop0))



> +  op0 = prepare_operand (icode, op0, 2, op_mode, cmp_mode, unsignedp);
> +  op1 = prepare_operand (icode, op1, 3, op_mode, cmp_mode, unsignedp);
> +  if (!op0 || !op1)
> +    {
> +      end_sequence ();
> +      return NULL_RTX;
> +    }
> +  *prep_seq = get_insns ();
> +  end_sequence ();
> +
> +  cmp = gen_rtx_fmt_ee ((enum rtx_code) code, cmp_mode, op0, op1);
> +  target = gen_rtx_REG (CCmode, CC_REGNUM);
> +
> +  create_output_operand (&ops[0], target, CCmode);
> +  create_fixed_operand (&ops[1], cmp);
> +  create_fixed_operand (&ops[2], op0);
> +  create_fixed_operand (&ops[3], op1);

Hmm.  With so many fixed operands, I think you may be better off not
creating the cmp<mode> expander in the first place.  Just inline the
SELECT_CC_MODE and everything right here.


r~

Reply via email to