Similar to patch 1, but here the calls are all to expand_* routines.

Tested in the same way as before.  OK to install?

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