On Mon, Apr 21, 2014 at 05:51:04PM -0400, Michael Meissner wrote:
> On Mon, Apr 21, 2014 at 08:02:39PM +0200, Jakub Jelinek wrote:
> > Sure, we could change this to use mode_size_inline ((enum machine_mode) 
> > (MODE))
> > in the macro instead, but I'd say for GCC codebase it is better if we fix
> > the few users of these macros that pass an int rather than enum machine_mode
> > to these macros.
> 
> I fixed the powerpc (PR 60876), and while it would have been nice to have
> tested this against more backends, it was fairly simple to go through the
> GET_MODE_SIZE's and make them type correct.  For the PowerPC, it tended to be
> in code of the form:
> 
>       for (m = 0; m < NUM_MACHINE_MODES; ++m)
>         {
>           // ...
>           if (GET_MODE_SIZE (m)) ...
>         }
> 
> and the fix was to do something like:
> 
>       for (m = 0; m < NUM_MACHINE_MODES; ++m)
>         {
>           enum machine_mode m2 = (enum machine_mode)m;
>           // ...
>           if (GET_MODE_SIZE (m2)) ...
>         }
> 
> It reminds me when I was in the original ANSI C committee that made the 1989
> ANSI and 1990 ISO C standards, we debated making enum's more first class
> citizens, so you could do ++/-- on them, but the committee tended to be 
> divided
> into 3 camps, one that wanted to delete enums altogether, one that wanted them
> as int constants, and one that wanted more type checking.

I've committed following fix as obvious after testing it with a
x86_64->sparc64-linux cross-compiler.

2014-04-22  Jakub Jelinek  <ja...@redhat.com>

        PR target/60910
        * config/sparc/sparc.c (sparc_init_modes): Pass enum machine_mode
        value instead of int to GET_MODE_CLASS and GET_MODE_SIZE macros.

--- gcc/config/sparc/sparc.c.jj 2014-04-17 14:49:04.000000000 +0200
+++ gcc/config/sparc/sparc.c    2014-04-22 09:21:52.192036251 +0200
@@ -4821,47 +4821,48 @@ sparc_init_modes (void)
 
   for (i = 0; i < NUM_MACHINE_MODES; i++)
     {
-      switch (GET_MODE_CLASS (i))
+      enum machine_mode m = (enum machine_mode) i;
+      switch (GET_MODE_CLASS (m))
        {
        case MODE_INT:
        case MODE_PARTIAL_INT:
        case MODE_COMPLEX_INT:
-         if (GET_MODE_SIZE (i) < 4)
+         if (GET_MODE_SIZE (m) < 4)
            sparc_mode_class[i] = 1 << (int) H_MODE;
-         else if (GET_MODE_SIZE (i) == 4)
+         else if (GET_MODE_SIZE (m) == 4)
            sparc_mode_class[i] = 1 << (int) S_MODE;
-         else if (GET_MODE_SIZE (i) == 8)
+         else if (GET_MODE_SIZE (m) == 8)
            sparc_mode_class[i] = 1 << (int) D_MODE;
-         else if (GET_MODE_SIZE (i) == 16)
+         else if (GET_MODE_SIZE (m) == 16)
            sparc_mode_class[i] = 1 << (int) T_MODE;
-         else if (GET_MODE_SIZE (i) == 32)
+         else if (GET_MODE_SIZE (m) == 32)
            sparc_mode_class[i] = 1 << (int) O_MODE;
          else
            sparc_mode_class[i] = 0;
          break;
        case MODE_VECTOR_INT:
-         if (GET_MODE_SIZE (i) == 4)
+         if (GET_MODE_SIZE (m) == 4)
            sparc_mode_class[i] = 1 << (int) SF_MODE;
-         else if (GET_MODE_SIZE (i) == 8)
+         else if (GET_MODE_SIZE (m) == 8)
            sparc_mode_class[i] = 1 << (int) DF_MODE;
          else
            sparc_mode_class[i] = 0;
          break;
        case MODE_FLOAT:
        case MODE_COMPLEX_FLOAT:
-         if (GET_MODE_SIZE (i) == 4)
+         if (GET_MODE_SIZE (m) == 4)
            sparc_mode_class[i] = 1 << (int) SF_MODE;
-         else if (GET_MODE_SIZE (i) == 8)
+         else if (GET_MODE_SIZE (m) == 8)
            sparc_mode_class[i] = 1 << (int) DF_MODE;
-         else if (GET_MODE_SIZE (i) == 16)
+         else if (GET_MODE_SIZE (m) == 16)
            sparc_mode_class[i] = 1 << (int) TF_MODE;
-         else if (GET_MODE_SIZE (i) == 32)
+         else if (GET_MODE_SIZE (m) == 32)
            sparc_mode_class[i] = 1 << (int) OF_MODE;
          else
            sparc_mode_class[i] = 0;
          break;
        case MODE_CC:
-         if (i == (int) CCFPmode || i == (int) CCFPEmode)
+         if (m == CCFPmode || m == CCFPEmode)
            sparc_mode_class[i] = 1 << (int) CCFP_MODE;
          else
            sparc_mode_class[i] = 1 << (int) CC_MODE;


        Jakub

Reply via email to