On Mon, Sep 9, 2013 at 12:24 PM, Richard Sandiford
<rdsandif...@googlemail.com> wrote:
> Similar to patch 1, but here the calls are all to expand_* routines.
>
> Tested in the same way as before.  OK to install?

Ok.

Thanks,
Richard.

> Thanks,
> Richard
>
>
> gcc/
>         * asan.c (asan_clear_shadow): Use gen_int_mode with the mode
>         of the associated expand_* call.
>         (asan_emit_stack_protection): Likewise.
>         * builtins.c (round_trampoline_addr): Likewise.
>         * explow.c (allocate_dynamic_stack_space, probe_stack_range): 
> Likewise.
>         * expmed.c (expand_smod_pow2, expand_sdiv_pow2, expand_divmod)
>         (emit_store_flag): Likewise.
>         * expr.c (emit_move_resolve_push, push_block, emit_single_push_insn_1)
>         (emit_push_insn, optimize_bitfield_assignment_op, expand_expr_real_1):
>         Likewise.
>         * function.c (instantiate_virtual_regs_in_insn): Likewise.
>         * ifcvt.c (noce_try_store_flag_constants): Likewise.
>         * loop-unroll.c (unroll_loop_runtime_iterations): Likewise.
>         * modulo-sched.c (generate_prolog_epilog): Likewise.
>         * optabs.c (expand_binop, widen_leading, expand_doubleword_clz)
>         (expand_ctz, expand_ffs, expand_unop): Likewise.
>
> Index: gcc/asan.c
> ===================================================================
> --- gcc/asan.c  2013-09-09 10:23:49.095277703 +0100
> +++ gcc/asan.c  2013-09-09 10:55:59.743537289 +0100
> @@ -897,15 +897,15 @@ asan_clear_shadow (rtx shadow_mem, HOST_
>    top_label = gen_label_rtx ();
>    addr = force_reg (Pmode, XEXP (shadow_mem, 0));
>    shadow_mem = adjust_automodify_address (shadow_mem, SImode, addr, 0);
>    end = force_reg (Pmode, plus_constant (Pmode, addr, len));
>    emit_label (top_label);
>
>    emit_move_insn (shadow_mem, const0_rtx);
> -  tmp = expand_simple_binop (Pmode, PLUS, addr, GEN_INT (4), addr,
> +  tmp = expand_simple_binop (Pmode, PLUS, addr, gen_int_mode (4, Pmode), 
> addr,
>                               true, OPTAB_LIB_WIDEN);
>    if (tmp != addr)
>      emit_move_insn (addr, tmp);
>    emit_cmp_and_jump_insns (addr, end, LT, NULL_RTX, Pmode, true, top_label);
>    jump = get_last_insn ();
>    gcc_assert (JUMP_P (jump));
>    add_reg_note (jump, REG_BR_PROB, GEN_INT (REG_BR_PROB_BASE * 80 / 100));
> @@ -962,25 +962,27 @@ asan_emit_stack_protection (rtx base, HO
>        else
>         pp_string (&asan_pp, "9 <unknown>");
>        pp_space (&asan_pp);
>      }
>    str_cst = asan_pp_string (&asan_pp);
>
>    /* Emit the prologue sequence.  */
> -  base = expand_binop (Pmode, add_optab, base, GEN_INT (base_offset),
> +  base = expand_binop (Pmode, add_optab, base,
> +                      gen_int_mode (base_offset, Pmode),
>                        NULL_RTX, 1, OPTAB_DIRECT);
>    mem = gen_rtx_MEM (ptr_mode, base);
>    emit_move_insn (mem, GEN_INT (ASAN_STACK_FRAME_MAGIC));
>    mem = adjust_address (mem, VOIDmode, GET_MODE_SIZE (ptr_mode));
>    emit_move_insn (mem, expand_normal (str_cst));
>    shadow_base = expand_binop (Pmode, lshr_optab, base,
>                               GEN_INT (ASAN_SHADOW_SHIFT),
>                               NULL_RTX, 1, OPTAB_DIRECT);
>    shadow_base = expand_binop (Pmode, add_optab, shadow_base,
> -                             GEN_INT (targetm.asan_shadow_offset ()),
> +                             gen_int_mode (targetm.asan_shadow_offset (),
> +                                           Pmode),
>                               NULL_RTX, 1, OPTAB_DIRECT);
>    gcc_assert (asan_shadow_set != -1
>               && (ASAN_RED_ZONE_SIZE >> ASAN_SHADOW_SHIFT) == 4);
>    shadow_mem = gen_rtx_MEM (SImode, shadow_base);
>    set_mem_alias_set (shadow_mem, asan_shadow_set);
>    prev_offset = base_offset;
>    for (l = length; l; l -= 2)
> Index: gcc/builtins.c
> ===================================================================
> --- gcc/builtins.c      2013-09-08 17:18:39.707590244 +0100
> +++ gcc/builtins.c      2013-09-09 10:55:59.747537322 +0100
> @@ -4858,16 +4858,16 @@ round_trampoline_addr (rtx tramp)
>    /* If we don't need too much alignment, we'll have been guaranteed
>       proper alignment by get_trampoline_type.  */
>    if (TRAMPOLINE_ALIGNMENT <= STACK_BOUNDARY)
>      return tramp;
>
>    /* Round address up to desired boundary.  */
>    temp = gen_reg_rtx (Pmode);
> -  addend = GEN_INT (TRAMPOLINE_ALIGNMENT / BITS_PER_UNIT - 1);
> -  mask = GEN_INT (-TRAMPOLINE_ALIGNMENT / BITS_PER_UNIT);
> +  addend = gen_int_mode (TRAMPOLINE_ALIGNMENT / BITS_PER_UNIT - 1, Pmode);
> +  mask = gen_int_mode (-TRAMPOLINE_ALIGNMENT / BITS_PER_UNIT, Pmode);
>
>    temp  = expand_simple_binop (Pmode, PLUS, tramp, addend,
>                                temp, 0, OPTAB_LIB_WIDEN);
>    tramp = expand_simple_binop (Pmode, AND, temp, mask,
>                                temp, 0, OPTAB_LIB_WIDEN);
>
>    return tramp;
> Index: gcc/explow.c
> ===================================================================
> --- gcc/explow.c        2013-09-09 10:49:45.226460819 +0100
> +++ gcc/explow.c        2013-09-09 10:55:59.748537330 +0100
> @@ -1351,15 +1351,16 @@ allocate_dynamic_stack_space (rtx size,
>          by malloc does not meet REQUIRED_ALIGN, we increase SIZE to
>          make sure we allocate enough space.  */
>        if (MALLOC_ABI_ALIGNMENT >= required_align)
>         ask = size;
>        else
>         {
>           ask = expand_binop (Pmode, add_optab, size,
> -                             GEN_INT (required_align / BITS_PER_UNIT - 1),
> +                             gen_int_mode (required_align / BITS_PER_UNIT - 
> 1,
> +                                           Pmode),
>                               NULL_RTX, 1, OPTAB_LIB_WIDEN);
>           must_align = true;
>         }
>
>        func = init_one_libfunc ("__morestack_allocate_stack_space");
>
>        space = emit_library_call_value (func, target, LCT_NORMAL, Pmode,
> @@ -1477,21 +1478,24 @@ allocate_dynamic_stack_space (rtx size,
>
>    if (must_align)
>      {
>        /* CEIL_DIV_EXPR needs to worry about the addition overflowing,
>          but we know it can't.  So add ourselves and then do
>          TRUNC_DIV_EXPR.  */
>        target = expand_binop (Pmode, add_optab, target,
> -                            GEN_INT (required_align / BITS_PER_UNIT - 1),
> +                            gen_int_mode (required_align / BITS_PER_UNIT - 1,
> +                                          Pmode),
>                              NULL_RTX, 1, OPTAB_LIB_WIDEN);
>        target = expand_divmod (0, TRUNC_DIV_EXPR, Pmode, target,
> -                             GEN_INT (required_align / BITS_PER_UNIT),
> +                             gen_int_mode (required_align / BITS_PER_UNIT,
> +                                           Pmode),
>                               NULL_RTX, 1);
>        target = expand_mult (Pmode, target,
> -                           GEN_INT (required_align / BITS_PER_UNIT),
> +                           gen_int_mode (required_align / BITS_PER_UNIT,
> +                                         Pmode),
>                             NULL_RTX, 1);
>      }
>
>    /* Now that we've committed to a return value, mark its alignment.  */
>    mark_reg_pointer (target, required_align);
>
>    /* Record the new stack level for nonlocal gotos.  */
> @@ -1665,15 +1669,15 @@ probe_stack_range (HOST_WIDE_INT first,
>
>        /* Jump to END_LAB if TEST_ADDR == LAST_ADDR.  */
>        emit_cmp_and_jump_insns (test_addr, last_addr, EQ, NULL_RTX, Pmode, 1,
>                                end_lab);
>
>        /* TEST_ADDR = TEST_ADDR + PROBE_INTERVAL.  */
>        temp = expand_binop (Pmode, STACK_GROW_OPTAB, test_addr,
> -                          GEN_INT (PROBE_INTERVAL), test_addr,
> +                          gen_int_mode (PROBE_INTERVAL, Pmode), test_addr,
>                            1, OPTAB_WIDEN);
>
>        gcc_assert (temp == test_addr);
>
>        /* Probe at TEST_ADDR.  */
>        emit_stack_probe (test_addr);
>
> Index: gcc/expmed.c
> ===================================================================
> --- gcc/expmed.c        2013-09-09 10:49:45.228460835 +0100
> +++ gcc/expmed.c        2013-09-09 10:55:59.751537354 +0100
> @@ -3662,30 +3662,32 @@ expand_smod_pow2 (enum machine_mode mode
>               || (set_src_cost (temp, optimize_insn_for_speed_p ())
>                   > COSTS_N_INSNS (2)))
>             {
>               temp = expand_binop (mode, xor_optab, op0, signmask,
>                                    NULL_RTX, 1, OPTAB_LIB_WIDEN);
>               temp = expand_binop (mode, sub_optab, temp, signmask,
>                                    NULL_RTX, 1, OPTAB_LIB_WIDEN);
> -             temp = expand_binop (mode, and_optab, temp, GEN_INT (masklow),
> +             temp = expand_binop (mode, and_optab, temp,
> +                                  gen_int_mode (masklow, mode),
>                                    NULL_RTX, 1, OPTAB_LIB_WIDEN);
>               temp = expand_binop (mode, xor_optab, temp, signmask,
>                                    NULL_RTX, 1, OPTAB_LIB_WIDEN);
>               temp = expand_binop (mode, sub_optab, temp, signmask,
>                                    NULL_RTX, 1, OPTAB_LIB_WIDEN);
>             }
>           else
>             {
>               signmask = expand_binop (mode, lshr_optab, signmask, shift,
>                                        NULL_RTX, 1, OPTAB_LIB_WIDEN);
>               signmask = force_reg (mode, signmask);
>
>               temp = expand_binop (mode, add_optab, op0, signmask,
>                                    NULL_RTX, 1, OPTAB_LIB_WIDEN);
> -             temp = expand_binop (mode, and_optab, temp, GEN_INT (masklow),
> +             temp = expand_binop (mode, and_optab, temp,
> +                                  gen_int_mode (masklow, mode),
>                                    NULL_RTX, 1, OPTAB_LIB_WIDEN);
>               temp = expand_binop (mode, sub_optab, temp, signmask,
>                                    NULL_RTX, 1, OPTAB_LIB_WIDEN);
>             }
>           return temp;
>         }
>      }
> @@ -3760,15 +3762,15 @@ expand_sdiv_pow2 (enum machine_mode mode
>        /* ??? emit_conditional_move forces a stack adjustment via
>          compare_from_rtx so, if the sequence is discarded, it will
>          be lost.  Do it now instead.  */
>        do_pending_stack_adjust ();
>
>        start_sequence ();
>        temp2 = copy_to_mode_reg (mode, op0);
> -      temp = expand_binop (mode, add_optab, temp2, GEN_INT (d-1),
> +      temp = expand_binop (mode, add_optab, temp2, gen_int_mode (d - 1, 
> mode),
>                            NULL_RTX, 0, OPTAB_LIB_WIDEN);
>        temp = force_reg (mode, temp);
>
>        /* Construct "temp2 = (temp2 < 0) ? temp : temp2".  */
>        temp2 = emit_conditional_move (temp2, LT, temp2, const0_rtx,
>                                      mode, temp, temp2, mode, 0);
>        if (temp2)
> @@ -3787,28 +3789,28 @@ expand_sdiv_pow2 (enum machine_mode mode
>      {
>        int ushift = GET_MODE_BITSIZE (mode) - logd;
>
>        temp = gen_reg_rtx (mode);
>        temp = emit_store_flag (temp, LT, op0, const0_rtx, mode, 0, -1);
>        if (shift_cost (optimize_insn_for_speed_p (), mode, ushift)
>           > COSTS_N_INSNS (1))
> -       temp = expand_binop (mode, and_optab, temp, GEN_INT (d - 1),
> +       temp = expand_binop (mode, and_optab, temp, gen_int_mode (d - 1, 
> mode),
>                              NULL_RTX, 0, OPTAB_LIB_WIDEN);
>        else
>         temp = expand_shift (RSHIFT_EXPR, mode, temp,
>                              ushift, NULL_RTX, 1);
>        temp = expand_binop (mode, add_optab, temp, op0, NULL_RTX,
>                            0, OPTAB_LIB_WIDEN);
>        return expand_shift (RSHIFT_EXPR, mode, temp, logd, NULL_RTX, 0);
>      }
>
>    label = gen_label_rtx ();
>    temp = copy_to_mode_reg (mode, op0);
>    do_cmp_and_jump (temp, const0_rtx, GE, mode, label);
> -  expand_inc (temp, GEN_INT (d - 1));
> +  expand_inc (temp, gen_int_mode (d - 1, mode));
>    emit_label (label);
>    return expand_shift (RSHIFT_EXPR, mode, temp, logd, NULL_RTX, 0);
>  }
>
>  /* Emit the code to divide OP0 by OP1, putting the result in TARGET
>     if that is convenient, and returning where the result is.
>     You may request either the quotient or the remainder as the result;
> @@ -4058,17 +4060,19 @@ expand_divmod (int rem_flag, enum tree_c
>                                             & GET_MODE_MASK (compute_mode));
>
>                 if (EXACT_POWER_OF_2_OR_ZERO_P (d))
>                   {
>                     pre_shift = floor_log2 (d);
>                     if (rem_flag)
>                       {
> +                       unsigned HOST_WIDE_INT mask
> +                         = ((unsigned HOST_WIDE_INT) 1 << pre_shift) - 1;
>                         remainder
>                           = expand_binop (compute_mode, and_optab, op0,
> -                                         GEN_INT (((HOST_WIDE_INT) 1 << 
> pre_shift) - 1),
> +                                         gen_int_mode (mask, compute_mode),
>                                           remainder, 1,
>                                           OPTAB_LIB_WIDEN);
>                         if (remainder)
>                           return gen_lowpart (mode, remainder);
>                       }
>                     quotient = expand_shift (RSHIFT_EXPR, compute_mode, op0,
>                                              pre_shift, tquotient, 1);
> @@ -4111,18 +4115,18 @@ expand_divmod (int rem_flag, enum tree_c
>                             if (post_shift - 1 >= BITS_PER_WORD)
>                               goto fail1;
>
>                             extra_cost
>                               = (shift_cost (speed, compute_mode, post_shift 
> - 1)
>                                  + shift_cost (speed, compute_mode, 1)
>                                  + 2 * add_cost (speed, compute_mode));
> -                           t1 = expmed_mult_highpart (compute_mode, op0,
> -                                                      GEN_INT (ml),
> -                                                      NULL_RTX, 1,
> -                                                      max_cost - extra_cost);
> +                           t1 = expmed_mult_highpart
> +                             (compute_mode, op0,
> +                              gen_int_mode (ml, compute_mode),
> +                              NULL_RTX, 1, max_cost - extra_cost);
>                             if (t1 == 0)
>                               goto fail1;
>                             t2 = force_operand (gen_rtx_MINUS (compute_mode,
>                                                                op0, t1),
>                                                 NULL_RTX);
>                             t3 = expand_shift (RSHIFT_EXPR, compute_mode,
>                                                t2, 1, NULL_RTX, 1);
> @@ -4143,18 +4147,18 @@ expand_divmod (int rem_flag, enum tree_c
>
>                             t1 = expand_shift
>                               (RSHIFT_EXPR, compute_mode, op0,
>                                pre_shift, NULL_RTX, 1);
>                             extra_cost
>                               = (shift_cost (speed, compute_mode, pre_shift)
>                                  + shift_cost (speed, compute_mode, 
> post_shift));
> -                           t2 = expmed_mult_highpart (compute_mode, t1,
> -                                                      GEN_INT (ml),
> -                                                      NULL_RTX, 1,
> -                                                      max_cost - extra_cost);
> +                           t2 = expmed_mult_highpart
> +                             (compute_mode, t1,
> +                              gen_int_mode (ml, compute_mode),
> +                              NULL_RTX, 1, max_cost - extra_cost);
>                             if (t2 == 0)
>                               goto fail1;
>                             quotient = expand_shift
>                               (RSHIFT_EXPR, compute_mode, t2,
>                                post_shift, tquotient, 1);
>                           }
>                       }
> @@ -4270,17 +4274,17 @@ expand_divmod (int rem_flag, enum tree_c
>                         if (post_shift >= BITS_PER_WORD
>                             || size - 1 >= BITS_PER_WORD)
>                           goto fail1;
>
>                         extra_cost = (shift_cost (speed, compute_mode, 
> post_shift)
>                                       + shift_cost (speed, compute_mode, size 
> - 1)
>                                       + add_cost (speed, compute_mode));
> -                       t1 = expmed_mult_highpart (compute_mode, op0,
> -                                                  GEN_INT (ml), NULL_RTX, 0,
> -                                                  max_cost - extra_cost);
> +                       t1 = expmed_mult_highpart
> +                         (compute_mode, op0, gen_int_mode (ml, compute_mode),
> +                          NULL_RTX, 0, max_cost - extra_cost);
>                         if (t1 == 0)
>                           goto fail1;
>                         t2 = expand_shift
>                           (RSHIFT_EXPR, compute_mode, t1,
>                            post_shift, NULL_RTX, 0);
>                         t3 = expand_shift
>                           (RSHIFT_EXPR, compute_mode, op0,
> @@ -4364,17 +4368,20 @@ expand_divmod (int rem_flag, enum tree_c
>                 /* We could just as easily deal with negative constants here,
>                    but it does not seem worth the trouble for GCC 2.6.  */
>                 if (EXACT_POWER_OF_2_OR_ZERO_P (d))
>                   {
>                     pre_shift = floor_log2 (d);
>                     if (rem_flag)
>                       {
> -                       remainder = expand_binop (compute_mode, and_optab, 
> op0,
> -                                                 GEN_INT (((HOST_WIDE_INT) 1 
> << pre_shift) - 1),
> -                                                 remainder, 0, 
> OPTAB_LIB_WIDEN);
> +                       unsigned HOST_WIDE_INT mask
> +                         = ((unsigned HOST_WIDE_INT) 1 << pre_shift) - 1;
> +                       remainder = expand_binop
> +                         (compute_mode, and_optab, op0,
> +                          gen_int_mode (mask, compute_mode),
> +                          remainder, 0, OPTAB_LIB_WIDEN);
>                         if (remainder)
>                           return gen_lowpart (mode, remainder);
>                       }
>                     quotient = expand_shift
>                       (RSHIFT_EXPR, compute_mode, op0,
>                        pre_shift, tquotient, 0);
>                   }
> @@ -4393,17 +4400,17 @@ expand_divmod (int rem_flag, enum tree_c
>                           (RSHIFT_EXPR, compute_mode, op0,
>                            size - 1, NULL_RTX, 0);
>                         t2 = expand_binop (compute_mode, xor_optab, op0, t1,
>                                            NULL_RTX, 0, OPTAB_WIDEN);
>                         extra_cost = (shift_cost (speed, compute_mode, 
> post_shift)
>                                       + shift_cost (speed, compute_mode, size 
> - 1)
>                                       + 2 * add_cost (speed, compute_mode));
> -                       t3 = expmed_mult_highpart (compute_mode, t2,
> -                                                  GEN_INT (ml), NULL_RTX, 1,
> -                                                  max_cost - extra_cost);
> +                       t3 = expmed_mult_highpart
> +                         (compute_mode, t2, gen_int_mode (ml, compute_mode),
> +                          NULL_RTX, 1, max_cost - extra_cost);
>                         if (t3 != 0)
>                           {
>                             t4 = expand_shift
>                               (RSHIFT_EXPR, compute_mode, t3,
>                                post_shift, NULL_RTX, 1);
>                             quotient = expand_binop (compute_mode, xor_optab,
>                                                      t4, t1, tquotient, 0,
> @@ -4533,15 +4540,15 @@ expand_divmod (int rem_flag, enum tree_c
>             if (op1_is_constant && EXACT_POWER_OF_2_OR_ZERO_P (INTVAL (op1)))
>               {
>                 rtx t1, t2, t3;
>                 unsigned HOST_WIDE_INT d = INTVAL (op1);
>                 t1 = expand_shift (RSHIFT_EXPR, compute_mode, op0,
>                                    floor_log2 (d), tquotient, 1);
>                 t2 = expand_binop (compute_mode, and_optab, op0,
> -                                  GEN_INT (d - 1),
> +                                  gen_int_mode (d - 1, compute_mode),
>                                    NULL_RTX, 1, OPTAB_LIB_WIDEN);
>                 t3 = gen_reg_rtx (compute_mode);
>                 t3 = emit_store_flag (t3, NE, t2, const0_rtx,
>                                       compute_mode, 1, 1);
>                 if (t3 == 0)
>                   {
>                     rtx lab;
> @@ -4630,15 +4637,15 @@ expand_divmod (int rem_flag, enum tree_c
>                    languages (Ada).  */
>
>                 rtx t1, t2, t3;
>                 unsigned HOST_WIDE_INT d = INTVAL (op1);
>                 t1 = expand_shift (RSHIFT_EXPR, compute_mode, op0,
>                                    floor_log2 (d), tquotient, 0);
>                 t2 = expand_binop (compute_mode, and_optab, op0,
> -                                  GEN_INT (d - 1),
> +                                  gen_int_mode (d - 1, compute_mode),
>                                    NULL_RTX, 1, OPTAB_LIB_WIDEN);
>                 t3 = gen_reg_rtx (compute_mode);
>                 t3 = emit_store_flag (t3, NE, t2, const0_rtx,
>                                       compute_mode, 1, 1);
>                 if (t3 == 0)
>                   {
>                     rtx lab;
> @@ -5473,15 +5480,15 @@ emit_store_flag (rtx target, enum rtx_co
>               && rtx_cost (GEN_INT (normalizep), PLUS, 1,
>                            optimize_insn_for_speed_p ()) == 0)
>             {
>               tem = emit_store_flag_1 (subtarget, rcode, op0, op1, mode, 0,
>                                        STORE_FLAG_VALUE, target_mode);
>               if (tem)
>                  return expand_binop (target_mode, add_optab, tem,
> -                                    GEN_INT (normalizep),
> +                                    gen_int_mode (normalizep, target_mode),
>                                      target, 0, OPTAB_WIDEN);
>             }
>            else if (!want_add
>                    && rtx_cost (trueval, XOR, 1,
>                                 optimize_insn_for_speed_p ()) == 0)
>             {
>               tem = emit_store_flag_1 (subtarget, rcode, op0, op1, mode, 0,
> @@ -5577,15 +5584,16 @@ emit_store_flag (rtx target, enum rtx_co
>           && rtx_cost (GEN_INT (normalizep), PLUS, 1,
>                        optimize_insn_for_speed_p ()) == 0)
>         {
>           tem = emit_store_flag_1 (subtarget, rcode, op0, op1, mode, 0,
>                                    STORE_FLAG_VALUE, target_mode);
>           if (tem != 0)
>              tem = expand_binop (target_mode, add_optab, tem,
> -                               GEN_INT (normalizep), target, 0, OPTAB_WIDEN);
> +                               gen_int_mode (normalizep, target_mode),
> +                               target, 0, OPTAB_WIDEN);
>         }
>        else if (!want_add
>                && rtx_cost (trueval, XOR, 1,
>                             optimize_insn_for_speed_p ()) == 0)
>         {
>           tem = emit_store_flag_1 (subtarget, rcode, op0, op1, mode, 0,
>                                    normalizep, target_mode);
> Index: gcc/expr.c
> ===================================================================
> --- gcc/expr.c  2013-09-09 10:49:45.230460851 +0100
> +++ gcc/expr.c  2013-09-09 10:55:59.754537379 +0100
> @@ -3128,15 +3128,15 @@ emit_move_resolve_push (enum machine_mod
>        gcc_assert (adjust == val || adjust == -val);
>        adjust = val;
>      }
>
>    /* Do not use anti_adjust_stack, since we don't want to update
>       stack_pointer_delta.  */
>    temp = expand_simple_binop (Pmode, PLUS, stack_pointer_rtx,
> -                             GEN_INT (adjust), stack_pointer_rtx,
> +                             gen_int_mode (adjust, Pmode), stack_pointer_rtx,
>                               0, OPTAB_LIB_WIDEN);
>    if (temp != stack_pointer_rtx)
>      emit_move_insn (stack_pointer_rtx, temp);
>
>    switch (code)
>      {
>      case PRE_INC:
> @@ -3639,15 +3639,16 @@ push_block (rtx size, int extra, int bel
>      anti_adjust_stack (plus_constant (Pmode, size, extra));
>    else if (REG_P (size) && extra == 0)
>      anti_adjust_stack (size);
>    else
>      {
>        temp = copy_to_mode_reg (Pmode, size);
>        if (extra != 0)
> -       temp = expand_binop (Pmode, add_optab, temp, GEN_INT (extra),
> +       temp = expand_binop (Pmode, add_optab, temp,
> +                            gen_int_mode (extra, Pmode),
>                              temp, 0, OPTAB_LIB_WIDEN);
>        anti_adjust_stack (temp);
>      }
>
>  #ifndef STACK_GROWS_DOWNWARD
>    if (0)
>  #else
> @@ -3907,15 +3908,15 @@ emit_single_push_insn_1 (enum machine_mo
>                       expand_binop (Pmode,
>  #ifdef STACK_GROWS_DOWNWARD
>                                     sub_optab,
>  #else
>                                     add_optab,
>  #endif
>                                     stack_pointer_rtx,
> -                                   GEN_INT (rounded_size),
> +                                   gen_int_mode (rounded_size, Pmode),
>                                     NULL_RTX, 0, OPTAB_LIB_WIDEN));
>
>        offset = (HOST_WIDE_INT) padding_size;
>  #ifdef STACK_GROWS_DOWNWARD
>        if (STACK_PUSH_CODE == POST_DEC)
>         /* We have already decremented the stack pointer, so get the
>            previous value.  */
> @@ -4123,16 +4124,16 @@ emit_push_insn (rtx x, enum machine_mode
>           /* Deduct words put into registers from the size we must copy.  */
>           if (partial != 0)
>             {
>               if (CONST_INT_P (size))
>                 size = GEN_INT (INTVAL (size) - used);
>               else
>                 size = expand_binop (GET_MODE (size), sub_optab, size,
> -                                    GEN_INT (used), NULL_RTX, 0,
> -                                    OPTAB_LIB_WIDEN);
> +                                    gen_int_mode (used, GET_MODE (size)),
> +                                    NULL_RTX, 0, OPTAB_LIB_WIDEN);
>             }
>
>           /* Get the address of the stack space.
>              In this case, we do not deal with EXTRA separately.
>              A single stack adjust will do.  */
>           if (! args_addr)
>             {
> @@ -4471,15 +4472,16 @@ optimize_bitfield_assignment_op (unsigne
>           set_mem_alias_set (str_rtx, 0);
>           set_mem_expr (str_rtx, 0);
>         }
>
>        binop = code == BIT_IOR_EXPR ? ior_optab : xor_optab;
>        if (bitpos + bitsize != str_bitsize)
>         {
> -         rtx mask = GEN_INT (((unsigned HOST_WIDE_INT) 1 << bitsize) - 1);
> +         rtx mask = gen_int_mode (((unsigned HOST_WIDE_INT) 1 << bitsize) - 
> 1,
> +                                  str_mode);
>           value = expand_and (str_mode, value, mask, NULL_RTX);
>         }
>        value = expand_shift (LSHIFT_EXPR, str_mode, value, bitpos, NULL_RTX, 
> 1);
>        result = expand_binop (str_mode, binop, str_rtx,
>                              value, str_rtx, 1, OPTAB_WIDEN);
>        if (result != str_rtx)
>         emit_move_insn (str_rtx, result);
> @@ -9853,15 +9855,16 @@ expand_expr_real_1 (tree exp, rtx target
>                 if (DECL_BIT_FIELD (field))
>                   {
>                     HOST_WIDE_INT bitsize = TREE_INT_CST_LOW (DECL_SIZE 
> (field));
>                     enum machine_mode imode = TYPE_MODE (TREE_TYPE (field));
>
>                     if (TYPE_UNSIGNED (TREE_TYPE (field)))
>                       {
> -                       op1 = GEN_INT (((HOST_WIDE_INT) 1 << bitsize) - 1);
> +                       op1 = gen_int_mode (((HOST_WIDE_INT) 1 << bitsize) - 
> 1,
> +                                           imode);
>                         op0 = expand_and (imode, op0, op1, target);
>                       }
>                     else
>                       {
>                         int count = GET_MODE_PRECISION (imode) - bitsize;
>
>                         op0 = expand_shift (LSHIFT_EXPR, imode, op0, count,
> Index: gcc/function.c
> ===================================================================
> --- gcc/function.c      2013-09-08 17:18:39.707590244 +0100
> +++ gcc/function.c      2013-09-09 10:55:59.756537396 +0100
> @@ -1540,17 +1540,18 @@ instantiate_virtual_regs_in_insn (rtx in
>        new_rtx = instantiate_new_reg (SET_SRC (set), &offset);
>        if (new_rtx && offset != 0
>           && REG_P (SET_DEST (set))
>           && REGNO (SET_DEST (set)) > LAST_VIRTUAL_REGISTER)
>         {
>           start_sequence ();
>
> -         x = expand_simple_binop (GET_MODE (SET_DEST (set)), PLUS,
> -                                  new_rtx, GEN_INT (offset), SET_DEST (set),
> -                                  1, OPTAB_LIB_WIDEN);
> +         x = expand_simple_binop (GET_MODE (SET_DEST (set)), PLUS, new_rtx,
> +                                  gen_int_mode (offset,
> +                                                GET_MODE (SET_DEST (set))),
> +                                  SET_DEST (set), 1, OPTAB_LIB_WIDEN);
>           if (x != SET_DEST (set))
>             emit_move_insn (SET_DEST (set), x);
>
>           seq = get_insns ();
>           end_sequence ();
>
>           emit_insn_before (seq, insn);
> @@ -1662,32 +1663,33 @@ instantiate_virtual_regs_in_insn (rtx in
>               /* Careful, special mode predicates may have stuff in
>                  insn_data[insn_code].operand[i].mode that isn't useful
>                  to us for computing a new value.  */
>               /* ??? Recognize address_operand and/or "p" constraints
>                  to see if (plus new offset) is a valid before we put
>                  this through expand_simple_binop.  */
>               x = expand_simple_binop (GET_MODE (x), PLUS, new_rtx,
> -                                      GEN_INT (offset), NULL_RTX,
> -                                      1, OPTAB_LIB_WIDEN);
> +                                      gen_int_mode (offset, GET_MODE (x)),
> +                                      NULL_RTX, 1, OPTAB_LIB_WIDEN);
>               seq = get_insns ();
>               end_sequence ();
>               emit_insn_before (seq, insn);
>             }
>           break;
>
>         case SUBREG:
>           new_rtx = instantiate_new_reg (SUBREG_REG (x), &offset);
>           if (new_rtx == NULL)
>             continue;
>           if (offset != 0)
>             {
>               start_sequence ();
> -             new_rtx = expand_simple_binop (GET_MODE (new_rtx), PLUS, 
> new_rtx,
> -                                        GEN_INT (offset), NULL_RTX,
> -                                        1, OPTAB_LIB_WIDEN);
> +             new_rtx = expand_simple_binop
> +               (GET_MODE (new_rtx), PLUS, new_rtx,
> +                gen_int_mode (offset, GET_MODE (new_rtx)),
> +                NULL_RTX, 1, OPTAB_LIB_WIDEN);
>               seq = get_insns ();
>               end_sequence ();
>               emit_insn_before (seq, insn);
>             }
>           x = simplify_gen_subreg (recog_data.operand_mode[i], new_rtx,
>                                    GET_MODE (new_rtx), SUBREG_BYTE (x));
>           gcc_assert (x);
> Index: gcc/ifcvt.c
> ===================================================================
> --- gcc/ifcvt.c 2013-09-08 17:18:39.707590244 +0100
> +++ gcc/ifcvt.c 2013-09-09 10:55:59.760537428 +0100
> @@ -1158,16 +1158,16 @@ noce_try_store_flag_constants (struct no
>        /* if (test) x = 3; else x = 4;
>          =>   x = 3 + (test == 0);  */
>        if (diff == STORE_FLAG_VALUE || diff == -STORE_FLAG_VALUE)
>         {
>           target = expand_simple_binop (mode,
>                                         (diff == STORE_FLAG_VALUE
>                                          ? PLUS : MINUS),
> -                                       GEN_INT (ifalse), target, if_info->x, 
> 0,
> -                                       OPTAB_WIDEN);
> +                                       gen_int_mode (ifalse, mode), target,
> +                                       if_info->x, 0, OPTAB_WIDEN);
>         }
>
>        /* if (test) x = 8; else x = 0;
>          =>   x = (test != 0) << 3;  */
>        else if (ifalse == 0 && (tmp = exact_log2 (itrue)) >= 0)
>         {
>           target = expand_simple_binop (mode, ASHIFT,
> @@ -1176,28 +1176,28 @@ noce_try_store_flag_constants (struct no
>         }
>
>        /* if (test) x = -1; else x = b;
>          =>   x = -(test != 0) | b;  */
>        else if (itrue == -1)
>         {
>           target = expand_simple_binop (mode, IOR,
> -                                       target, GEN_INT (ifalse), if_info->x, 
> 0,
> -                                       OPTAB_WIDEN);
> +                                       target, gen_int_mode (ifalse, mode),
> +                                       if_info->x, 0, OPTAB_WIDEN);
>         }
>
>        /* if (test) x = a; else x = b;
>          =>   x = (-(test != 0) & (b - a)) + a;  */
>        else
>         {
>           target = expand_simple_binop (mode, AND,
> -                                       target, GEN_INT (diff), if_info->x, 0,
> -                                       OPTAB_WIDEN);
> +                                       target, gen_int_mode (diff, mode),
> +                                       if_info->x, 0, OPTAB_WIDEN);
>           if (target)
>             target = expand_simple_binop (mode, PLUS,
> -                                         target, GEN_INT (ifalse),
> +                                         target, gen_int_mode (ifalse, mode),
>                                           if_info->x, 0, OPTAB_WIDEN);
>         }
>
>        if (! target)
>         {
>           end_sequence ();
>           return FALSE;
> Index: gcc/loop-unroll.c
> ===================================================================
> --- gcc/loop-unroll.c   2013-09-08 17:18:39.707590244 +0100
> +++ gcc/loop-unroll.c   2013-09-09 10:55:59.757537404 +0100
> @@ -1162,16 +1162,15 @@ unroll_loop_runtime_iterations (struct l
>    if (tmp != niter)
>      emit_move_insn (niter, tmp);
>
>    /* Count modulo by ANDing it with max_unroll; we use the fact that
>       the number of unrollings is a power of two, and thus this is correct
>       even if there is overflow in the computation.  */
>    niter = expand_simple_binop (desc->mode, AND,
> -                              niter,
> -                              GEN_INT (max_unroll),
> +                              niter, gen_int_mode (max_unroll, desc->mode),
>                                NULL_RTX, 0, OPTAB_LIB_WIDEN);
>
>    init_code = get_insns ();
>    end_sequence ();
>    unshare_all_rtl_in_chain (init_code);
>
>    /* Precondition the loop.  */
> Index: gcc/modulo-sched.c
> ===================================================================
> --- gcc/modulo-sched.c  2013-09-09 10:49:45.230460851 +0100
> +++ gcc/modulo-sched.c  2013-09-09 10:55:59.759537420 +0100
> @@ -1144,16 +1144,17 @@ generate_prolog_epilog (partial_schedule
>      {
>        /* Generate instructions at the beginning of the prolog to
>           adjust the loop count by STAGE_COUNT.  If loop count is constant
>           (count_init), this constant is adjusted by STAGE_COUNT in
>           generate_prolog_epilog function.  */
>        rtx sub_reg = NULL_RTX;
>
> -      sub_reg = expand_simple_binop (GET_MODE (count_reg), MINUS,
> -                                     count_reg, GEN_INT (last_stage),
> +      sub_reg = expand_simple_binop (GET_MODE (count_reg), MINUS, count_reg,
> +                                    gen_int_mode (last_stage,
> +                                                  GET_MODE (count_reg)),
>                                       count_reg, 1, OPTAB_DIRECT);
>        gcc_assert (REG_P (sub_reg));
>        if (REGNO (sub_reg) != REGNO (count_reg))
>          emit_move_insn (count_reg, sub_reg);
>      }
>
>    for (i = 0; i < last_stage; i++)
> Index: gcc/optabs.c
> ===================================================================
> --- gcc/optabs.c        2013-09-08 17:18:39.707590244 +0100
> +++ gcc/optabs.c        2013-09-09 10:55:59.760537428 +0100
> @@ -1559,15 +1559,15 @@ expand_binop (enum machine_mode mode, op
>
>        if (CONST_INT_P (op1))
>          newop1 = GEN_INT (bits - INTVAL (op1));
>        else if (targetm.shift_truncation_mask (mode) == bits - 1)
>          newop1 = negate_rtx (GET_MODE (op1), op1);
>        else
>          newop1 = expand_binop (GET_MODE (op1), sub_optab,
> -                              GEN_INT (bits), op1,
> +                              gen_int_mode (bits, GET_MODE (op1)), op1,
>                                NULL_RTX, unsignedp, OPTAB_DIRECT);
>
>        temp = expand_binop_directly (mode, otheroptab, op0, newop1,
>                                     target, unsignedp, methods, last);
>        if (temp)
>         return temp;
>      }
> @@ -2535,18 +2535,20 @@ widen_leading (enum machine_mode mode, r
>               if (target == 0)
>                 target = gen_reg_rtx (mode);
>               xop0 = widen_operand (op0, wider_mode, mode,
>                                     unoptab != clrsb_optab, false);
>               temp = expand_unop (wider_mode, unoptab, xop0, NULL_RTX,
>                                   unoptab != clrsb_optab);
>               if (temp != 0)
> -               temp = expand_binop (wider_mode, sub_optab, temp,
> -                                    GEN_INT (GET_MODE_PRECISION (wider_mode)
> -                                             - GET_MODE_PRECISION (mode)),
> -                                    target, true, OPTAB_DIRECT);
> +               temp = expand_binop
> +                 (wider_mode, sub_optab, temp,
> +                  gen_int_mode (GET_MODE_PRECISION (wider_mode)
> +                                - GET_MODE_PRECISION (mode),
> +                                wider_mode),
> +                  target, true, OPTAB_DIRECT);
>               if (temp == 0)
>                 delete_insns_since (last);
>
>               return temp;
>             }
>         }
>      }
> @@ -2597,15 +2599,15 @@ expand_doubleword_clz (enum machine_mode
>       of bits in the high word.  */
>    emit_label (hi0_label);
>
>    temp = expand_unop_direct (word_mode, clz_optab, sublo, 0, true);
>    if (!temp)
>      goto fail;
>    temp = expand_binop (word_mode, add_optab, temp,
> -                      GEN_INT (GET_MODE_BITSIZE (word_mode)),
> +                      gen_int_mode (GET_MODE_BITSIZE (word_mode), word_mode),
>                        result, true, OPTAB_DIRECT);
>    if (!temp)
>      goto fail;
>    if (temp != result)
>      convert_move (result, temp, true);
>
>    emit_label (after_label);
> @@ -2753,15 +2755,16 @@ expand_ctz (enum machine_mode mode, rtx
>    temp = expand_unop_direct (mode, neg_optab, op0, NULL_RTX, true);
>    if (temp)
>      temp = expand_binop (mode, and_optab, op0, temp, NULL_RTX,
>                          true, OPTAB_DIRECT);
>    if (temp)
>      temp = expand_unop_direct (mode, clz_optab, temp, NULL_RTX, true);
>    if (temp)
> -    temp = expand_binop (mode, sub_optab, GEN_INT (GET_MODE_PRECISION (mode) 
> - 1),
> +    temp = expand_binop (mode, sub_optab,
> +                        gen_int_mode (GET_MODE_PRECISION (mode) - 1, mode),
>                          temp, target,
>                          true, OPTAB_DIRECT);
>    if (temp == 0)
>      {
>        end_sequence ();
>        return 0;
>      }
> @@ -2834,15 +2837,15 @@ expand_ffs (enum machine_mode mode, rtx
>
>        convert_move (temp, GEN_INT (-1), false);
>        emit_label (nonzero_label);
>      }
>
>    /* temp now has a value in the range -1..bitsize-1.  ffs is supposed
>       to produce a value in the range 0..bitsize.  */
> -  temp = expand_binop (mode, add_optab, temp, GEN_INT (1),
> +  temp = expand_binop (mode, add_optab, temp, gen_int_mode (1, mode),
>                        target, false, OPTAB_DIRECT);
>    if (!temp)
>      goto fail;
>
>    seq = get_insns ();
>    end_sequence ();
>
> @@ -3304,18 +3307,20 @@ expand_unop (enum machine_mode mode, opt
>               temp = expand_unop (wider_mode, unoptab, xop0, NULL_RTX,
>                                   unsignedp);
>
>               /* If we are generating clz using wider mode, adjust the
>                  result.  Similarly for clrsb.  */
>               if ((unoptab == clz_optab || unoptab == clrsb_optab)
>                   && temp != 0)
> -               temp = expand_binop (wider_mode, sub_optab, temp,
> -                                    GEN_INT (GET_MODE_PRECISION (wider_mode)
> -                                             - GET_MODE_PRECISION (mode)),
> -                                    target, true, OPTAB_DIRECT);
> +               temp = expand_binop
> +                 (wider_mode, sub_optab, temp,
> +                  gen_int_mode (GET_MODE_PRECISION (wider_mode)
> +                                - GET_MODE_PRECISION (mode),
> +                                wider_mode),
> +                  target, true, OPTAB_DIRECT);
>
>               /* Likewise for bswap.  */
>               if (unoptab == bswap_optab && temp != 0)
>                 {
>                   gcc_assert (GET_MODE_PRECISION (wider_mode)
>                               == GET_MODE_BITSIZE (wider_mode)
>                               && GET_MODE_PRECISION (mode)

Reply via email to