Noting that there is a single caller that calls expand_shift with a 
possible non-constant shift value this patch renames expand_shift
to expand_variable_shift and changes expand_shift to take a constant
integer shift amout, updating all callers to drop various variants
of building an integer constant.  Optimizing expand_variable_shift
and expand_shift is possible, but I'll leave that to a followup
and/or somebody else.

Bootstrap and regtest running on x86_64-unknown-linux-gnu, I'll apply
this after it succeeded.

Richard.

2011-04-29  Richard Guenther  <rguent...@suse.de>

        * expr.h (expand_shift): Rename to ...
        (expand_variable_shift): ... this.
        (expand_shift): Take a constant shift amount.
        * expmed.c (expand_shift): Rename to ...
        (expand_variable_shift): ... this.
        (expand_shift): New wrapper around expand_variable_shift.
        * expr.c (convert_move, emit_group_load_1, emit_group_store,
        optimize_bitfield_assignment_op, store_field, expand_expr_real_2,
        expand_expr_real_1, reduce_to_bit_field_precision): Adjust.
        * expmed.c (store_fixed_bit_field, extract_bit_field_1,
        extract_fixed_bit_field, extract_split_bit_field, expand_mult_const,
        expand_mult, expand_widening_mult, expand_mult_highpart_adjust,
        extract_high_half, expand_sdiv_pow2, expand_divmod, emit_cstore,
        emit_store_flag_1, emit_store_flag): Likewise.
        * builtins.c (expand_builtin_signbit): Likewise.
        * calls.c (load_register_parameters): Likewise.
        * function.c (assign_parm_setup_block): Likewise.
        * lower-subreg.c (resolve_shift_zext): Likewise.
        * optabs.c (widen_bswap, expand_abs_nojump,
        expand_one_cmpl_abs_nojump, expand_float): Likewise.
        * spu/spu.c (spu_expand_extv): Likewise.
        * sparc/sparc.c (sparc32_initialize_trampoline): Likewise.

Index: gcc/expr.h
===================================================================
*** gcc/expr.h  (revision 173151)
--- gcc/expr.h  (working copy)
*************** extern rtx expand_call (tree, rtx, int);
*** 488,495 ****
  extern void fixup_tail_calls (void);
  
  #ifdef TREE_CODE
! extern rtx expand_shift (enum tree_code, enum machine_mode, rtx, tree, rtx,
!                        int);
  extern rtx expand_divmod (int, enum tree_code, enum machine_mode, rtx, rtx,
                          rtx, int);
  #endif
--- 488,497 ----
  extern void fixup_tail_calls (void);
  
  #ifdef TREE_CODE
! extern rtx expand_variable_shift (enum tree_code, enum machine_mode,
!                                 rtx, tree, rtx, int);
! extern rtx expand_shift (enum tree_code, enum machine_mode, rtx, int, rtx,
!                            int);
  extern rtx expand_divmod (int, enum tree_code, enum machine_mode, rtx, rtx,
                          rtx, int);
  #endif
Index: gcc/expr.c
===================================================================
*** gcc/expr.c  (revision 173151)
--- gcc/expr.c  (working copy)
*************** convert_move (rtx to, rtx from, int unsi
*** 616,622 ****
        {
          enum machine_mode intermediate;
          rtx tmp;
!         tree shift_amount;
  
          /* Search for a mode to convert via.  */
          for (intermediate = from_mode; intermediate != VOIDmode;
--- 616,622 ----
        {
          enum machine_mode intermediate;
          rtx tmp;
!         int shift_amount;
  
          /* Search for a mode to convert via.  */
          for (intermediate = from_mode; intermediate != VOIDmode;
*************** convert_move (rtx to, rtx from, int unsi
*** 636,644 ****
  
          /* No suitable intermediate mode.
             Generate what we need with shifts.  */
!         shift_amount = build_int_cst (NULL_TREE,
!                                       GET_MODE_BITSIZE (to_mode)
!                                       - GET_MODE_BITSIZE (from_mode));
          from = gen_lowpart (to_mode, force_reg (from_mode, from));
          tmp = expand_shift (LSHIFT_EXPR, to_mode, from, shift_amount,
                              to, unsignedp);
--- 636,643 ----
  
          /* No suitable intermediate mode.
             Generate what we need with shifts.  */
!         shift_amount = (GET_MODE_BITSIZE (to_mode)
!                         - GET_MODE_BITSIZE (from_mode));
          from = gen_lowpart (to_mode, force_reg (from_mode, from));
          tmp = expand_shift (LSHIFT_EXPR, to_mode, from, shift_amount,
                              to, unsignedp);
*************** emit_group_load_1 (rtx *tmps, rtx dst, r
*** 1753,1759 ****
  
        if (shift)
        tmps[i] = expand_shift (LSHIFT_EXPR, mode, tmps[i],
!                               build_int_cst (NULL_TREE, shift), tmps[i], 0);
      }
  }
  
--- 1752,1758 ----
  
        if (shift)
        tmps[i] = expand_shift (LSHIFT_EXPR, mode, tmps[i],
!                               shift, tmps[i], 0);
      }
  }
  
*************** emit_group_store (rtx orig_dst, rtx src,
*** 2050,2057 ****
            {
              int shift = (bytelen - (ssize - bytepos)) * BITS_PER_UNIT;
              tmps[i] = expand_shift (RSHIFT_EXPR, mode, tmps[i],
!                                     build_int_cst (NULL_TREE, shift),
!                                     tmps[i], 0);
            }
          bytelen = adj_bytelen;
        }
--- 2049,2055 ----
            {
              int shift = (bytelen - (ssize - bytepos)) * BITS_PER_UNIT;
              tmps[i] = expand_shift (RSHIFT_EXPR, mode, tmps[i],
!                                     shift, tmps[i], 0);
            }
          bytelen = adj_bytelen;
        }
*************** optimize_bitfield_assignment_op (unsigne
*** 4052,4059 ****
          binop = xor_optab;
        }
        value = expand_shift (LSHIFT_EXPR, str_mode, value,
!                           build_int_cst (NULL_TREE, bitpos),
!                           NULL_RTX, 1);
        result = expand_binop (str_mode, binop, str_rtx,
                             value, str_rtx, 1, OPTAB_WIDEN);
        if (result != str_rtx)
--- 4050,4056 ----
          binop = xor_optab;
        }
        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)
*************** optimize_bitfield_assignment_op (unsigne
*** 4087,4094 ****
                              NULL_RTX);
        }
        value = expand_shift (LSHIFT_EXPR, GET_MODE (str_rtx), value,
!                           build_int_cst (NULL_TREE, bitpos),
!                           NULL_RTX, 1);
        result = expand_binop (GET_MODE (str_rtx), binop, str_rtx,
                             value, str_rtx, 1, OPTAB_WIDEN);
        if (result != str_rtx)
--- 4084,4090 ----
                              NULL_RTX);
        }
        value = expand_shift (LSHIFT_EXPR, GET_MODE (str_rtx), value,
!                           bitpos, NULL_RTX, 1);
        result = expand_binop (GET_MODE (str_rtx), binop, str_rtx,
                             value, str_rtx, 1, OPTAB_WIDEN);
        if (result != str_rtx)
*************** store_field (rtx target, HOST_WIDE_INT b
*** 5882,5889 ****
          && bitsize < (HOST_WIDE_INT) GET_MODE_BITSIZE (GET_MODE (temp))
          && TREE_CODE (TREE_TYPE (exp)) == RECORD_TYPE)
        temp = expand_shift (RSHIFT_EXPR, GET_MODE (temp), temp,
!                            size_int (GET_MODE_BITSIZE (GET_MODE (temp))
!                                      - bitsize),
                             NULL_RTX, 1);
  
        /* Unless MODE is VOIDmode or BLKmode, convert TEMP to
--- 5878,5884 ----
          && bitsize < (HOST_WIDE_INT) GET_MODE_BITSIZE (GET_MODE (temp))
          && TREE_CODE (TREE_TYPE (exp)) == RECORD_TYPE)
        temp = expand_shift (RSHIFT_EXPR, GET_MODE (temp), temp,
!                            GET_MODE_BITSIZE (GET_MODE (temp)) - bitsize,
                             NULL_RTX, 1);
  
        /* Unless MODE is VOIDmode or BLKmode, convert TEMP to
*************** expand_expr_real_2 (sepops ops, rtx targ
*** 8064,8071 ****
        target = 0;
        op0 = expand_expr (treeop0, subtarget,
                         VOIDmode, EXPAND_NORMAL);
!       temp = expand_shift (code, mode, op0, treeop1, target,
!                          unsignedp);
        if (code == LSHIFT_EXPR)
        temp = REDUCE_BIT_FIELD (temp);
        return temp;
--- 8059,8066 ----
        target = 0;
        op0 = expand_expr (treeop0, subtarget,
                         VOIDmode, EXPAND_NORMAL);
!       temp = expand_variable_shift (code, mode, op0, treeop1, target,
!                                   unsignedp);
        if (code == LSHIFT_EXPR)
        temp = REDUCE_BIT_FIELD (temp);
        return temp;
*************** expand_expr_real_1 (tree exp, rtx target
*** 8980,8988 ****
                      }
                    else
                      {
!                       tree count
!                         = build_int_cst (NULL_TREE,
!                                          GET_MODE_BITSIZE (imode) - bitsize);
  
                        op0 = expand_shift (LSHIFT_EXPR, imode, op0, count,
                                            target, 0);
--- 8975,8981 ----
                      }
                    else
                      {
!                       int count = GET_MODE_BITSIZE (imode) - bitsize;
  
                        op0 = expand_shift (LSHIFT_EXPR, imode, op0, count,
                                            target, 0);
*************** expand_expr_real_1 (tree exp, rtx target
*** 9251,9259 ****
                && GET_MODE_CLASS (GET_MODE (op0)) == MODE_INT
                && bitsize < (HOST_WIDE_INT) GET_MODE_BITSIZE (GET_MODE (op0)))
              op0 = expand_shift (LSHIFT_EXPR, GET_MODE (op0), op0,
!                                 size_int (GET_MODE_BITSIZE (GET_MODE (op0))
!                                           - bitsize),
!                                 op0, 1);
  
            /* If the result type is BLKmode, store the data into a temporary
               of the appropriate type, but with the mode corresponding to the
--- 9244,9251 ----
                && GET_MODE_CLASS (GET_MODE (op0)) == MODE_INT
                && bitsize < (HOST_WIDE_INT) GET_MODE_BITSIZE (GET_MODE (op0)))
              op0 = expand_shift (LSHIFT_EXPR, GET_MODE (op0), op0,
!                                 GET_MODE_BITSIZE (GET_MODE (op0))
!                                 - bitsize, op0, 1);
  
            /* If the result type is BLKmode, store the data into a temporary
               of the appropriate type, but with the mode corresponding to the
*************** reduce_to_bit_field_precision (rtx exp,
*** 9750,9759 ****
      }
    else
      {
!       tree count = build_int_cst (NULL_TREE,
!                                 GET_MODE_BITSIZE (GET_MODE (exp)) - prec);
!       exp = expand_shift (LSHIFT_EXPR, GET_MODE (exp), exp, count, target, 0);
!       return expand_shift (RSHIFT_EXPR, GET_MODE (exp), exp, count, target, 
0);
      }
  }
  
--- 9742,9752 ----
      }
    else
      {
!       int count = GET_MODE_BITSIZE (GET_MODE (exp)) - prec;
!       exp = expand_shift (LSHIFT_EXPR, GET_MODE (exp),
!                         exp, count, target, 0);
!       return expand_shift (RSHIFT_EXPR, GET_MODE (exp),
!                          exp, count, target, 0);
      }
  }
  
Index: gcc/expmed.c
===================================================================
*** gcc/expmed.c        (revision 173151)
--- gcc/expmed.c        (working copy)
*************** store_fixed_bit_field (rtx op0, unsigned
*** 916,922 ****
                              NULL_RTX, 1, OPTAB_LIB_WIDEN);
        if (bitpos > 0)
        value = expand_shift (LSHIFT_EXPR, mode, value,
!                             build_int_cst (NULL_TREE, bitpos), NULL_RTX, 1);
      }
  
    /* Now clear the chosen bits in OP0,
--- 916,922 ----
                              NULL_RTX, 1, OPTAB_LIB_WIDEN);
        if (bitpos > 0)
        value = expand_shift (LSHIFT_EXPR, mode, value,
!                             bitpos, NULL_RTX, 1);
      }
  
    /* Now clear the chosen bits in OP0,
*************** extract_bit_field_1 (rtx str_rtx, unsign
*** 1396,1408 ****
  
        /* Signed bit field: sign-extend with two arithmetic shifts.  */
        target = expand_shift (LSHIFT_EXPR, mode, target,
!                            build_int_cst (NULL_TREE,
!                                           GET_MODE_BITSIZE (mode) - bitsize),
!                            NULL_RTX, 0);
        return expand_shift (RSHIFT_EXPR, mode, target,
!                          build_int_cst (NULL_TREE,
!                                         GET_MODE_BITSIZE (mode) - bitsize),
!                          NULL_RTX, 0);
      }
  
    /* From here on we know the desired field is smaller than a word.  */
--- 1396,1404 ----
  
        /* Signed bit field: sign-extend with two arithmetic shifts.  */
        target = expand_shift (LSHIFT_EXPR, mode, target,
!                            GET_MODE_BITSIZE (mode) - bitsize, NULL_RTX, 0);
        return expand_shift (RSHIFT_EXPR, mode, target,
!                          GET_MODE_BITSIZE (mode) - bitsize, NULL_RTX, 0);
      }
  
    /* From here on we know the desired field is smaller than a word.  */
*************** extract_fixed_bit_field (enum machine_mo
*** 1752,1763 ****
        {
          /* If the field does not already start at the lsb,
             shift it so it does.  */
-         tree amount = build_int_cst (NULL_TREE, bitpos);
          /* Maybe propagate the target for the shift.  */
          /* But not if we will return it--could confuse integrate.c.  */
          rtx subtarget = (target != 0 && REG_P (target) ? target : 0);
          if (tmode != mode) subtarget = 0;
!         op0 = expand_shift (RSHIFT_EXPR, mode, op0, amount, subtarget, 1);
        }
        /* Convert the value to the desired mode.  */
        if (mode != tmode)
--- 1748,1758 ----
        {
          /* If the field does not already start at the lsb,
             shift it so it does.  */
          /* Maybe propagate the target for the shift.  */
          /* But not if we will return it--could confuse integrate.c.  */
          rtx subtarget = (target != 0 && REG_P (target) ? target : 0);
          if (tmode != mode) subtarget = 0;
!         op0 = expand_shift (RSHIFT_EXPR, mode, op0, bitpos, subtarget, 1);
        }
        /* Convert the value to the desired mode.  */
        if (mode != tmode)
*************** extract_fixed_bit_field (enum machine_mo
*** 1791,1808 ****
  
    if (GET_MODE_BITSIZE (mode) != (bitsize + bitpos))
      {
!       tree amount
!       = build_int_cst (NULL_TREE,
!                        GET_MODE_BITSIZE (mode) - (bitsize + bitpos));
        /* Maybe propagate the target for the shift.  */
        rtx subtarget = (target != 0 && REG_P (target) ? target : 0);
        op0 = expand_shift (LSHIFT_EXPR, mode, op0, amount, subtarget, 1);
      }
  
    return expand_shift (RSHIFT_EXPR, mode, op0,
!                      build_int_cst (NULL_TREE,
!                                     GET_MODE_BITSIZE (mode) - bitsize),
!                      target, 0);
  }
  
  /* Return a constant integer (CONST_INT or CONST_DOUBLE) mask value
--- 1786,1799 ----
  
    if (GET_MODE_BITSIZE (mode) != (bitsize + bitpos))
      {
!       int amount = GET_MODE_BITSIZE (mode) - (bitsize + bitpos);
        /* Maybe propagate the target for the shift.  */
        rtx subtarget = (target != 0 && REG_P (target) ? target : 0);
        op0 = expand_shift (LSHIFT_EXPR, mode, op0, amount, subtarget, 1);
      }
  
    return expand_shift (RSHIFT_EXPR, mode, op0,
!                      GET_MODE_BITSIZE (mode) - bitsize, target, 0);
  }
  
  /* Return a constant integer (CONST_INT or CONST_DOUBLE) mask value
*************** extract_split_bit_field (rtx op0, unsign
*** 1913,1927 ****
        {
          if (bitsize != bitsdone)
            part = expand_shift (LSHIFT_EXPR, word_mode, part,
!                                build_int_cst (NULL_TREE, bitsize - bitsdone),
!                                0, 1);
        }
        else
        {
          if (bitsdone != thissize)
            part = expand_shift (LSHIFT_EXPR, word_mode, part,
!                                build_int_cst (NULL_TREE,
!                                               bitsdone - thissize), 0, 1);
        }
  
        if (first)
--- 1904,1916 ----
        {
          if (bitsize != bitsdone)
            part = expand_shift (LSHIFT_EXPR, word_mode, part,
!                                bitsize - bitsdone, 0, 1);
        }
        else
        {
          if (bitsdone != thissize)
            part = expand_shift (LSHIFT_EXPR, word_mode, part,
!                                bitsdone - thissize, 0, 1);
        }
  
        if (first)
*************** extract_split_bit_field (rtx op0, unsign
*** 1940,1950 ****
      return result;
    /* Signed bit field: sign-extend with two arithmetic shifts.  */
    result = expand_shift (LSHIFT_EXPR, word_mode, result,
!                        build_int_cst (NULL_TREE, BITS_PER_WORD - bitsize),
!                        NULL_RTX, 0);
    return expand_shift (RSHIFT_EXPR, word_mode, result,
!                      build_int_cst (NULL_TREE, BITS_PER_WORD - bitsize),
!                      NULL_RTX, 0);
  }
  
  /* Try to read the low bits of SRC as an rvalue of mode MODE, preserving
--- 1929,1937 ----
      return result;
    /* Signed bit field: sign-extend with two arithmetic shifts.  */
    result = expand_shift (LSHIFT_EXPR, word_mode, result,
!                        BITS_PER_WORD - bitsize, NULL_RTX, 0);
    return expand_shift (RSHIFT_EXPR, word_mode, result,
!                      BITS_PER_WORD - bitsize, NULL_RTX, 0);
  }
  
  /* Try to read the low bits of SRC as an rvalue of mode MODE, preserving
*************** expand_dec (rtx target, rtx dec)
*** 2053,2060 ****
     Return the rtx for where the value is.  */
  
  rtx
! expand_shift (enum tree_code code, enum machine_mode mode, rtx shifted,
!             tree amount, rtx target, int unsignedp)
  {
    rtx op1, temp = 0;
    int left = (code == LSHIFT_EXPR || code == LROTATE_EXPR);
--- 2040,2047 ----
     Return the rtx for where the value is.  */
  
  rtx
! expand_variable_shift (enum tree_code code, enum machine_mode mode, rtx 
shifted,
!                      tree amount, rtx target, int unsignedp)
  {
    rtx op1, temp = 0;
    int left = (code == LSHIFT_EXPR || code == LROTATE_EXPR);
*************** expand_shift (enum tree_code code, enum
*** 2167,2176 ****
  
              shifted = force_reg (mode, shifted);
  
!             temp = expand_shift (left ? LSHIFT_EXPR : RSHIFT_EXPR,
!                                  mode, shifted, new_amount, 0, 1);
!             temp1 = expand_shift (left ? RSHIFT_EXPR : LSHIFT_EXPR,
!                                   mode, shifted, other_amount, subtarget, 1);
              return expand_binop (mode, ior_optab, temp, temp1, target,
                                   unsignedp, methods);
            }
--- 2154,2164 ----
  
              shifted = force_reg (mode, shifted);
  
!             temp = expand_variable_shift (left ? LSHIFT_EXPR : RSHIFT_EXPR,
!                                           mode, shifted, new_amount, 0, 1);
!             temp1 = expand_variable_shift (left ? RSHIFT_EXPR : LSHIFT_EXPR,
!                                            mode, shifted, other_amount,
!                                            subtarget, 1);
              return expand_binop (mode, ior_optab, temp, temp1, target,
                                   unsignedp, methods);
            }
*************** expand_shift (enum tree_code code, enum
*** 2213,2218 ****
--- 2201,2224 ----
    gcc_assert (temp);
    return temp;
  }
+ 
+ /* Output a shift instruction for expression code CODE,
+    with SHIFTED being the rtx for the value to shift,
+    and AMOUNT the amount to shift by.
+    Store the result in the rtx TARGET, if that is convenient.
+    If UNSIGNEDP is nonzero, do a logical shift; otherwise, arithmetic.
+    Return the rtx for where the value is.  */
+ 
+ rtx
+ expand_shift (enum tree_code code, enum machine_mode mode, rtx shifted,
+             int amount, rtx target, int unsignedp)
+ {
+   /* ???  With re-writing expand_shift we could avoid going through a
+      tree for the shift amount and directly do GEN_INT (amount).  */
+   return expand_variable_shift (code, mode, shifted,
+                               build_int_cst (integer_type_node, amount),
+                               target, unsignedp);
+ }
  
  /* Indicates the type of fixup needed after a constant multiplication.
     BASIC_VARIANT means no fixup is needed, NEGATE_VARIANT means that
*************** expand_mult_const (enum machine_mode mod
*** 2838,2864 ****
        switch (alg->op[opno])
        {
        case alg_shift:
!         tem = expand_shift (LSHIFT_EXPR, mode, accum,
!                             build_int_cst (NULL_TREE, log),
!                             NULL_RTX, 0);
          /* REG_EQUAL note will be attached to the following insn.  */
          emit_move_insn (accum, tem);
          val_so_far <<= log;
          break;
  
        case alg_add_t_m2:
!         tem = expand_shift (LSHIFT_EXPR, mode, op0,
!                             build_int_cst (NULL_TREE, log),
!                             NULL_RTX, 0);
          accum = force_operand (gen_rtx_PLUS (mode, accum, tem),
                                 add_target ? add_target : accum_target);
          val_so_far += (HOST_WIDE_INT) 1 << log;
          break;
  
        case alg_sub_t_m2:
!         tem = expand_shift (LSHIFT_EXPR, mode, op0,
!                             build_int_cst (NULL_TREE, log),
!                             NULL_RTX, 0);
          accum = force_operand (gen_rtx_MINUS (mode, accum, tem),
                                 add_target ? add_target : accum_target);
          val_so_far -= (HOST_WIDE_INT) 1 << log;
--- 2844,2864 ----
        switch (alg->op[opno])
        {
        case alg_shift:
!         tem = expand_shift (LSHIFT_EXPR, mode, accum, log, NULL_RTX, 0);
          /* REG_EQUAL note will be attached to the following insn.  */
          emit_move_insn (accum, tem);
          val_so_far <<= log;
          break;
  
        case alg_add_t_m2:
!         tem = expand_shift (LSHIFT_EXPR, mode, op0, log, NULL_RTX, 0);
          accum = force_operand (gen_rtx_PLUS (mode, accum, tem),
                                 add_target ? add_target : accum_target);
          val_so_far += (HOST_WIDE_INT) 1 << log;
          break;
  
        case alg_sub_t_m2:
!         tem = expand_shift (LSHIFT_EXPR, mode, op0, log, NULL_RTX, 0);
          accum = force_operand (gen_rtx_MINUS (mode, accum, tem),
                                 add_target ? add_target : accum_target);
          val_so_far -= (HOST_WIDE_INT) 1 << log;
*************** expand_mult_const (enum machine_mode mod
*** 2866,2874 ****
  
        case alg_add_t2_m:
          accum = expand_shift (LSHIFT_EXPR, mode, accum,
!                               build_int_cst (NULL_TREE, log),
!                               shift_subtarget,
!                               0);
          accum = force_operand (gen_rtx_PLUS (mode, accum, op0),
                                 add_target ? add_target : accum_target);
          val_so_far = (val_so_far << log) + 1;
--- 2866,2872 ----
  
        case alg_add_t2_m:
          accum = expand_shift (LSHIFT_EXPR, mode, accum,
!                               log, shift_subtarget, 0);
          accum = force_operand (gen_rtx_PLUS (mode, accum, op0),
                                 add_target ? add_target : accum_target);
          val_so_far = (val_so_far << log) + 1;
*************** expand_mult_const (enum machine_mode mod
*** 2876,2901 ****
  
        case alg_sub_t2_m:
          accum = expand_shift (LSHIFT_EXPR, mode, accum,
!                               build_int_cst (NULL_TREE, log),
!                               shift_subtarget, 0);
          accum = force_operand (gen_rtx_MINUS (mode, accum, op0),
                                 add_target ? add_target : accum_target);
          val_so_far = (val_so_far << log) - 1;
          break;
  
        case alg_add_factor:
!         tem = expand_shift (LSHIFT_EXPR, mode, accum,
!                             build_int_cst (NULL_TREE, log),
!                             NULL_RTX, 0);
          accum = force_operand (gen_rtx_PLUS (mode, accum, tem),
                                 add_target ? add_target : accum_target);
          val_so_far += val_so_far << log;
          break;
  
        case alg_sub_factor:
!         tem = expand_shift (LSHIFT_EXPR, mode, accum,
!                             build_int_cst (NULL_TREE, log),
!                             NULL_RTX, 0);
          accum = force_operand (gen_rtx_MINUS (mode, tem, accum),
                                 (add_target
                                  ? add_target : (optimize ? 0 : tem)));
--- 2874,2894 ----
  
        case alg_sub_t2_m:
          accum = expand_shift (LSHIFT_EXPR, mode, accum,
!                               log, shift_subtarget, 0);
          accum = force_operand (gen_rtx_MINUS (mode, accum, op0),
                                 add_target ? add_target : accum_target);
          val_so_far = (val_so_far << log) - 1;
          break;
  
        case alg_add_factor:
!         tem = expand_shift (LSHIFT_EXPR, mode, accum, log, NULL_RTX, 0);
          accum = force_operand (gen_rtx_PLUS (mode, accum, tem),
                                 add_target ? add_target : accum_target);
          val_so_far += val_so_far << log;
          break;
  
        case alg_sub_factor:
!         tem = expand_shift (LSHIFT_EXPR, mode, accum, log, NULL_RTX, 0);
          accum = force_operand (gen_rtx_MINUS (mode, tem, accum),
                                 (add_target
                                  ? add_target : (optimize ? 0 : tem)));
*************** expand_mult (enum machine_mode mode, rtx
*** 3028,3035 ****
              int shift = floor_log2 (CONST_DOUBLE_HIGH (op1))
                          + HOST_BITS_PER_WIDE_INT;
              return expand_shift (LSHIFT_EXPR, mode, op0,
!                                  build_int_cst (NULL_TREE, shift),
!                                  target, unsignedp);
            }
        }
  
--- 3021,3027 ----
              int shift = floor_log2 (CONST_DOUBLE_HIGH (op1))
                          + HOST_BITS_PER_WIDE_INT;
              return expand_shift (LSHIFT_EXPR, mode, op0,
!                                  shift, target, unsignedp);
            }
        }
  
*************** expand_mult (enum machine_mode mode, rtx
*** 3042,3049 ****
          /* Special case powers of two.  */
          if (EXACT_POWER_OF_2_OR_ZERO_P (coeff))
            return expand_shift (LSHIFT_EXPR, mode, op0,
!                                build_int_cst (NULL_TREE, floor_log2 (coeff)),
!                                target, unsignedp);
  
          /* Exclude cost of op0 from max_cost to match the cost
             calculation of the synth_mult.  */
--- 3034,3040 ----
          /* Special case powers of two.  */
          if (EXACT_POWER_OF_2_OR_ZERO_P (coeff))
            return expand_shift (LSHIFT_EXPR, mode, op0,
!                                floor_log2 (coeff), target, unsignedp);
  
          /* Exclude cost of op0 from max_cost to match the cost
             calculation of the synth_mult.  */
*************** expand_widening_mult (enum machine_mode
*** 3123,3130 ****
        {
          op0 = convert_to_mode (mode, op0, this_optab == umul_widen_optab);
          return expand_shift (LSHIFT_EXPR, mode, op0,
!                              build_int_cst (NULL_TREE, floor_log2 (coeff)),
!                              target, unsignedp);
        }
  
        /* Exclude cost of op0 from max_cost to match the cost
--- 3114,3120 ----
        {
          op0 = convert_to_mode (mode, op0, this_optab == umul_widen_optab);
          return expand_shift (LSHIFT_EXPR, mode, op0,
!                              floor_log2 (coeff), target, unsignedp);
        }
  
        /* Exclude cost of op0 from max_cost to match the cost
*************** expand_mult_highpart_adjust (enum machin
*** 3297,3312 ****
    enum rtx_code adj_code = unsignedp ? PLUS : MINUS;
  
    tem = expand_shift (RSHIFT_EXPR, mode, op0,
!                     build_int_cst (NULL_TREE, GET_MODE_BITSIZE (mode) - 1),
!                     NULL_RTX, 0);
    tem = expand_and (mode, tem, op1, NULL_RTX);
    adj_operand
      = force_operand (gen_rtx_fmt_ee (adj_code, mode, adj_operand, tem),
                     adj_operand);
  
    tem = expand_shift (RSHIFT_EXPR, mode, op1,
!                     build_int_cst (NULL_TREE, GET_MODE_BITSIZE (mode) - 1),
!                     NULL_RTX, 0);
    tem = expand_and (mode, tem, op0, NULL_RTX);
    target = force_operand (gen_rtx_fmt_ee (adj_code, mode, adj_operand, tem),
                          target);
--- 3287,3300 ----
    enum rtx_code adj_code = unsignedp ? PLUS : MINUS;
  
    tem = expand_shift (RSHIFT_EXPR, mode, op0,
!                     GET_MODE_BITSIZE (mode) - 1, NULL_RTX, 0);
    tem = expand_and (mode, tem, op1, NULL_RTX);
    adj_operand
      = force_operand (gen_rtx_fmt_ee (adj_code, mode, adj_operand, tem),
                     adj_operand);
  
    tem = expand_shift (RSHIFT_EXPR, mode, op1,
!                     GET_MODE_BITSIZE (mode) - 1, NULL_RTX, 0);
    tem = expand_and (mode, tem, op0, NULL_RTX);
    target = force_operand (gen_rtx_fmt_ee (adj_code, mode, adj_operand, tem),
                          target);
*************** extract_high_half (enum machine_mode mod
*** 3328,3334 ****
  
    wider_mode = GET_MODE_WIDER_MODE (mode);
    op = expand_shift (RSHIFT_EXPR, wider_mode, op,
!                    build_int_cst (NULL_TREE, GET_MODE_BITSIZE (mode)), 0, 1);
    return convert_modes (mode, wider_mode, op, 0);
  }
  
--- 3316,3322 ----
  
    wider_mode = GET_MODE_WIDER_MODE (mode);
    op = expand_shift (RSHIFT_EXPR, wider_mode, op,
!                    GET_MODE_BITSIZE (mode), 0, 1);
    return convert_modes (mode, wider_mode, op, 0);
  }
  
*************** static rtx
*** 3615,3625 ****
  expand_sdiv_pow2 (enum machine_mode mode, rtx op0, HOST_WIDE_INT d)
  {
    rtx temp, label;
-   tree shift;
    int logd;
  
    logd = floor_log2 (d);
-   shift = build_int_cst (NULL_TREE, logd);
  
    if (d == 2
        && BRANCH_COST (optimize_insn_for_speed_p (),
--- 3603,3611 ----
*************** expand_sdiv_pow2 (enum machine_mode mode
*** 3629,3635 ****
        temp = emit_store_flag (temp, LT, op0, const0_rtx, mode, 0, 1);
        temp = expand_binop (mode, add_optab, temp, op0, NULL_RTX,
                           0, OPTAB_LIB_WIDEN);
!       return expand_shift (RSHIFT_EXPR, mode, temp, shift, NULL_RTX, 0);
      }
  
  #ifdef HAVE_conditional_move
--- 3615,3621 ----
        temp = emit_store_flag (temp, LT, op0, const0_rtx, mode, 0, 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);
      }
  
  #ifdef HAVE_conditional_move
*************** expand_sdiv_pow2 (enum machine_mode mode
*** 3657,3663 ****
          rtx seq = get_insns ();
          end_sequence ();
          emit_insn (seq);
!         return expand_shift (RSHIFT_EXPR, mode, temp2, shift, NULL_RTX, 0);
        }
        end_sequence ();
      }
--- 3643,3649 ----
          rtx seq = get_insns ();
          end_sequence ();
          emit_insn (seq);
!         return expand_shift (RSHIFT_EXPR, mode, temp2, logd, NULL_RTX, 0);
        }
        end_sequence ();
      }
*************** expand_sdiv_pow2 (enum machine_mode mode
*** 3675,3685 ****
                             NULL_RTX, 0, OPTAB_LIB_WIDEN);
        else
        temp = expand_shift (RSHIFT_EXPR, mode, temp,
!                            build_int_cst (NULL_TREE, 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, shift, NULL_RTX, 0);
      }
  
    label = gen_label_rtx ();
--- 3661,3670 ----
                             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 ();
*************** expand_sdiv_pow2 (enum machine_mode mode
*** 3687,3693 ****
    do_cmp_and_jump (temp, const0_rtx, GE, mode, label);
    expand_inc (temp, GEN_INT (d - 1));
    emit_label (label);
!   return expand_shift (RSHIFT_EXPR, mode, temp, shift, NULL_RTX, 0);
  }
  
  /* Emit the code to divide OP0 by OP1, putting the result in TARGET
--- 3672,3678 ----
    do_cmp_and_jump (temp, const0_rtx, GE, mode, label);
    expand_inc (temp, GEN_INT (d - 1));
    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
*************** expand_divmod (int rem_flag, enum tree_c
*** 3951,3959 ****
                          return gen_lowpart (mode, remainder);
                      }
                    quotient = expand_shift (RSHIFT_EXPR, compute_mode, op0,
!                                            build_int_cst (NULL_TREE,
!                                                           pre_shift),
!                                            tquotient, 1);
                  }
                else if (size <= HOST_BITS_PER_WIDE_INT)
                  {
--- 3936,3942 ----
                          return gen_lowpart (mode, remainder);
                      }
                    quotient = expand_shift (RSHIFT_EXPR, compute_mode, op0,
!                                            pre_shift, tquotient, 1);
                  }
                else if (size <= HOST_BITS_PER_WIDE_INT)
                  {
*************** expand_divmod (int rem_flag, enum tree_c
*** 4005,4019 ****
                            t2 = force_operand (gen_rtx_MINUS (compute_mode,
                                                               op0, t1),
                                                NULL_RTX);
!                           t3 = expand_shift (RSHIFT_EXPR, compute_mode, t2,
!                                              integer_one_node, NULL_RTX, 1);
                            t4 = force_operand (gen_rtx_PLUS (compute_mode,
                                                              t1, t3),
                                                NULL_RTX);
                            quotient = expand_shift
                              (RSHIFT_EXPR, compute_mode, t4,
!                              build_int_cst (NULL_TREE, post_shift - 1),
!                              tquotient, 1);
                          }
                        else
                          {
--- 3988,4001 ----
                            t2 = force_operand (gen_rtx_MINUS (compute_mode,
                                                               op0, t1),
                                                NULL_RTX);
!                           t3 = expand_shift (RSHIFT_EXPR, compute_mode,
!                                              t2, 1, NULL_RTX, 1);
                            t4 = force_operand (gen_rtx_PLUS (compute_mode,
                                                              t1, t3),
                                                NULL_RTX);
                            quotient = expand_shift
                              (RSHIFT_EXPR, compute_mode, t4,
!                              post_shift - 1, tquotient, 1);
                          }
                        else
                          {
*************** expand_divmod (int rem_flag, enum tree_c
*** 4025,4032 ****
  
                            t1 = expand_shift
                              (RSHIFT_EXPR, compute_mode, op0,
!                              build_int_cst (NULL_TREE, pre_shift),
!                              NULL_RTX, 1);
                            extra_cost
                              = (shift_cost[speed][compute_mode][pre_shift]
                                 + shift_cost[speed][compute_mode][post_shift]);
--- 4007,4013 ----
  
                            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]);
*************** expand_divmod (int rem_flag, enum tree_c
*** 4037,4044 ****
                              goto fail1;
                            quotient = expand_shift
                              (RSHIFT_EXPR, compute_mode, t2,
!                              build_int_cst (NULL_TREE, post_shift),
!                              tquotient, 1);
                          }
                      }
                  }
--- 4018,4024 ----
                              goto fail1;
                            quotient = expand_shift
                              (RSHIFT_EXPR, compute_mode, t2,
!                              post_shift, tquotient, 1);
                          }
                      }
                  }
*************** expand_divmod (int rem_flag, enum tree_c
*** 4170,4181 ****
                          goto fail1;
                        t2 = expand_shift
                          (RSHIFT_EXPR, compute_mode, t1,
!                          build_int_cst (NULL_TREE, post_shift),
!                          NULL_RTX, 0);
                        t3 = expand_shift
                          (RSHIFT_EXPR, compute_mode, op0,
!                          build_int_cst (NULL_TREE, size - 1),
!                          NULL_RTX, 0);
                        if (d < 0)
                          quotient
                            = force_operand (gen_rtx_MINUS (compute_mode,
--- 4150,4159 ----
                          goto fail1;
                        t2 = expand_shift
                          (RSHIFT_EXPR, compute_mode, t1,
!                          post_shift, NULL_RTX, 0);
                        t3 = expand_shift
                          (RSHIFT_EXPR, compute_mode, op0,
!                          size - 1, NULL_RTX, 0);
                        if (d < 0)
                          quotient
                            = force_operand (gen_rtx_MINUS (compute_mode,
*************** expand_divmod (int rem_flag, enum tree_c
*** 4210,4221 ****
                                            NULL_RTX);
                        t3 = expand_shift
                          (RSHIFT_EXPR, compute_mode, t2,
!                          build_int_cst (NULL_TREE, post_shift),
!                          NULL_RTX, 0);
                        t4 = expand_shift
                          (RSHIFT_EXPR, compute_mode, op0,
!                          build_int_cst (NULL_TREE, size - 1),
!                          NULL_RTX, 0);
                        if (d < 0)
                          quotient
                            = force_operand (gen_rtx_MINUS (compute_mode,
--- 4188,4197 ----
                                            NULL_RTX);
                        t3 = expand_shift
                          (RSHIFT_EXPR, compute_mode, t2,
!                          post_shift, NULL_RTX, 0);
                        t4 = expand_shift
                          (RSHIFT_EXPR, compute_mode, op0,
!                          size - 1, NULL_RTX, 0);
                        if (d < 0)
                          quotient
                            = force_operand (gen_rtx_MINUS (compute_mode,
*************** expand_divmod (int rem_flag, enum tree_c
*** 4272,4279 ****
                      }
                    quotient = expand_shift
                      (RSHIFT_EXPR, compute_mode, op0,
!                      build_int_cst (NULL_TREE, pre_shift),
!                      tquotient, 0);
                  }
                else
                  {
--- 4248,4254 ----
                      }
                    quotient = expand_shift
                      (RSHIFT_EXPR, compute_mode, op0,
!                      pre_shift, tquotient, 0);
                  }
                else
                  {
*************** expand_divmod (int rem_flag, enum tree_c
*** 4288,4295 ****
                      {
                        t1 = expand_shift
                          (RSHIFT_EXPR, compute_mode, op0,
!                          build_int_cst (NULL_TREE, 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]
--- 4263,4269 ----
                      {
                        t1 = expand_shift
                          (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]
*************** expand_divmod (int rem_flag, enum tree_c
*** 4302,4309 ****
                          {
                            t4 = expand_shift
                              (RSHIFT_EXPR, compute_mode, t3,
!                              build_int_cst (NULL_TREE, post_shift),
!                              NULL_RTX, 1);
                            quotient = expand_binop (compute_mode, xor_optab,
                                                     t4, t1, tquotient, 0,
                                                     OPTAB_WIDEN);
--- 4276,4282 ----
                          {
                            t4 = expand_shift
                              (RSHIFT_EXPR, compute_mode, t3,
!                              post_shift, NULL_RTX, 1);
                            quotient = expand_binop (compute_mode, xor_optab,
                                                     t4, t1, tquotient, 0,
                                                     OPTAB_WIDEN);
*************** expand_divmod (int rem_flag, enum tree_c
*** 4320,4327 ****
                                   0, OPTAB_WIDEN);
                nsign = expand_shift
                  (RSHIFT_EXPR, compute_mode, t2,
!                  build_int_cst (NULL_TREE, size - 1),
!                  NULL_RTX, 0);
                t3 = force_operand (gen_rtx_MINUS (compute_mode, t1, nsign),
                                    NULL_RTX);
                t4 = expand_divmod (0, TRUNC_DIV_EXPR, compute_mode, t3, op1,
--- 4293,4299 ----
                                   0, OPTAB_WIDEN);
                nsign = expand_shift
                  (RSHIFT_EXPR, compute_mode, t2,
!                  size - 1, NULL_RTX, 0);
                t3 = force_operand (gen_rtx_MINUS (compute_mode, t1, nsign),
                                    NULL_RTX);
                t4 = expand_divmod (0, TRUNC_DIV_EXPR, compute_mode, t3, op1,
*************** expand_divmod (int rem_flag, enum tree_c
*** 4435,4442 ****
                rtx t1, t2, t3;
                unsigned HOST_WIDE_INT d = INTVAL (op1);
                t1 = expand_shift (RSHIFT_EXPR, compute_mode, op0,
!                                  build_int_cst (NULL_TREE, floor_log2 (d)),
!                                  tquotient, 1);
                t2 = expand_binop (compute_mode, and_optab, op0,
                                   GEN_INT (d - 1),
                                   NULL_RTX, 1, OPTAB_LIB_WIDEN);
--- 4407,4413 ----
                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),
                                   NULL_RTX, 1, OPTAB_LIB_WIDEN);
*************** expand_divmod (int rem_flag, enum tree_c
*** 4533,4540 ****
                rtx t1, t2, t3;
                unsigned HOST_WIDE_INT d = INTVAL (op1);
                t1 = expand_shift (RSHIFT_EXPR, compute_mode, op0,
!                                  build_int_cst (NULL_TREE, floor_log2 (d)),
!                                  tquotient, 0);
                t2 = expand_binop (compute_mode, and_optab, op0,
                                   GEN_INT (d - 1),
                                   NULL_RTX, 1, OPTAB_LIB_WIDEN);
--- 4504,4510 ----
                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),
                                   NULL_RTX, 1, OPTAB_LIB_WIDEN);
*************** expand_divmod (int rem_flag, enum tree_c
*** 4655,4662 ****
            pre_shift = floor_log2 (d & -d);
            ml = invert_mod2n (d >> pre_shift, size);
            t1 = expand_shift (RSHIFT_EXPR, compute_mode, op0,
!                              build_int_cst (NULL_TREE, pre_shift),
!                              NULL_RTX, unsignedp);
            quotient = expand_mult (compute_mode, t1,
                                    gen_int_mode (ml, compute_mode),
                                    NULL_RTX, 1);
--- 4625,4631 ----
            pre_shift = floor_log2 (d & -d);
            ml = invert_mod2n (d >> pre_shift, size);
            t1 = expand_shift (RSHIFT_EXPR, compute_mode, op0,
!                              pre_shift, NULL_RTX, unsignedp);
            quotient = expand_mult (compute_mode, t1,
                                    gen_int_mode (ml, compute_mode),
                                    NULL_RTX, 1);
*************** expand_divmod (int rem_flag, enum tree_c
*** 4689,4696 ****
                                          remainder, 1, OPTAB_LIB_WIDEN);
              }
            tem = plus_constant (op1, -1);
!           tem = expand_shift (RSHIFT_EXPR, compute_mode, tem,
!                               integer_one_node, NULL_RTX, 1);
            do_cmp_and_jump (remainder, tem, LEU, compute_mode, label);
            expand_inc (quotient, const1_rtx);
            expand_dec (remainder, op1);
--- 4658,4664 ----
                                          remainder, 1, OPTAB_LIB_WIDEN);
              }
            tem = plus_constant (op1, -1);
!           tem = expand_shift (RSHIFT_EXPR, compute_mode, tem, 1, NULL_RTX, 1);
            do_cmp_and_jump (remainder, tem, LEU, compute_mode, label);
            expand_inc (quotient, const1_rtx);
            expand_dec (remainder, op1);
*************** expand_divmod (int rem_flag, enum tree_c
*** 4715,4727 ****
            abs_rem = expand_abs (compute_mode, remainder, NULL_RTX, 1, 0);
            abs_op1 = expand_abs (compute_mode, op1, NULL_RTX, 1, 0);
            tem = expand_shift (LSHIFT_EXPR, compute_mode, abs_rem,
!                               integer_one_node, NULL_RTX, 1);
            do_cmp_and_jump (tem, abs_op1, LTU, compute_mode, label);
            tem = expand_binop (compute_mode, xor_optab, op0, op1,
                                NULL_RTX, 0, OPTAB_WIDEN);
            mask = expand_shift (RSHIFT_EXPR, compute_mode, tem,
!                                build_int_cst (NULL_TREE, size - 1),
!                                NULL_RTX, 0);
            tem = expand_binop (compute_mode, xor_optab, mask, const1_rtx,
                                NULL_RTX, 0, OPTAB_WIDEN);
            tem = expand_binop (compute_mode, sub_optab, tem, mask,
--- 4683,4694 ----
            abs_rem = expand_abs (compute_mode, remainder, NULL_RTX, 1, 0);
            abs_op1 = expand_abs (compute_mode, op1, NULL_RTX, 1, 0);
            tem = expand_shift (LSHIFT_EXPR, compute_mode, abs_rem,
!                               1, NULL_RTX, 1);
            do_cmp_and_jump (tem, abs_op1, LTU, compute_mode, label);
            tem = expand_binop (compute_mode, xor_optab, op0, op1,
                                NULL_RTX, 0, OPTAB_WIDEN);
            mask = expand_shift (RSHIFT_EXPR, compute_mode, tem,
!                                size - 1, NULL_RTX, 0);
            tem = expand_binop (compute_mode, xor_optab, mask, const1_rtx,
                                NULL_RTX, 0, OPTAB_WIDEN);
            tem = expand_binop (compute_mode, sub_optab, tem, mask,
*************** emit_cstore (rtx target, enum insn_code
*** 5090,5096 ****
           && (STORE_FLAG_VALUE
               & ((HOST_WIDE_INT) 1 << (GET_MODE_BITSIZE (result_mode) - 1))))
      op0 = expand_shift (RSHIFT_EXPR, result_mode, op0,
!                       size_int (GET_MODE_BITSIZE (result_mode) - 1), 
subtarget,
                        normalizep == 1);
    else
      {
--- 5057,5063 ----
           && (STORE_FLAG_VALUE
               & ((HOST_WIDE_INT) 1 << (GET_MODE_BITSIZE (result_mode) - 1))))
      op0 = expand_shift (RSHIFT_EXPR, result_mode, op0,
!                       GET_MODE_BITSIZE (result_mode) - 1, subtarget,
                        normalizep == 1);
    else
      {
*************** emit_store_flag_1 (rtx target, enum rtx_
*** 5270,5276 ****
           a logical shift from the sign bit to the low-order bit; for
           a -1/0 value, we do an arithmetic shift.  */
        op0 = expand_shift (RSHIFT_EXPR, mode, op0,
!                           size_int (GET_MODE_BITSIZE (mode) - 1),
                            subtarget, normalizep != -1);
  
        if (mode != target_mode)
--- 5237,5243 ----
           a logical shift from the sign bit to the low-order bit; for
           a -1/0 value, we do an arithmetic shift.  */
        op0 = expand_shift (RSHIFT_EXPR, mode, op0,
!                           GET_MODE_BITSIZE (mode) - 1,
                            subtarget, normalizep != -1);
  
        if (mode != target_mode)
*************** emit_store_flag (rtx target, enum rtx_co
*** 5555,5561 ****
        subtarget = 0;
  
        tem = expand_shift (RSHIFT_EXPR, mode, op0,
!                         size_int (GET_MODE_BITSIZE (mode) - 1),
                          subtarget, 0);
        tem = expand_binop (mode, sub_optab, tem, op0, subtarget, 0,
                          OPTAB_WIDEN);
--- 5522,5528 ----
        subtarget = 0;
  
        tem = expand_shift (RSHIFT_EXPR, mode, op0,
!                         GET_MODE_BITSIZE (mode) - 1,
                          subtarget, 0);
        tem = expand_binop (mode, sub_optab, tem, op0, subtarget, 0,
                          OPTAB_WIDEN);
*************** emit_store_flag (rtx target, enum rtx_co
*** 5621,5627 ****
  
    if (tem && normalizep)
      tem = expand_shift (RSHIFT_EXPR, mode, tem,
!                       size_int (GET_MODE_BITSIZE (mode) - 1),
                        subtarget, normalizep == 1);
  
    if (tem)
--- 5588,5594 ----
  
    if (tem && normalizep)
      tem = expand_shift (RSHIFT_EXPR, mode, tem,
!                       GET_MODE_BITSIZE (mode) - 1,
                        subtarget, normalizep == 1);
  
    if (tem)
Index: gcc/builtins.c
===================================================================
*** gcc/builtins.c      (revision 173151)
--- gcc/builtins.c      (working copy)
*************** expand_builtin_signbit (tree exp, rtx ta
*** 5423,5430 ****
        /* Perform a logical right shift to place the signbit in the least
         significant bit, then truncate the result to the desired mode
         and mask just this bit.  */
!       temp = expand_shift (RSHIFT_EXPR, imode, temp,
!                          build_int_cst (NULL_TREE, bitpos), NULL_RTX, 1);
        temp = gen_lowpart (rmode, temp);
        temp = expand_binop (rmode, and_optab, temp, const1_rtx,
                           NULL_RTX, 1, OPTAB_LIB_WIDEN);
--- 5423,5429 ----
        /* Perform a logical right shift to place the signbit in the least
         significant bit, then truncate the result to the desired mode
         and mask just this bit.  */
!       temp = expand_shift (RSHIFT_EXPR, imode, temp, bitpos, NULL_RTX, 1);
        temp = gen_lowpart (rmode, temp);
        temp = expand_binop (rmode, and_optab, temp, const1_rtx,
                           NULL_RTX, 1, OPTAB_LIB_WIDEN);
Index: gcc/calls.c
===================================================================
*** gcc/calls.c (revision 173151)
--- gcc/calls.c (working copy)
*************** load_register_parameters (struct arg_dat
*** 1668,1676 ****
                     call only uses SIZE bytes at the msb end, but it doesn't
                     seem worth generating rtl to say that.  */
                  reg = gen_rtx_REG (word_mode, REGNO (reg));
!                 x = expand_shift (LSHIFT_EXPR, word_mode, reg,
!                                   build_int_cst (NULL_TREE, shift),
!                                   reg, 1);
                  if (x != reg)
                    emit_move_insn (reg, x);
                }
--- 1668,1674 ----
                     call only uses SIZE bytes at the msb end, but it doesn't
                     seem worth generating rtl to say that.  */
                  reg = gen_rtx_REG (word_mode, REGNO (reg));
!                 x = expand_shift (LSHIFT_EXPR, word_mode, reg, shift, reg, 1);
                  if (x != reg)
                    emit_move_insn (reg, x);
                }
*************** load_register_parameters (struct arg_dat
*** 1714,1722 ****
                                                        : LSHIFT_EXPR;
  
                  emit_move_insn (x, tem);
!                 x = expand_shift (dir, word_mode, x,
!                                   build_int_cst (NULL_TREE, shift),
!                                   ri, 1);
                  if (x != ri)
                    emit_move_insn (ri, x);
                }
--- 1712,1718 ----
                                                        : LSHIFT_EXPR;
  
                  emit_move_insn (x, tem);
!                 x = expand_shift (dir, word_mode, x, shift, ri, 1);
                  if (x != ri)
                    emit_move_insn (ri, x);
                }
Index: gcc/function.c
===================================================================
*** gcc/function.c      (revision 173151)
--- gcc/function.c      (working copy)
*************** assign_parm_setup_block (struct assign_p
*** 2876,2884 ****
              int by = (UNITS_PER_WORD - size) * BITS_PER_UNIT;
              rtx reg = gen_rtx_REG (word_mode, REGNO (entry_parm));
  
!             x = expand_shift (LSHIFT_EXPR, word_mode, reg,
!                               build_int_cst (NULL_TREE, by),
!                               NULL_RTX, 1);
              tem = change_address (mem, word_mode, 0);
              emit_move_insn (tem, x);
            }
--- 2876,2882 ----
              int by = (UNITS_PER_WORD - size) * BITS_PER_UNIT;
              rtx reg = gen_rtx_REG (word_mode, REGNO (entry_parm));
  
!             x = expand_shift (LSHIFT_EXPR, word_mode, reg, by, NULL_RTX, 1);
              tem = change_address (mem, word_mode, 0);
              emit_move_insn (tem, x);
            }
Index: gcc/lower-subreg.c
===================================================================
*** gcc/lower-subreg.c  (revision 173151)
--- gcc/lower-subreg.c  (working copy)
*************** resolve_shift_zext (rtx insn)
*** 1039,1046 ****
        src_reg = expand_shift (GET_CODE (op) == ASHIFT ?
                                LSHIFT_EXPR : RSHIFT_EXPR,
                                word_mode, src_reg,
!                               build_int_cst (NULL_TREE,
!                                              shift_count - BITS_PER_WORD),
                                dest_reg, 1);
      }
  
--- 1039,1045 ----
        src_reg = expand_shift (GET_CODE (op) == ASHIFT ?
                                LSHIFT_EXPR : RSHIFT_EXPR,
                                word_mode, src_reg,
!                               shift_count - BITS_PER_WORD,
                                dest_reg, 1);
      }
  
Index: gcc/optabs.c
===================================================================
*** gcc/optabs.c        (revision 173151)
--- gcc/optabs.c        (working copy)
*************** widen_bswap (enum machine_mode mode, rtx
*** 2453,2460 ****
  
    if (x != 0)
      x = expand_shift (RSHIFT_EXPR, wider_mode, x,
!                     size_int (GET_MODE_BITSIZE (wider_mode)
!                               - GET_MODE_BITSIZE (mode)),
                      NULL_RTX, true);
  
    if (x != 0)
--- 2453,2460 ----
  
    if (x != 0)
      x = expand_shift (RSHIFT_EXPR, wider_mode, x,
!                     GET_MODE_BITSIZE (wider_mode)
!                     - GET_MODE_BITSIZE (mode),
                      NULL_RTX, true);
  
    if (x != 0)
*************** expand_abs_nojump (enum machine_mode mod
*** 3150,3156 ****
                      false) >= 2)
      {
        rtx extended = expand_shift (RSHIFT_EXPR, mode, op0,
!                                  size_int (GET_MODE_BITSIZE (mode) - 1),
                                   NULL_RTX, 0);
  
        temp = expand_binop (mode, xor_optab, extended, op0, target, 0,
--- 3150,3156 ----
                      false) >= 2)
      {
        rtx extended = expand_shift (RSHIFT_EXPR, mode, op0,
!                                  GET_MODE_BITSIZE (mode) - 1,
                                   NULL_RTX, 0);
  
        temp = expand_binop (mode, xor_optab, extended, op0, target, 0,
*************** expand_one_cmpl_abs_nojump (enum machine
*** 3251,3257 ****
                     false) >= 2)
      {
        rtx extended = expand_shift (RSHIFT_EXPR, mode, op0,
!                                  size_int (GET_MODE_BITSIZE (mode) - 1),
                                   NULL_RTX, 0);
  
        temp = expand_binop (mode, xor_optab, extended, op0, target, 0,
--- 3251,3257 ----
                     false) >= 2)
      {
        rtx extended = expand_shift (RSHIFT_EXPR, mode, op0,
!                                  GET_MODE_BITSIZE (mode) - 1,
                                   NULL_RTX, 0);
  
        temp = expand_binop (mode, xor_optab, extended, op0, target, 0,
*************** expand_float (rtx to, rtx from, int unsi
*** 4724,4731 ****
              emit_label (neglabel);
              temp = expand_binop (imode, and_optab, from, const1_rtx,
                                   NULL_RTX, 1, OPTAB_LIB_WIDEN);
!             temp1 = expand_shift (RSHIFT_EXPR, imode, from, integer_one_node,
!                                   NULL_RTX, 1);
              temp = expand_binop (imode, ior_optab, temp, temp1, temp, 1,
                                   OPTAB_LIB_WIDEN);
              expand_float (target, temp, 0);
--- 4724,4730 ----
              emit_label (neglabel);
              temp = expand_binop (imode, and_optab, from, const1_rtx,
                                   NULL_RTX, 1, OPTAB_LIB_WIDEN);
!             temp1 = expand_shift (RSHIFT_EXPR, imode, from, 1, NULL_RTX, 1);
              temp = expand_binop (imode, ior_optab, temp, temp1, temp, 1,
                                   OPTAB_LIB_WIDEN);
              expand_float (target, temp, 0);
Index: gcc/config/spu/spu.c
===================================================================
*** gcc/config/spu/spu.c        (revision 173151)
--- gcc/config/spu/spu.c        (working copy)
*************** spu_expand_extv (rtx ops[], int unsigned
*** 748,757 ****
      emit_insn (gen_rotlti3 (s0, s0, GEN_INT (start)));
  
    if (128 - width)
!     {
!       tree c = build_int_cst (NULL_TREE, 128 - width);
!       s0 = expand_shift (RSHIFT_EXPR, TImode, s0, c, s0, unsignedp);
!     }
  
    emit_move_insn (dst, s0);
  }
--- 748,754 ----
      emit_insn (gen_rotlti3 (s0, s0, GEN_INT (start)));
  
    if (128 - width)
!     s0 = expand_shift (RSHIFT_EXPR, TImode, s0, 128 - width, s0, unsignedp);
  
    emit_move_insn (dst, s0);
  }
Index: gcc/config/sparc/sparc.c
===================================================================
*** gcc/config/sparc/sparc.c    (revision 173151)
--- gcc/config/sparc/sparc.c    (working copy)
*************** sparc32_initialize_trampoline (rtx m_tra
*** 7836,7851 ****
    emit_move_insn
      (adjust_address (m_tramp, SImode, 0),
       expand_binop (SImode, ior_optab,
!                  expand_shift (RSHIFT_EXPR, SImode, fnaddr,
!                                size_int (10), 0, 1),
                   GEN_INT (trunc_int_for_mode (0x03000000, SImode)),
                   NULL_RTX, 1, OPTAB_DIRECT));
  
    emit_move_insn
      (adjust_address (m_tramp, SImode, 4),
       expand_binop (SImode, ior_optab,
!                  expand_shift (RSHIFT_EXPR, SImode, cxt,
!                                size_int (10), 0, 1),
                   GEN_INT (trunc_int_for_mode (0x05000000, SImode)),
                   NULL_RTX, 1, OPTAB_DIRECT));
  
--- 7836,7849 ----
    emit_move_insn
      (adjust_address (m_tramp, SImode, 0),
       expand_binop (SImode, ior_optab,
!                  expand_shift (RSHIFT_EXPR, SImode, fnaddr, 10, 0, 1),
                   GEN_INT (trunc_int_for_mode (0x03000000, SImode)),
                   NULL_RTX, 1, OPTAB_DIRECT));
  
    emit_move_insn
      (adjust_address (m_tramp, SImode, 4),
       expand_binop (SImode, ior_optab,
!                  expand_shift (RSHIFT_EXPR, SImode, cxt, 10, 0, 1),
                   GEN_INT (trunc_int_for_mode (0x05000000, SImode)),
                   NULL_RTX, 1, OPTAB_DIRECT));
  

Reply via email to