On Mon, Jul 11, 2011 at 12:38 PM, Richard Sandiford
<richard.sandif...@linaro.org> wrote:
> When I added the new optabs insn-expansion routines, I looked for code
> that checked the predicates before calling GEN_FCN.  This patch also
> uses the routines in two cases where we don't currently check the
> predicates.  The benefits are:
>
> 1) We assert that the predicates really do match.
>
> 2) We support targets (like ARM) that only support restricted addressing
>   modes.  See the allows_mem stuff in maybe_legitimize_operand_same_code.
>
> Tested on x86_64-linux-gnu and (with an ARM patch to take advantage of it)
> on arm-linux-gnueabi.  OK to install?

Ok.

Thanks,
Richard.

> Richard
>
>
> gcc/
>        * expr.c (expand_expr_real_1): Use expand_insn for movmisalign.
>
> Index: gcc/expr.c
> ===================================================================
> --- gcc/expr.c  2011-07-11 11:29:58.000000000 +0100
> +++ gcc/expr.c  2011-07-11 11:31:45.000000000 +0100
> @@ -8692,7 +8692,8 @@ expand_expr_real_1 (tree exp, rtx target
>       {
>        addr_space_t as = TYPE_ADDR_SPACE (TREE_TYPE (exp));
>        struct mem_address addr;
> -       int icode, align;
> +       enum insn_code icode;
> +       int align;
>
>        get_address_description (exp, &addr);
>        op0 = addr_for_mem_ref (&addr, as, true);
> @@ -8709,18 +8710,15 @@ expand_expr_real_1 (tree exp, rtx target
>            && ((icode = optab_handler (movmisalign_optab, mode))
>                != CODE_FOR_nothing))
>          {
> -           rtx reg, insn;
> +           struct expand_operand ops[2];
>
>            /* We've already validated the memory, and we're creating a
> -              new pseudo destination.  The predicates really can't fail.  */
> -           reg = gen_reg_rtx (mode);
> -
> -           /* Nor can the insn generator.  */
> -           insn = GEN_FCN (icode) (reg, temp);
> -           gcc_assert (insn != NULL_RTX);
> -           emit_insn (insn);
> -
> -           return reg;
> +              new pseudo destination.  The predicates really can't fail,
> +              nor can the generator.  */
> +           create_output_operand (&ops[0], NULL_RTX, mode);
> +           create_fixed_operand (&ops[1], temp);
> +           expand_insn (icode, 2, ops);
> +           return ops[0].value;
>          }
>        return temp;
>       }
> @@ -8732,7 +8730,8 @@ expand_expr_real_1 (tree exp, rtx target
>        enum machine_mode address_mode;
>        tree base = TREE_OPERAND (exp, 0);
>        gimple def_stmt;
> -       int icode, align;
> +       enum insn_code icode;
> +       int align;
>        /* Handle expansion of non-aliased memory with non-BLKmode.  That
>           might end up in a register.  */
>        if (TREE_CODE (base) == ADDR_EXPR)
> @@ -8806,17 +8805,15 @@ expand_expr_real_1 (tree exp, rtx target
>            && ((icode = optab_handler (movmisalign_optab, mode))
>                != CODE_FOR_nothing))
>          {
> -           rtx reg, insn;
> +           struct expand_operand ops[2];
>
>            /* We've already validated the memory, and we're creating a
> -              new pseudo destination.  The predicates really can't fail.  */
> -           reg = gen_reg_rtx (mode);
> -
> -           /* Nor can the insn generator.  */
> -           insn = GEN_FCN (icode) (reg, temp);
> -           emit_insn (insn);
> -
> -           return reg;
> +              new pseudo destination.  The predicates really can't fail,
> +              nor can the generator.  */
> +           create_output_operand (&ops[0], NULL_RTX, mode);
> +           create_fixed_operand (&ops[1], temp);
> +           expand_insn (icode, 2, ops);
> +           return ops[0].value;
>          }
>        return temp;
>       }
>

Reply via email to