This is the mail archive of the gcc-help@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]

Re: Cross compiler Alpha->powerpc problems


Alexandre Oliva wrote:
> 
> On Mar 27, 2001, Bob Koninckx <bob.koninckx@mech.kuleuven.ac.be> wrote:
> 
> > I suppose your patch does not break Red Hat Linux.
> 
> Do you mean Red Hat Linux for alpha?  Yes, I've tested the patch I
> posted, and it does work.  But it would break on x86, without a minor
> update.
> 
> > Any chance that I can get it??
> 
> Only if you promise to let me know of any problems that might show up
> on alpha-x-ppc.  Or, even better, if it ``just works'' :-)
> 
> Here's the latest patch, tested with bootstrap on alpha, sparc and
> x86, and failed bootstrap on pa.
> 
>   ------------------------------------------------------------------------
> Index: gcc/ChangeLog
> from  Alexandre Oliva  <aoliva@redhat.com>
> 
>         * recog.c (general_operand, immediate_operand,
>         nonmemory_operand): Require CONST_INTs to be sign-extended
>         values for their modes.
>         * combine.c (try_combine): Avoid generating a new set in i2
>         that changes the expected mode of a CONST_INT.
>         * expmed.c (store_bit_field): Truncate CONST_INTs.
>         (expand_mult_highpart, expand_divmod): Likewise.
>         * expr.c (convert_modes, store_field): Likewise.
>         * integrate.c (expand_inline_function): Use promote_mode() to
>         determine whether to convert_modes() an argument as signed
>         or unsigned.
>         * optabs.c (expand_binon): Get CONST_INT operands
>         sign-extended for their appropriate modes.
>         * stmt.c (emit_case_nodes): Convert node values to the
>         appropriate mode.
>         * unroll.c (loop_iterations): Truncate abs_diff to the mode of
>         the iteration variable.
>         * varasm.c (immed_double_const): Don't require words to be
>         narrower than host wide ints to properly sign-extend
>         CONST_INTs.
> 
> Index: gcc/combine.c
> ===================================================================
> RCS file: /cvs/gcc/egcs/gcc/combine.c,v
> retrieving revision 1.183.2.2
> diff -u -p -r1.183.2.2 combine.c
> --- gcc/combine.c 2001/03/15 19:01:56 1.183.2.2
> +++ gcc/combine.c 2001/03/22 04:40:30
> @@ -2270,14 +2270,27 @@ try_combine (i3, i2, i1, new_direct_jump
>                                             XEXP (*split, 0)));
>  #endif
> 
> -         newi2pat = gen_rtx_combine (SET, VOIDmode, newdest, *split);
> -         SUBST (*split, newdest);
> -         i2_code_number = recog_for_combine (&newi2pat, i2, &new_i2_notes);
> -
>           /* If the split point was a MULT and we didn't have one before,
>              don't use one now.  */
> -         if (i2_code_number >= 0 && ! (split_code == MULT && ! have_mult))
> +         if (! (split_code == MULT && ! have_mult))
>             insn_code_number = recog_for_combine (&newpat, i3, &new_i3_notes);
> +         else
> +           insn_code_number = -1;
> +
> +         /* We want to test newi2pat only if the combination for i3
> +            would have worked.  This prevents us from generating i2
> +            as a set from a CONST_INT to a register in the wrong
> +            mode, in case i3 is a comparison in a certain mode whose
> +            result is in a different mode.  */
> +         if (insn_code_number >= 0)
> +           {
> +             newi2pat = gen_rtx_combine (SET, VOIDmode, newdest, *split);
> +             SUBST (*split, newdest);
> +             i2_code_number = recog_for_combine (&newi2pat, i2,
> +                                                 &new_i2_notes);
> +           }
> +         else
> +           i2_code_number = -1;
>         }
>      }
> 
> Index: gcc/expmed.c
> ===================================================================
> RCS file: /cvs/gcc/egcs/gcc/expmed.c,v
> retrieving revision 1.76
> diff -u -p -r1.76 expmed.c
> --- gcc/expmed.c 2001/01/31 19:05:49 1.76
> +++ gcc/expmed.c 2001/03/22 04:40:33
> @@ -589,6 +589,8 @@ store_bit_field (str_rtx, bitsize, bitnu
>               else
>                 value1 = gen_lowpart (maxmode, value1);
>             }
> +         else if (GET_CODE (value) == CONST_INT)
> +           value1 = GEN_INT (trunc_int_for_mode (INTVAL (value), maxmode));
>           else if (!CONSTANT_P (value))
>             /* Parse phase is supposed to make VALUE's data type
>                match that of the component reference, which is a type
> @@ -2782,7 +2784,7 @@ expand_mult_highpart (mode, op0, cnst1,
>    if (size > HOST_BITS_PER_WIDE_INT)
>      abort ();
> 
> -  op1 = GEN_INT (cnst1);
> +  op1 = GEN_INT (trunc_int_for_mode (cnst1, mode));
> 
>    if (GET_MODE_BITSIZE (wider_mode) <= HOST_BITS_PER_INT)
>      wide_op1 = op1;
> @@ -3269,7 +3271,7 @@ expand_divmod (rem_flag, code, mode, op0
>                 if (rem_flag && d < 0)
>                   {
>                     d = abs_d;
> -                   op1 = GEN_INT (abs_d);
> +                   op1 = GEN_INT (trunc_int_for_mode (abs_d, compute_mode));
>                   }
> 
>                 if (d == 1)
> @@ -3299,7 +3301,8 @@ expand_divmod (rem_flag, code, mode, op0
>                         t1 = copy_to_mode_reg (compute_mode, op0);
>                         do_cmp_and_jump (t1, const0_rtx, GE,
>                                          compute_mode, label);
> -                       expand_inc (t1, GEN_INT (abs_d - 1));
> +                       expand_inc (t1, GEN_INT (trunc_int_for_mode
> +                                                (abs_d - 1, compute_mode)));
>                         emit_label (label);
>                         quotient = expand_shift (RSHIFT_EXPR, compute_mode, t1,
>                                                  build_int_2 (lgup, 0),
> @@ -3336,7 +3339,10 @@ expand_divmod (rem_flag, code, mode, op0
>                                                REG_EQUAL,
>                                                gen_rtx_DIV (compute_mode,
>                                                             op0,
> -                                                           GEN_INT (abs_d)));
> +                                                           GEN_INT
> +                                                           (trunc_int_for_mode
> +                                                            (abs_d,
> +                                                             compute_mode))));
> 
>                         quotient = expand_unop (compute_mode, neg_optab,
>                                                 quotient, quotient, 0);
> @@ -3835,8 +3841,10 @@ expand_divmod (rem_flag, code, mode, op0
>             ml = invert_mod2n (d >> pre_shift, size);
>             t1 = expand_shift (RSHIFT_EXPR, compute_mode, op0,
>                                build_int_2 (pre_shift, 0), NULL_RTX, unsignedp);
> -           quotient = expand_mult (compute_mode, t1, GEN_INT (ml), NULL_RTX,
> -                                   0);
> +           quotient = expand_mult (compute_mode, t1,
> +                                   GEN_INT (trunc_int_for_mode
> +                                            (ml, compute_mode)),
> +                                   NULL_RTX, 0);
> 
>             insn = get_last_insn ();
>             set_unique_reg_note (insn,
> Index: gcc/expr.c
> ===================================================================
> RCS file: /cvs/gcc/egcs/gcc/expr.c,v
> retrieving revision 1.295.2.4
> diff -u -p -r1.295.2.4 expr.c
> --- gcc/expr.c 2001/03/15 19:01:59 1.295.2.4
> +++ gcc/expr.c 2001/03/22 04:40:35
> @@ -1374,7 +1374,7 @@ convert_modes (mode, oldmode, x, unsigne
>               && (val & ((HOST_WIDE_INT) 1 << (width - 1))))
>             val |= (HOST_WIDE_INT) (-1) << width;
> 
> -         return GEN_INT (val);
> +         return GEN_INT (trunc_int_for_mode (val, mode));
>         }
> 
>        return gen_lowpart (mode, x);
> @@ -5166,7 +5166,13 @@ store_field (target, bitsize, bitpos, mo
>               enum machine_mode tmode;
> 
>               if (unsignedp)
> -               return expand_and (temp, GEN_INT (width_mask), NULL_RTX);
> +               return expand_and (temp,
> +                                  GEN_INT
> +                                  (trunc_int_for_mode
> +                                   (width_mask,
> +                                    GET_MODE (temp) == VOIDmode
> +                                    ? value_mode
> +                                    : GET_MODE (temp))), NULL_RTX);
>               tmode = GET_MODE (temp);
>               if (tmode == VOIDmode)
>                 tmode = value_mode;
> Index: gcc/integrate.c
> ===================================================================
> RCS file: /cvs/gcc/egcs/gcc/integrate.c,v
> retrieving revision 1.126.4.4
> diff -u -p -r1.126.4.4 integrate.c
> --- gcc/integrate.c 2001/03/14 18:26:31 1.126.4.4
> +++ gcc/integrate.c 2001/03/22 04:40:36
> @@ -722,13 +722,24 @@ expand_inline_function (fndecl, parms, t
>        else if (GET_CODE (loc) != MEM)
>         {
>           if (GET_MODE (loc) != TYPE_MODE (TREE_TYPE (arg)))
> -           /* The mode if LOC and ARG can differ if LOC was a variable
> -              that had its mode promoted via PROMOTED_MODE.  */
> -           arg_vals[i] = convert_modes (GET_MODE (loc),
> -                                        TYPE_MODE (TREE_TYPE (arg)),
> -                                        expand_expr (arg, NULL_RTX, mode,
> -                                                     EXPAND_SUM),
> -                                        TREE_UNSIGNED (TREE_TYPE (formal)));
> +           {
> +             int unsignedp = TREE_UNSIGNED (TREE_TYPE (formal));
> +             enum machine_mode pmode = TYPE_MODE (TREE_TYPE (formal));
> +
> +             pmode = promote_mode (TREE_TYPE (formal), pmode,
> +                                   &unsignedp, 0);
> +
> +             if (GET_MODE (loc) != pmode)
> +               abort ();
> +
> +             /* The mode if LOC and ARG can differ if LOC was a variable
> +                that had its mode promoted via PROMOTED_MODE.  */
> +             arg_vals[i] = convert_modes (pmode,
> +                                          TYPE_MODE (TREE_TYPE (arg)),
> +                                          expand_expr (arg, NULL_RTX, mode,
> +                                                       EXPAND_SUM),
> +                                          unsignedp);
> +           }
>           else
>             arg_vals[i] = expand_expr (arg, NULL_RTX, mode, EXPAND_SUM);
>         }
> Index: gcc/optabs.c
> ===================================================================
> RCS file: /cvs/gcc/egcs/gcc/optabs.c,v
> retrieving revision 1.87
> diff -u -p -r1.87 optabs.c
> --- gcc/optabs.c 2001/01/28 01:50:06 1.87
> +++ gcc/optabs.c 2001/03/22 04:40:37
> @@ -724,17 +724,28 @@ expand_binop (mode, binoptab, op0, op1,
>         }
> 
>        /* In case the insn wants input operands in modes different from
> -        the result, convert the operands.  */
> +        the result, convert the operands.  It would seem that we
> +        don't need to convert CONST_INTs, but we do, so that they're
> +        a properly sign-extended for their modes.  Unless we're doing
> +        a widening conversion, in which case convert_to_mode might
> +        incorrectly zero-extend a constant, in case it is
> +        unsigned.  */
> 
> -      if (GET_MODE (op0) != VOIDmode
> -         && GET_MODE (op0) != mode0
> +      if (GET_MODE (op0) != mode0
>           && mode0 != VOIDmode)
> -       xop0 = convert_to_mode (mode0, xop0, unsignedp);
> +       xop0 = convert_modes (mode0,
> +                             GET_MODE (op0) != VOIDmode
> +                             ? GET_MODE (op0)
> +                             : mode0,
> +                             xop0, unsignedp);
> 
> -      if (GET_MODE (xop1) != VOIDmode
> -         && GET_MODE (xop1) != mode1
> +      if (GET_MODE (xop1) != mode1
>           && mode1 != VOIDmode)
> -       xop1 = convert_to_mode (mode1, xop1, unsignedp);
> +       xop1 = convert_modes (mode1,
> +                             GET_MODE (op1) != VOIDmode
> +                             ? GET_MODE (op1)
> +                             : mode1,
> +                             xop1, unsignedp);
> 
>        /* Now, if insn's predicates don't allow our operands, put them into
>          pseudo regs.  */
> @@ -4299,7 +4310,9 @@ expand_fix (to, from, unsignedp)
>                                  NULL_RTX, 0, OPTAB_LIB_WIDEN);
>           expand_fix (to, target, 0);
>           target = expand_binop (GET_MODE (to), xor_optab, to,
> -                                GEN_INT ((HOST_WIDE_INT) 1 << (bitsize - 1)),
> +                                GEN_INT (trunc_int_for_mode
> +                                         ((HOST_WIDE_INT) 1 << (bitsize - 1),
> +                                          GET_MODE (to))),
>                                  to, 1, OPTAB_LIB_WIDEN);
> 
>           if (target != to)
> Index: gcc/recog.c
> ===================================================================
> RCS file: /cvs/gcc/egcs/gcc/recog.c,v
> retrieving revision 1.87
> diff -u -p -r1.87 recog.c
> --- gcc/recog.c 2001/01/22 16:58:08 1.87
> +++ gcc/recog.c 2001/03/22 04:40:37
> @@ -1,6 +1,6 @@
>  /* Subroutines used by or related to instruction recognition.
>     Copyright (C) 1987, 1988, 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998
> -   1999, 2000 Free Software Foundation, Inc.
> +   1999, 2000, 2001 Free Software Foundation, Inc.
> 
>  This file is part of GNU CC.
> 
> @@ -1012,6 +1012,12 @@ general_operand (op, mode)
>        && GET_MODE_CLASS (mode) != MODE_PARTIAL_INT)
>      return 0;
> 
> +#ifdef ENABLE_CHECKING
> +  if (GET_CODE (op) == CONST_INT
> +      && trunc_int_for_mode (INTVAL (op), mode) != INTVAL (op))
> +    abort ();
> +#endif
> +
>    if (CONSTANT_P (op))
>      return ((GET_MODE (op) == VOIDmode || GET_MODE (op) == mode
>              || mode == VOIDmode)
> @@ -1195,6 +1201,12 @@ immediate_operand (op, mode)
>        && GET_MODE_CLASS (mode) != MODE_PARTIAL_INT)
>      return 0;
> 
> +#ifdef ENABLE_CHECKING
> +  if (GET_CODE (op) == CONST_INT
> +      && trunc_int_for_mode (INTVAL (op), mode) != INTVAL (op))
> +    abort ();
> +#endif
> +
>    /* Accept CONSTANT_P_RTX, since it will be gone by CSE1 and
>       result in 0/1.  It seems a safe assumption that this is
>       in range for everyone.  */
> @@ -1265,6 +1277,12 @@ nonmemory_operand (op, mode)
>           && GET_MODE_CLASS (mode) != MODE_INT
>           && GET_MODE_CLASS (mode) != MODE_PARTIAL_INT)
>         return 0;
> +
> +#ifdef ENABLE_CHECKING
> +      if (GET_CODE (op) == CONST_INT
> +         && trunc_int_for_mode (INTVAL (op), mode) != INTVAL (op))
> +       abort ();
> +#endif
> 
>        return ((GET_MODE (op) == VOIDmode || GET_MODE (op) == mode
>               || mode == VOIDmode)
> Index: gcc/stmt.c
> ===================================================================
> RCS file: /cvs/gcc/egcs/gcc/stmt.c,v
> retrieving revision 1.184.2.2
> diff -u -p -r1.184.2.2 stmt.c
> --- gcc/stmt.c 2001/03/14 18:26:32 1.184.2.2
> +++ gcc/stmt.c 2001/03/22 04:40:38
> @@ -1,6 +1,6 @@
>  /* Expands front end tree to back end RTL for GNU C-Compiler
>     Copyright (C) 1987, 1988, 1989, 1992, 1993, 1994, 1995, 1996, 1997,
> -   1998, 1999, 2000 Free Software Foundation, Inc.
> +   1998, 1999, 2000, 2001 Free Software Foundation, Inc.
> 
>  This file is part of GNU CC.
> 
> @@ -6152,6 +6152,7 @@ emit_case_nodes (index, node, default_la
>    /* If INDEX has an unsigned type, we must make unsigned branches.  */
>    int unsignedp = TREE_UNSIGNED (index_type);
>    enum machine_mode mode = GET_MODE (index);
> +  enum machine_mode imode = TYPE_MODE (index_type);
> 
>    /* See if our parents have already tested everything for us.
>       If they have, emit an unconditional jump for this node.  */
> @@ -6163,7 +6164,11 @@ emit_case_nodes (index, node, default_la
>        /* Node is single valued.  First see if the index expression matches
>          this node and then check our children, if any.  */
> 
> -      do_jump_if_equal (index, expand_expr (node->low, NULL_RTX, VOIDmode, 0),
> +      do_jump_if_equal (index,
> +                       convert_modes (mode, imode,
> +                                      expand_expr (node->low, NULL_RTX,
> +                                                   VOIDmode, 0),
> +                                      unsignedp),
>                         label_rtx (node->code_label), unsignedp);
> 
>        if (node->right != 0 && node->left != 0)
> @@ -6177,8 +6182,11 @@ emit_case_nodes (index, node, default_la
>           if (node_is_bounded (node->right, index_type))
>             {
>               emit_cmp_and_jump_insns (index,
> -                                      expand_expr (node->high, NULL_RTX,
> -                                                   VOIDmode, 0),
> +                                      convert_modes
> +                                      (mode, imode,
> +                                       expand_expr (node->high, NULL_RTX,
> +                                                    VOIDmode, 0),
> +                                       unsignedp),
>                                        GT, NULL_RTX, mode, unsignedp, 0,
>                                        label_rtx (node->right->code_label));
>               emit_case_nodes (index, node->left, default_label, index_type);
> @@ -6187,8 +6195,11 @@ emit_case_nodes (index, node, default_la
>           else if (node_is_bounded (node->left, index_type))
>             {
>               emit_cmp_and_jump_insns (index,
> -                                      expand_expr (node->high, NULL_RTX,
> -                                                   VOIDmode, 0),
> +                                      convert_modes
> +                                      (mode, imode,
> +                                       expand_expr (node->high, NULL_RTX,
> +                                                    VOIDmode, 0),
> +                                       unsignedp),
>                                        LT, NULL_RTX, mode, unsignedp, 0,
>                                        label_rtx (node->left->code_label));
>               emit_case_nodes (index, node->right, default_label, index_type);
> @@ -6203,8 +6214,11 @@ emit_case_nodes (index, node, default_la
> 
>               /* See if the value is on the right.  */
>               emit_cmp_and_jump_insns (index,
> -                                      expand_expr (node->high, NULL_RTX,
> -                                                   VOIDmode, 0),
> +                                      convert_modes
> +                                      (mode, imode,
> +                                       expand_expr (node->high, NULL_RTX,
> +                                                    VOIDmode, 0),
> +                                       unsignedp),
>                                        GT, NULL_RTX, mode, unsignedp, 0,
>                                        label_rtx (test_label));
> 
> @@ -6235,8 +6249,11 @@ emit_case_nodes (index, node, default_la
>               if (!node_has_low_bound (node, index_type))
>                 {
>                   emit_cmp_and_jump_insns (index,
> -                                          expand_expr (node->high, NULL_RTX,
> -                                                       VOIDmode, 0),
> +                                          convert_modes
> +                                          (mode, imode,
> +                                           expand_expr (node->high, NULL_RTX,
> +                                                        VOIDmode, 0),
> +                                           unsignedp),
>                                            LT, NULL_RTX, mode, unsignedp, 0,
>                                            default_label);
>                 }
> @@ -6248,8 +6265,11 @@ emit_case_nodes (index, node, default_la
>                since we haven't ruled out the numbers less than
>                this node's value.  So handle node->right explicitly.  */
>             do_jump_if_equal (index,
> -                             expand_expr (node->right->low, NULL_RTX,
> -                                          VOIDmode, 0),
> +                             convert_modes
> +                             (mode, imode,
> +                              expand_expr (node->right->low, NULL_RTX,
> +                                           VOIDmode, 0),
> +                              unsignedp),
>                               label_rtx (node->right->code_label), unsignedp);
>         }
> 
> @@ -6275,9 +6295,12 @@ emit_case_nodes (index, node, default_la
>             {
>               if (!node_has_high_bound (node, index_type))
>                 {
> -                 emit_cmp_and_jump_insns (index, expand_expr (node->high,
> -                                                              NULL_RTX,
> -                                                              VOIDmode, 0),
> +                 emit_cmp_and_jump_insns (index,
> +                                          convert_modes
> +                                          (mode, imode,
> +                                           expand_expr (node->high, NULL_RTX,
> +                                                        VOIDmode, 0),
> +                                           unsignedp),
>                                            GT, NULL_RTX, mode, unsignedp, 0,
>                                            default_label);
>                 }
> @@ -6289,8 +6312,11 @@ emit_case_nodes (index, node, default_la
>                since we haven't ruled out the numbers less than
>                this node's value.  So handle node->left explicitly.  */
>             do_jump_if_equal (index,
> -                             expand_expr (node->left->low, NULL_RTX,
> -                                          VOIDmode, 0),
> +                             convert_modes
> +                             (mode, imode,
> +                              expand_expr (node->left->low, NULL_RTX,
> +                                           VOIDmode, 0),
> +                              unsignedp),
>                               label_rtx (node->left->code_label), unsignedp);
>         }
>      }
> @@ -6312,8 +6338,12 @@ emit_case_nodes (index, node, default_la
>           if (node_is_bounded (node->right, index_type))
>             /* Right hand node is fully bounded so we can eliminate any
>                testing and branch directly to the target code.  */
> -           emit_cmp_and_jump_insns (index, expand_expr (node->high, NULL_RTX,
> -                                                        VOIDmode, 0),
> +           emit_cmp_and_jump_insns (index,
> +                                    convert_modes
> +                                    (mode, imode,
> +                                     expand_expr (node->high, NULL_RTX,
> +                                                  VOIDmode, 0),
> +                                     unsignedp),
>                                      GT, NULL_RTX, mode, unsignedp, 0,
>                                      label_rtx (node->right->code_label));
>           else
> @@ -6323,16 +6353,23 @@ emit_case_nodes (index, node, default_la
> 
>               test_label = build_decl (LABEL_DECL, NULL_TREE, NULL_TREE);
>               emit_cmp_and_jump_insns (index,
> -                                      expand_expr (node->high, NULL_RTX,
> -                                                   VOIDmode, 0),
> +                                      convert_modes
> +                                      (mode, imode,
> +                                       expand_expr (node->high, NULL_RTX,
> +                                                    VOIDmode, 0),
> +                                       unsignedp),
>                                        GT, NULL_RTX, mode, unsignedp, 0,
>                                        label_rtx (test_label));
>             }
> 
>           /* Value belongs to this node or to the left-hand subtree.  */
> 
> -         emit_cmp_and_jump_insns (index, expand_expr (node->low, NULL_RTX,
> -                                                      VOIDmode, 0),
> +         emit_cmp_and_jump_insns (index,
> +                                  convert_modes
> +                                  (mode, imode,
> +                                   expand_expr (node->low, NULL_RTX,
> +                                                VOIDmode, 0),
> +                                   unsignedp),
>                                    GE, NULL_RTX, mode, unsignedp, 0,
>                                    label_rtx (node->code_label));
> 
> @@ -6359,16 +6396,23 @@ emit_case_nodes (index, node, default_la
>           if (!node_has_low_bound (node, index_type))
>             {
>               emit_cmp_and_jump_insns (index,
> -                                      expand_expr (node->low, NULL_RTX,
> -                                                   VOIDmode, 0),
> +                                      convert_modes
> +                                      (mode, imode,
> +                                       expand_expr (node->low, NULL_RTX,
> +                                                    VOIDmode, 0),
> +                                       unsignedp),
>                                        LT, NULL_RTX, mode, unsignedp, 0,
>                                        default_label);
>             }
> 
>           /* Value belongs to this node or to the right-hand subtree.  */
> 
> -         emit_cmp_and_jump_insns (index, expand_expr (node->high, NULL_RTX,
> -                                                      VOIDmode, 0),
> +         emit_cmp_and_jump_insns (index,
> +                                  convert_modes
> +                                  (mode, imode,
> +                                   expand_expr (node->high, NULL_RTX,
> +                                                VOIDmode, 0),
> +                                   unsignedp),
>                                    LE, NULL_RTX, mode, unsignedp, 0,
>                                    label_rtx (node->code_label));
> 
> @@ -6382,8 +6426,11 @@ emit_case_nodes (index, node, default_la
>           if (!node_has_high_bound (node, index_type))
>             {
>               emit_cmp_and_jump_insns (index,
> -                                      expand_expr (node->high, NULL_RTX,
> -                                                   VOIDmode, 0),
> +                                      convert_modes
> +                                      (mode, imode,
> +                                       expand_expr (node->high, NULL_RTX,
> +                                                    VOIDmode, 0),
> +                                       unsignedp),
>                                        GT, NULL_RTX, mode, unsignedp, 0,
>                                        default_label);
>             }
> @@ -6391,8 +6438,11 @@ emit_case_nodes (index, node, default_la
>           /* Value belongs to this node or to the left-hand subtree.  */
> 
>           emit_cmp_and_jump_insns (index,
> -                                  expand_expr (node->low, NULL_RTX,
> -                                               VOIDmode, 0),
> +                                  convert_modes
> +                                  (mode, imode,
> +                                   expand_expr (node->low, NULL_RTX,
> +                                                VOIDmode, 0),
> +                                   unsignedp),
>                                    GE, NULL_RTX, mode, unsignedp, 0,
>                                    label_rtx (node->code_label));
> 
> @@ -6408,8 +6458,11 @@ emit_case_nodes (index, node, default_la
>           if (!node_has_high_bound (node, index_type))
>             {
>               emit_cmp_and_jump_insns (index,
> -                                      expand_expr (node->high, NULL_RTX,
> -                                                   VOIDmode, 0),
> +                                      convert_modes
> +                                      (mode, imode,
> +                                       expand_expr (node->high, NULL_RTX,
> +                                                    VOIDmode, 0),
> +                                       unsignedp),
>                                        GT, NULL_RTX, mode, unsignedp, 0,
>                                        default_label);
>             }
> @@ -6417,8 +6470,11 @@ emit_case_nodes (index, node, default_la
>           if (!node_has_low_bound (node, index_type))
>             {
>               emit_cmp_and_jump_insns (index,
> -                                      expand_expr (node->low, NULL_RTX,
> -                                                   VOIDmode, 0),
> +                                      convert_modes
> +                                      (mode, imode,
> +                                       expand_expr (node->low, NULL_RTX,
> +                                                    VOIDmode, 0),
> +                                       unsignedp),
>                                        LT, NULL_RTX, mode, unsignedp, 0,
>                                        default_label);
>             }
> Index: gcc/unroll.c
> ===================================================================
> RCS file: /cvs/gcc/egcs/gcc/unroll.c,v
> retrieving revision 1.125
> diff -u -p -r1.125 unroll.c
> --- gcc/unroll.c 2001/01/25 09:28:55 1.125
> +++ gcc/unroll.c 2001/03/22 04:40:39
> @@ -3962,6 +3962,8 @@ loop_iterations (loop)
>    else
>      abort ();
> 
> +  abs_diff = trunc_int_for_mode (abs_diff, GET_MODE (iteration_var));
> +
>    /* For NE tests, make sure that the iteration variable won't miss
>       the final value.  If abs_diff mod abs_incr is not zero, then the
>       iteration variable will overflow before the loop exits, and we
> Index: gcc/varasm.c
> ===================================================================
> RCS file: /cvs/gcc/egcs/gcc/varasm.c,v
> retrieving revision 1.161.2.5
> diff -u -p -r1.161.2.5 varasm.c
> --- gcc/varasm.c 2001/03/15 09:59:47 1.161.2.5
> +++ gcc/varasm.c 2001/03/22 04:40:40
> @@ -1989,7 +1989,7 @@ immed_double_const (i0, i1, mode)
>          represented as a 64 bit value -1, and not as 0x00000000ffffffff.
>          The later confuses the sparc backend.  */
> 
> -      if (BITS_PER_WORD < HOST_BITS_PER_WIDE_INT && BITS_PER_WORD == width
> +      if (width < HOST_BITS_PER_WIDE_INT
>           && (i0 & ((HOST_WIDE_INT) 1 << (width - 1))))
>         i0 |= ((HOST_WIDE_INT) (-1) << width);
> 
> 
>   ------------------------------------------------------------------------
> 
> --
> Alexandre Oliva   Enjoy Guarana', see http://www.ic.unicamp.br/~oliva/
> Red Hat GCC Developer                  aoliva@{cygnus.com, redhat.com}
> CS PhD student at IC-Unicamp        oliva@{lsd.ic.unicamp.br, gnu.org}
> Free Software Evangelist    *Please* write to mailing lists, not to me


Nope, build procedure (as described on the eCos site, without their
patch) dies. See attached build output. I used again gcc-2.95.3 to
compile the thing (snapshot 20010320 with your patch).

Thanks for all your help though.

Regards,
Bob


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]