This is the mail archive of the gcc-patches@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]
Other format: [Raw text]

Re: [PATCH] H8300 Shift Optimization


In message <69595093233BB547BB70CF5E492B63F26AD1C3@sohm.kpit.com>, "Dhananjay R
. Deshpande" writes:
 >Hi Jeff,
 >
 >I have implemented your suggestion for initializing shift_alg at startup and 
 >changing it for -Os.
 >
 >2002-09-03	Dhananjay Deshpande <dhananjayd@kpit.com>
 >		h8300.c (shift_alg_xx): Move these and related variables at sta
 >rtup
 >			  (h8300_init_once): If optimizing for size, change som
 >e of 
 >			 the shift_alg to LOOP in shift_alg_hi
Thanks.  This needed some minor updates in terms of formatting and the
like.  Here's the actual patch I checked in.

        * h8300.c (enum shift_alg): Move to earlier in h8300.c.
        (enum shift_type, enum h8_cpu): Likewise.
        (INL, ROT, LOP, SPC macros): Likewise.
        (shift_alg_qi, shift_alg_hi, shift_alg_si): Likewise.  Lose
        const designator.
        (h8300_init_once): Update shift_alg_{qi,hi,si} to use more
        space efficient algorithms when optimize for codesize.

Index: config/h8300/h8300.c
===================================================================
RCS file: /cvs/gcc/gcc/gcc/config/h8300/h8300.c,v
retrieving revision 1.141
diff -c -3 -p -r1.141 h8300.c
*** config/h8300/h8300.c	5 Sep 2002 06:59:38 -0000	1.141
--- config/h8300/h8300.c	6 Sep 2002 16:13:29 -0000
*************** const char *h8_push_op, *h8_pop_op, *h8_
*** 125,130 ****
--- 125,290 ----
  
  struct gcc_target targetm = TARGET_INITIALIZER;
  
+ /* See below where shifts are handled for explanation of this enum.  */
+ 
+ enum shift_alg
+ {
+   SHIFT_INLINE,
+   SHIFT_ROT_AND,
+   SHIFT_SPECIAL,
+   SHIFT_LOOP
+ };
+ 
+ /* Symbols of the various shifts which can be used as indices.  */
+ 
+ enum shift_type
+ {
+   SHIFT_ASHIFT, SHIFT_LSHIFTRT, SHIFT_ASHIFTRT
+ };
+ 
+ /* Macros to keep the shift algorithm tables small.  */
+ #define INL SHIFT_INLINE
+ #define ROT SHIFT_ROT_AND
+ #define LOP SHIFT_LOOP
+ #define SPC SHIFT_SPECIAL
+ 
+ /* The shift algorithms for each machine, mode, shift type, and shift
+    count are defined below.  The three tables below correspond to
+    QImode, HImode, and SImode, respectively.  Each table is organized
+    by, in the order of indecies, machine, shift type, and shift count.  */
+ 
+ static enum shift_alg shift_alg_qi[3][3][8] = {
+   {
+     /* TARGET_H8300  */
+     /* 0    1    2    3    4    5    6    7  */
+     { INL, INL, INL, INL, INL, ROT, ROT, ROT }, /* SHIFT_ASHIFT   */
+     { INL, INL, INL, INL, INL, ROT, ROT, ROT }, /* SHIFT_LSHIFTRT */
+     { INL, INL, INL, INL, INL, LOP, LOP, SPC }  /* SHIFT_ASHIFTRT */
+   },
+   {
+     /* TARGET_H8300H  */
+     /* 0    1    2    3    4    5    6    7  */
+     { INL, INL, INL, INL, INL, ROT, ROT, ROT }, /* SHIFT_ASHIFT   */
+     { INL, INL, INL, INL, INL, ROT, ROT, ROT }, /* SHIFT_LSHIFTRT */
+     { INL, INL, INL, INL, INL, LOP, LOP, SPC }  /* SHIFT_ASHIFTRT */
+   },
+   {
+     /* TARGET_H8300S  */
+     /*  0    1    2    3    4    5    6    7  */
+     { INL, INL, INL, INL, INL, INL, ROT, ROT }, /* SHIFT_ASHIFT   */
+     { INL, INL, INL, INL, INL, INL, ROT, ROT }, /* SHIFT_LSHIFTRT */
+     { INL, INL, INL, INL, INL, INL, INL, SPC }  /* SHIFT_ASHIFTRT */
+   }
+ };
+ 
+ static enum shift_alg shift_alg_hi[3][3][16] = {
+   {
+     /* TARGET_H8300  */
+     /*  0    1    2    3    4    5    6    7  */
+     /*  8    9   10   11   12   13   14   15  */
+     { INL, INL, INL, INL, INL, INL, INL, SPC,
+       SPC, SPC, SPC, SPC, SPC, SPC, SPC, SPC }, /* SHIFT_ASHIFT   */
+     { INL, INL, INL, INL, INL, LOP, LOP, SPC,
+       SPC, SPC, SPC, SPC, SPC, SPC, SPC, SPC }, /* SHIFT_LSHIFTRT */
+     { INL, INL, INL, INL, INL, LOP, LOP, SPC,
+       SPC, SPC, SPC, SPC, SPC, SPC, SPC, SPC }, /* SHIFT_ASHIFTRT */
+   },
+   {
+     /* TARGET_H8300H  */
+     /*  0    1    2    3    4    5    6    7  */
+     /*  8    9   10   11   12   13   14   15  */
+     { INL, INL, INL, INL, INL, INL, INL, SPC,
+       SPC, SPC, SPC, SPC, SPC, ROT, ROT, ROT }, /* SHIFT_ASHIFT   */
+     { INL, INL, INL, INL, INL, INL, INL, SPC,
+       SPC, SPC, SPC, SPC, SPC, ROT, ROT, ROT }, /* SHIFT_LSHIFTRT */
+     { INL, INL, INL, INL, INL, INL, INL, SPC,
+       SPC, SPC, SPC, SPC, SPC, SPC, SPC, SPC }, /* SHIFT_ASHIFTRT */
+   },
+   {
+     /* TARGET_H8300S  */
+     /*  0    1    2    3    4    5    6    7  */
+     /*  8    9   10   11   12   13   14   15  */
+     { INL, INL, INL, INL, INL, INL, INL, INL,
+       SPC, SPC, SPC, SPC, SPC, ROT, ROT, ROT }, /* SHIFT_ASHIFT   */
+     { INL, INL, INL, INL, INL, INL, INL, INL,
+       SPC, SPC, SPC, SPC, SPC, ROT, ROT, ROT }, /* SHIFT_LSHIFTRT */
+     { INL, INL, INL, INL, INL, INL, INL, INL,
+       SPC, SPC, SPC, SPC, SPC, SPC, SPC, SPC }, /* SHIFT_ASHIFTRT */
+   }
+ };
+ 
+ static enum shift_alg shift_alg_si[3][3][32] = {
+   {
+     /* TARGET_H8300  */
+     /*  0    1    2    3    4    5    6    7  */
+     /*  8    9   10   11   12   13   14   15  */
+     /* 16   17   18   19   20   21   22   23  */
+     /* 24   25   26   27   28   29   30   31  */
+     { INL, INL, INL, LOP, LOP, LOP, LOP, LOP,
+       SPC, LOP, LOP, LOP, LOP, LOP, LOP, LOP,
+       SPC, SPC, SPC, SPC, SPC, LOP, LOP, LOP,
+       SPC, SPC, SPC, SPC, LOP, LOP, LOP, SPC }, /* SHIFT_ASHIFT   */
+     { INL, INL, INL, LOP, LOP, LOP, LOP, LOP,
+       SPC, SPC, LOP, LOP, LOP, LOP, LOP, SPC,
+       SPC, SPC, SPC, LOP, LOP, LOP, LOP, LOP,
+       SPC, SPC, SPC, SPC, SPC, LOP, LOP, SPC }, /* SHIFT_LSHIFTRT */
+     { INL, INL, INL, LOP, LOP, LOP, LOP, LOP,
+       SPC, LOP, LOP, LOP, LOP, LOP, LOP, SPC,
+       SPC, SPC, LOP, LOP, LOP, LOP, LOP, LOP,
+       SPC, SPC, SPC, LOP, LOP, LOP, LOP, SPC }, /* SHIFT_ASHIFTRT */
+   },
+   {
+     /* TARGET_H8300H  */
+     /*  0    1    2    3    4    5    6    7  */
+     /*  8    9   10   11   12   13   14   15  */
+     /* 16   17   18   19   20   21   22   23  */
+     /* 24   25   26   27   28   29   30   31  */
+     { INL, INL, INL, INL, INL, LOP, LOP, LOP,
+       SPC, LOP, LOP, LOP, LOP, LOP, LOP, SPC,
+       SPC, SPC, SPC, SPC, LOP, LOP, LOP, LOP,
+       SPC, LOP, LOP, LOP, ROT, ROT, ROT, SPC }, /* SHIFT_ASHIFT   */
+     { INL, INL, INL, INL, INL, LOP, LOP, LOP,
+       SPC, LOP, LOP, LOP, LOP, LOP, LOP, SPC,
+       SPC, SPC, SPC, SPC, LOP, LOP, LOP, LOP,
+       SPC, LOP, LOP, LOP, ROT, ROT, ROT, SPC }, /* SHIFT_LSHIFTRT */
+     { INL, INL, INL, INL, INL, LOP, LOP, LOP,
+       SPC, LOP, LOP, LOP, LOP, LOP, LOP, LOP,
+       SPC, SPC, SPC, SPC, LOP, LOP, LOP, LOP,
+       SPC, LOP, LOP, LOP, LOP, LOP, LOP, SPC }, /* SHIFT_ASHIFTRT */
+   },
+   {
+     /* TARGET_H8300S  */
+     /*  0    1    2    3    4    5    6    7  */
+     /*  8    9   10   11   12   13   14   15  */
+     /* 16   17   18   19   20   21   22   23  */
+     /* 24   25   26   27   28   29   30   31  */
+     { INL, INL, INL, INL, INL, INL, INL, INL,
+       INL, INL, INL, LOP, LOP, LOP, LOP, SPC,
+       SPC, SPC, SPC, SPC, SPC, SPC, LOP, LOP,
+       SPC, SPC, LOP, LOP, ROT, ROT, ROT, SPC }, /* SHIFT_ASHIFT   */
+     { INL, INL, INL, INL, INL, INL, INL, INL,
+       INL, INL, INL, LOP, LOP, LOP, LOP, SPC,
+       SPC, SPC, SPC, SPC, SPC, SPC, LOP, LOP,
+       SPC, SPC, LOP, LOP, ROT, ROT, ROT, SPC }, /* SHIFT_LSHIFTRT */
+     { INL, INL, INL, INL, INL, INL, INL, INL,
+       INL, INL, INL, LOP, LOP, LOP, LOP, LOP,
+       SPC, SPC, SPC, SPC, SPC, SPC, LOP, LOP,
+       SPC, SPC, LOP, LOP, LOP, LOP, LOP, SPC }, /* SHIFT_ASHIFTRT */
+   }
+ };
+ 
+ #undef INL
+ #undef ROT
+ #undef LOP
+ #undef SPC
+ 
+ enum h8_cpu
+ {
+   H8_300,
+   H8_300H,
+   H8_S
+ };
+ 
  /* Initialize various cpu specific globals at start up.  */
  
  void
*************** h8300_init_once ()
*** 154,159 ****
--- 314,354 ----
        error ("-ms2600 is used without -ms");
        target_flags |= 1;
      }
+ 
+   /* Some of the shifts are optimized for speed by default. 
+      See http://gcc.gnu.org/ml/gcc-patches/2002-07/msg01858.html
+      If optimizing for size, change shift_alg for those shift to 
+      SHIFT_LOOP.  */
+   if(optimize_size)
+     {
+       /* H8300 */
+       shift_alg_hi[H8_300][SHIFT_ASHIFT][5] = SHIFT_LOOP ;
+       shift_alg_hi[H8_300][SHIFT_ASHIFT][6] = SHIFT_LOOP ;
+       shift_alg_hi[H8_300][SHIFT_ASHIFT][13] = SHIFT_LOOP ;
+       shift_alg_hi[H8_300][SHIFT_ASHIFT][14] = SHIFT_LOOP ;
+ 
+       shift_alg_hi[H8_300][SHIFT_LSHIFTRT][13] = SHIFT_LOOP ;
+       shift_alg_hi[H8_300][SHIFT_LSHIFTRT][14] = SHIFT_LOOP ;
+ 
+       shift_alg_hi[H8_300][SHIFT_ASHIFTRT][13] = SHIFT_LOOP ;
+       shift_alg_hi[H8_300][SHIFT_ASHIFTRT][14] = SHIFT_LOOP ;
+ 
+       /* H8300H */
+       shift_alg_hi[H8_300H][SHIFT_ASHIFT][5] = SHIFT_LOOP ;
+       shift_alg_hi[H8_300H][SHIFT_ASHIFT][6] = SHIFT_LOOP ;
+ 
+       shift_alg_hi[H8_300H][SHIFT_LSHIFTRT][5] = SHIFT_LOOP ;
+       shift_alg_hi[H8_300H][SHIFT_LSHIFTRT][6] = SHIFT_LOOP ;
+ 
+       shift_alg_hi[H8_300H][SHIFT_ASHIFTRT][5] = SHIFT_LOOP ;
+       shift_alg_hi[H8_300H][SHIFT_ASHIFTRT][6] = SHIFT_LOOP ;
+       shift_alg_hi[H8_300H][SHIFT_ASHIFTRT][13] = SHIFT_LOOP ;
+       shift_alg_hi[H8_300H][SHIFT_ASHIFTRT][14] = SHIFT_LOOP ;
+ 
+       /* H8S */
+       shift_alg_hi[H8_S][SHIFT_ASHIFTRT][13] = SHIFT_LOOP ;
+       shift_alg_hi[H8_S][SHIFT_ASHIFTRT][14] = SHIFT_LOOP ;
+     }
  }
  
  static const char *
*************** expand_a_shift (mode, code, operands)
*** 1997,2019 ****
    return 1;
  }
  
- /* See above for explanation of this enum.  */
- 
- enum shift_alg
- {
-   SHIFT_INLINE,
-   SHIFT_ROT_AND,
-   SHIFT_SPECIAL,
-   SHIFT_LOOP
- };
- 
- /* Symbols of the various shifts which can be used as indices.  */
- 
- enum shift_type
- {
-   SHIFT_ASHIFT, SHIFT_LSHIFTRT, SHIFT_ASHIFTRT
- };
- 
  /* Symbols of the various modes which can be used as indices.  */
  
  enum shift_mode
--- 2192,2197 ----
*************** static const char *const rotate_two[3][3
*** 2175,2316 ****
        "rotl.l\t#2,%S0"
      }
  };
- 
- /* Macros to keep the shift algorithm tables small.  */
- #define INL SHIFT_INLINE
- #define ROT SHIFT_ROT_AND
- #define LOP SHIFT_LOOP
- #define SPC SHIFT_SPECIAL
- 
- /* The shift algorithms for each machine, mode, shift type, and shift
-    count are defined below.  The three tables below correspond to
-    QImode, HImode, and SImode, respectively.  Each table is organized
-    by, in the order of indecies, machine, shift type, and shift count.  */
- 
- static const enum shift_alg shift_alg_qi[3][3][8] = {
-   {
-     /* TARGET_H8300  */
-     /* 0    1    2    3    4    5    6    7  */
-     { INL, INL, INL, INL, INL, ROT, ROT, ROT }, /* SHIFT_ASHIFT   */
-     { INL, INL, INL, INL, INL, ROT, ROT, ROT }, /* SHIFT_LSHIFTRT */
-     { INL, INL, INL, INL, INL, LOP, LOP, SPC }  /* SHIFT_ASHIFTRT */
-   },
-   {
-     /* TARGET_H8300H  */
-     /* 0    1    2    3    4    5    6    7  */
-     { INL, INL, INL, INL, INL, ROT, ROT, ROT }, /* SHIFT_ASHIFT   */
-     { INL, INL, INL, INL, INL, ROT, ROT, ROT }, /* SHIFT_LSHIFTRT */
-     { INL, INL, INL, INL, INL, LOP, LOP, SPC }  /* SHIFT_ASHIFTRT */
-   },
-   {
-     /* TARGET_H8300S  */
-     /*  0    1    2    3    4    5    6    7  */
-     { INL, INL, INL, INL, INL, INL, ROT, ROT }, /* SHIFT_ASHIFT   */
-     { INL, INL, INL, INL, INL, INL, ROT, ROT }, /* SHIFT_LSHIFTRT */
-     { INL, INL, INL, INL, INL, INL, INL, SPC }  /* SHIFT_ASHIFTRT */
-   }
- };
- 
- static const enum shift_alg shift_alg_hi[3][3][16] = {
-   {
-     /* TARGET_H8300  */
-     /*  0    1    2    3    4    5    6    7  */
-     /*  8    9   10   11   12   13   14   15  */
-     { INL, INL, INL, INL, INL, INL, INL, SPC,
-       SPC, SPC, SPC, SPC, SPC, SPC, SPC, SPC }, /* SHIFT_ASHIFT   */
-     { INL, INL, INL, INL, INL, LOP, LOP, SPC,
-       SPC, SPC, SPC, SPC, SPC, SPC, SPC, SPC }, /* SHIFT_LSHIFTRT */
-     { INL, INL, INL, INL, INL, LOP, LOP, SPC,
-       SPC, SPC, SPC, SPC, SPC, SPC, SPC, SPC }, /* SHIFT_ASHIFTRT */
-   },
-   {
-     /* TARGET_H8300H  */
-     /*  0    1    2    3    4    5    6    7  */
-     /*  8    9   10   11   12   13   14   15  */
-     { INL, INL, INL, INL, INL, INL, INL, SPC,
-       SPC, SPC, SPC, SPC, SPC, ROT, ROT, ROT }, /* SHIFT_ASHIFT   */
-     { INL, INL, INL, INL, INL, INL, INL, SPC,
-       SPC, SPC, SPC, SPC, SPC, ROT, ROT, ROT }, /* SHIFT_LSHIFTRT */
-     { INL, INL, INL, INL, INL, INL, INL, SPC,
-       SPC, SPC, SPC, SPC, SPC, SPC, SPC, SPC }, /* SHIFT_ASHIFTRT */
-   },
-   {
-     /* TARGET_H8300S  */
-     /*  0    1    2    3    4    5    6    7  */
-     /*  8    9   10   11   12   13   14   15  */
-     { INL, INL, INL, INL, INL, INL, INL, INL,
-       SPC, SPC, SPC, SPC, SPC, ROT, ROT, ROT }, /* SHIFT_ASHIFT   */
-     { INL, INL, INL, INL, INL, INL, INL, INL,
-       SPC, SPC, SPC, SPC, SPC, ROT, ROT, ROT }, /* SHIFT_LSHIFTRT */
-     { INL, INL, INL, INL, INL, INL, INL, INL,
-       SPC, SPC, SPC, SPC, SPC, SPC, SPC, SPC }, /* SHIFT_ASHIFTRT */
-   }
- };
- 
- static const enum shift_alg shift_alg_si[3][3][32] = {
-   {
-     /* TARGET_H8300  */
-     /*  0    1    2    3    4    5    6    7  */
-     /*  8    9   10   11   12   13   14   15  */
-     /* 16   17   18   19   20   21   22   23  */
-     /* 24   25   26   27   28   29   30   31  */
-     { INL, INL, INL, LOP, LOP, LOP, LOP, LOP,
-       SPC, LOP, LOP, LOP, LOP, LOP, LOP, LOP,
-       SPC, SPC, SPC, SPC, SPC, LOP, LOP, LOP,
-       SPC, SPC, SPC, SPC, LOP, LOP, LOP, SPC }, /* SHIFT_ASHIFT   */
-     { INL, INL, INL, LOP, LOP, LOP, LOP, LOP,
-       SPC, SPC, LOP, LOP, LOP, LOP, LOP, SPC,
-       SPC, SPC, SPC, LOP, LOP, LOP, LOP, LOP,
-       SPC, SPC, SPC, SPC, SPC, LOP, LOP, SPC }, /* SHIFT_LSHIFTRT */
-     { INL, INL, INL, LOP, LOP, LOP, LOP, LOP,
-       SPC, LOP, LOP, LOP, LOP, LOP, LOP, SPC,
-       SPC, SPC, LOP, LOP, LOP, LOP, LOP, LOP,
-       SPC, SPC, SPC, LOP, LOP, LOP, LOP, SPC }, /* SHIFT_ASHIFTRT */
-   },
-   {
-     /* TARGET_H8300H  */
-     /*  0    1    2    3    4    5    6    7  */
-     /*  8    9   10   11   12   13   14   15  */
-     /* 16   17   18   19   20   21   22   23  */
-     /* 24   25   26   27   28   29   30   31  */
-     { INL, INL, INL, INL, INL, LOP, LOP, LOP,
-       SPC, LOP, LOP, LOP, LOP, LOP, LOP, SPC,
-       SPC, SPC, SPC, SPC, LOP, LOP, LOP, LOP,
-       SPC, LOP, LOP, LOP, ROT, ROT, ROT, SPC }, /* SHIFT_ASHIFT   */
-     { INL, INL, INL, INL, INL, LOP, LOP, LOP,
-       SPC, LOP, LOP, LOP, LOP, LOP, LOP, SPC,
-       SPC, SPC, SPC, SPC, LOP, LOP, LOP, LOP,
-       SPC, LOP, LOP, LOP, ROT, ROT, ROT, SPC }, /* SHIFT_LSHIFTRT */
-     { INL, INL, INL, INL, INL, LOP, LOP, LOP,
-       SPC, LOP, LOP, LOP, LOP, LOP, LOP, LOP,
-       SPC, SPC, SPC, SPC, LOP, LOP, LOP, LOP,
-       SPC, LOP, LOP, LOP, LOP, LOP, LOP, SPC }, /* SHIFT_ASHIFTRT */
-   },
-   {
-     /* TARGET_H8300S  */
-     /*  0    1    2    3    4    5    6    7  */
-     /*  8    9   10   11   12   13   14   15  */
-     /* 16   17   18   19   20   21   22   23  */
-     /* 24   25   26   27   28   29   30   31  */
-     { INL, INL, INL, INL, INL, INL, INL, INL,
-       INL, INL, INL, LOP, LOP, LOP, LOP, SPC,
-       SPC, SPC, SPC, SPC, SPC, SPC, LOP, LOP,
-       SPC, SPC, LOP, LOP, ROT, ROT, ROT, SPC }, /* SHIFT_ASHIFT   */
-     { INL, INL, INL, INL, INL, INL, INL, INL,
-       INL, INL, INL, LOP, LOP, LOP, LOP, SPC,
-       SPC, SPC, SPC, SPC, SPC, SPC, LOP, LOP,
-       SPC, SPC, LOP, LOP, ROT, ROT, ROT, SPC }, /* SHIFT_LSHIFTRT */
-     { INL, INL, INL, INL, INL, INL, INL, INL,
-       INL, INL, INL, LOP, LOP, LOP, LOP, LOP,
-       SPC, SPC, SPC, SPC, SPC, SPC, LOP, LOP,
-       SPC, SPC, LOP, LOP, LOP, LOP, LOP, SPC }, /* SHIFT_ASHIFTRT */
-   }
- };
- 
- #undef INL
- #undef ROT
- #undef LOP
- #undef SPC
  
  struct shift_info {
    /* Shift algorithm.  */
--- 2353,2358 ----



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