Speedup hard-reg-set

Segher Boessenkool segher@koffie.nl
Fri Apr 4 00:38:00 GMT 2003


Similar to my recent bitmap changes.  >= 2% speedup at -O2
on my testcases (3.3, Linux, PowerPC).



2003-04-04  Segher Boessenkool  <segher@koffie.nl>

	* hard-reg-set.h: Use unsigned long instead of
	HOST_WIDE_INT for storage.



*** hard-reg-set.h~	Mon Mar 31 06:47:32 2003
--- hard-reg-set.h	Mon Mar 31 06:53:28 2003
*************** Software Foundation, 59 Temple Place - S
*** 38,54 ****
      registers and then only in the few cases where we have an array of
      HARD_REG_SETs, so it needn't be as complex as it used to be.  */

! typedef unsigned HOST_WIDE_INT HARD_REG_ELT_TYPE;

! #if FIRST_PSEUDO_REGISTER <= HOST_BITS_PER_WIDE_INT

   #define HARD_REG_SET HARD_REG_ELT_TYPE

   #else

   #define HARD_REG_SET_LONGS \
!  ((FIRST_PSEUDO_REGISTER + HOST_BITS_PER_WIDE_INT - 1)	\
!   / HOST_BITS_PER_WIDE_INT)
   typedef HARD_REG_ELT_TYPE HARD_REG_SET[HARD_REG_SET_LONGS];

   #endif
--- 38,58 ----
      registers and then only in the few cases where we have an array of
      HARD_REG_SETs, so it needn't be as complex as it used to be.  */

! /* typedef unsigned HOST_WIDE_INT HARD_REG_ELT_TYPE; */
! /* #define nHARD_REG_ELT_BITS HOST_BITS_PER_WIDE_INT */
! typedef unsigned long HARD_REG_ELT_TYPE;
! #define nHARD_REG_ELT_BITS (CHAR_BIT * SIZEOF_LONG)
! #define HARD_REG_ELT_BITS (unsigned) nHARD_REG_ELT_BITS

! #if FIRST_PSEUDO_REGISTER <= nHARD_REG_ELT_BITS

   #define HARD_REG_SET HARD_REG_ELT_TYPE

   #else

   #define HARD_REG_SET_LONGS \
!  ((FIRST_PSEUDO_REGISTER + nHARD_REG_ELT_BITS - 1)	\
!   / nHARD_REG_ELT_BITS)
   typedef HARD_REG_ELT_TYPE HARD_REG_SET[HARD_REG_SET_LONGS];

   #endif
*************** typedef HARD_REG_ELT_TYPE HARD_REG_SET[H
*** 111,131 ****

   #else

- #define UHOST_BITS_PER_WIDE_INT ((unsigned) HOST_BITS_PER_WIDE_INT)
-
   #define SET_HARD_REG_BIT(SET, BIT)		\
!   ((SET)[(BIT) / UHOST_BITS_PER_WIDE_INT]	\
!    |= HARD_CONST (1) << ((BIT) % UHOST_BITS_PER_WIDE_INT))

   #define CLEAR_HARD_REG_BIT(SET, BIT)		\
!   ((SET)[(BIT) / UHOST_BITS_PER_WIDE_INT]	\
!    &= ~(HARD_CONST (1) << ((BIT) % UHOST_BITS_PER_WIDE_INT)))

   #define TEST_HARD_REG_BIT(SET, BIT)		\
!   (!!((SET)[(BIT) / UHOST_BITS_PER_WIDE_INT]	\
!       & (HARD_CONST (1) << ((BIT) % UHOST_BITS_PER_WIDE_INT))))

! #if FIRST_PSEUDO_REGISTER <= 2*HOST_BITS_PER_WIDE_INT
   #define CLEAR_HARD_REG_SET(TO)  \
   do { HARD_REG_ELT_TYPE *scan_tp_ = (TO);			\
        scan_tp_[0] = 0;						\
--- 115,133 ----

   #else

   #define SET_HARD_REG_BIT(SET, BIT)		\
!   ((SET)[(BIT) / HARD_REG_ELT_BITS]	\
!    |= HARD_CONST (1) << ((BIT) % HARD_REG_ELT_BITS))

   #define CLEAR_HARD_REG_BIT(SET, BIT)		\
!   ((SET)[(BIT) / HARD_REG_ELT_BITS]	\
!    &= ~(HARD_CONST (1) << ((BIT) % HARD_REG_ELT_BITS)))

   #define TEST_HARD_REG_BIT(SET, BIT)		\
!   (!!((SET)[(BIT) / HARD_REG_ELT_BITS]	\
!       & (HARD_CONST (1) << ((BIT) % HARD_REG_ELT_BITS))))

! #if FIRST_PSEUDO_REGISTER <= 2*nHARD_REG_ELT_BITS
   #define CLEAR_HARD_REG_SET(TO)  \
   do { HARD_REG_ELT_TYPE *scan_tp_ = (TO);			\
        scan_tp_[0] = 0;						\
*************** do { HARD_REG_ELT_TYPE *scan_xp_ = (X),
*** 179,185 ****
   	goto TO; } while (0)

   #else
! #if FIRST_PSEUDO_REGISTER <= 3*HOST_BITS_PER_WIDE_INT
   #define CLEAR_HARD_REG_SET(TO)  \
   do { HARD_REG_ELT_TYPE *scan_tp_ = (TO);			\
        scan_tp_[0] = 0;						\
--- 181,187 ----
   	goto TO; } while (0)

   #else
! #if FIRST_PSEUDO_REGISTER <= 3*nHARD_REG_ELT_BITS
   #define CLEAR_HARD_REG_SET(TO)  \
   do { HARD_REG_ELT_TYPE *scan_tp_ = (TO);			\
        scan_tp_[0] = 0;						\
*************** do { HARD_REG_ELT_TYPE *scan_xp_ = (X),
*** 243,249 ****
   	goto TO; } while (0)

   #else
! #if FIRST_PSEUDO_REGISTER <= 4*HOST_BITS_PER_WIDE_INT
   #define CLEAR_HARD_REG_SET(TO)  \
   do { HARD_REG_ELT_TYPE *scan_tp_ = (TO);			\
        scan_tp_[0] = 0;						\
--- 245,251 ----
   	goto TO; } while (0)

   #else
! #if FIRST_PSEUDO_REGISTER <= 4*nHARD_REG_ELT_BITS
   #define CLEAR_HARD_REG_SET(TO)  \
   do { HARD_REG_ELT_TYPE *scan_tp_ = (TO);			\
        scan_tp_[0] = 0;						\
*************** do { HARD_REG_ELT_TYPE *scan_xp_ = (X),
*** 316,322 ****
   	 && (scan_xp_[3] == scan_yp_[3]))			\
   	goto TO; } while (0)

! #else /* FIRST_PSEUDO_REGISTER > 3*HOST_BITS_PER_WIDE_INT */

   #define CLEAR_HARD_REG_SET(TO)  \
   do { HARD_REG_ELT_TYPE *scan_tp_ = (TO);			\
--- 318,324 ----
   	 && (scan_xp_[3] == scan_yp_[3]))			\
   	goto TO; } while (0)

! #else /* FIRST_PSEUDO_REGISTER > 3*nHARD_REG_ELT_BITS */

   #define CLEAR_HARD_REG_SET(TO)  \
   do { HARD_REG_ELT_TYPE *scan_tp_ = (TO);			\




More information about the Gcc-patches mailing list