recog.h (struct recog_data): Make dup_num...
authorRichard Henderson <rth@cygnus.com>
Tue, 14 Sep 1999 23:23:17 +0000 (16:23 -0700)
committerRichard Henderson <rth@gcc.gnu.org>
Tue, 14 Sep 1999 23:23:17 +0000 (16:23 -0700)
        * recog.h (struct recog_data): Make dup_num, operand_address_p,
        n_operands, n_dups, n_alternatives `char' instead of `unsigned char'.
        (struct insn_data): Likewise with n_operands, n_dups,
        n_alternatives, output_format.
        * regclass.c (scan_one_insn): Cast n_operands to int before
        arithmetic inside comparison.

From-SVN: r29413

gcc/ChangeLog
gcc/recog.h
gcc/regclass.c

index cdf1ee5..62d9e51 100644 (file)
@@ -1,3 +1,12 @@
+Tue Sep 14 16:20:24 1999  Richard Henderson  <rth@cygnus.com>
+
+       * recog.h (struct recog_data): Make dup_num, operand_address_p,
+       n_operands, n_dups, n_alternatives `char' instead of `unsigned char'.
+       (struct insn_data): Likewise with n_operands, n_dups, 
+       n_alternatives, output_format.
+       * regclass.c (scan_one_insn): Cast n_operands to int before
+       arithmetic inside comparison.
+
 Tue Sep 14 15:13:36 1999  Richard Henderson  <rth@cygnus.com>
 
        * toplev.c (compile_function): Unconditionally emit nop.
index e5875d5..869bb31 100644 (file)
@@ -156,21 +156,31 @@ struct recog_data
 
   /* Gives the operand number that was duplicated in the Nth
      duplicate-appearance of an operand.  */
-  unsigned char dup_num[MAX_DUP_OPERANDS];
+  char dup_num[MAX_DUP_OPERANDS];
 
 #ifndef REGISTER_CONSTRAINTS
   /* Nonzero if operand N should be an address.  */
-  unsigned char operand_address_p[MAX_RECOG_OPERANDS];
+  char operand_address_p[MAX_RECOG_OPERANDS];
 #endif
 
+  /* ??? Note that these are `char' instead of `unsigned char' to (try to)
+     avoid certain lossage from K&R C, wherein `unsigned char' default 
+     promotes to `unsigned int' instead of `int' as in ISO C.  As of 1999,
+     the most common places to bootstrap from K&R C are SunOS and HPUX,
+     both of which have signed characters by default.  The only other
+     supported natives that have both K&R C and unsigned characters are
+     ROMP and Irix 3, and neither have been seen for a while, but do
+     continue to consider unsignedness when performing arithmetic inside
+     a comparison.  */
+
   /* The number of operands of the insn.  */
-  unsigned char n_operands;
+  char n_operands;
 
   /* The number of MATCH_DUPs in the insn.  */
-  unsigned char n_dups;
+  char n_dups;
 
   /* The number of alternatives in the constraints for the insn.  */
-  unsigned char n_alternatives;
+  char n_alternatives;
 };
 
 extern struct recog_data recog_data;
@@ -225,10 +235,10 @@ struct insn_data
   insn_gen_fn genfun;
   const struct insn_operand_data *operand;
 
-  unsigned char n_operands;
-  unsigned char n_dups;
-  unsigned char n_alternatives;
-  unsigned char output_format;
+  char n_operands;
+  char n_dups;
+  char n_alternatives;
+  char output_format;
 };
 
 extern const struct insn_data insn_data[];
index 5867024..1963a95 100644 (file)
@@ -901,7 +901,7 @@ scan_one_insn (insn, pass)
      have been initialized.  We must do this even if one operand
      is a constant--see addsi3 in m68k.md.  */
 
-  for (i = 0; i < recog_data.n_operands - 1; i++)
+  for (i = 0; i < (int) recog_data.n_operands - 1; i++)
     if (constraints[i][0] == '%')
       {
        const char *xconstraints[MAX_RECOG_OPERANDS];