PowerPC longlong.h and MIN_UNITS_PER_WORD

David Edelsohn dje@watson.ibm.com
Tue Aug 27 08:04:00 GMT 2002


	Because of Honza's TImode inquiry, I noticed that 64-bit PowerPC
libgcc.a does not define TImode symbols either.  That fix requires 64-bit
support in longlong.h which I disocovered has not been synced with GMP in
a long time.

	Bootstrapped on powerpc-ibm-aix4.3.3.0.

David


        * longlong.h: Import current PowerPC defintion from GMP-4.1.

        * config/rs6000/rs6000.h (MIN_UNITS_PER_WORD): Add IN_LIBGCC2 case.

Index: longlong.h
===================================================================
RCS file: /cvs/gcc/egcs/gcc/longlong.h,v
retrieving revision 1.29
diff -c -p -r1.29 longlong.h
*** longlong.h	14 Aug 2002 03:16:04 -0000	1.29
--- longlong.h	27 Aug 2002 14:45:23 -0000
*************** UDItype __umulsidi3 (USItype, USItype);
*** 621,747 ****
    } while (0)
  #endif /* __ns32000__ */
  
! #if (defined (_ARCH_PPC) || defined (_IBMR2))
! #if W_TYPE_SIZE == 32
  #define add_ssaaaa(sh, sl, ah, al, bh, bl) \
    do {									\
      if (__builtin_constant_p (bh) && (bh) == 0)				\
        __asm__ ("{a%I4|add%I4c} %1,%3,%4\n\t{aze|addze} %0,%2"		\
! 	     : "=r" ((USItype) (sh)),					\
! 	       "=&r" ((USItype) (sl))					\
! 	     : "%r" ((USItype) (ah)),					\
! 	       "%r" ((USItype) (al)),					\
! 	       "rI" ((USItype) (bl)));					\
!     else if (__builtin_constant_p (bh) && (bh) ==~(USItype) 0)		\
        __asm__ ("{a%I4|add%I4c} %1,%3,%4\n\t{ame|addme} %0,%2"		\
! 	     : "=r" ((USItype) (sh)),					\
! 	       "=&r" ((USItype) (sl))					\
! 	     : "%r" ((USItype) (ah)),					\
! 	       "%r" ((USItype) (al)),					\
! 	       "rI" ((USItype) (bl)));					\
      else								\
        __asm__ ("{a%I5|add%I5c} %1,%4,%5\n\t{ae|adde} %0,%2,%3"		\
! 	     : "=r" ((USItype) (sh)),					\
! 	       "=&r" ((USItype) (sl))					\
! 	     : "%r" ((USItype) (ah)),					\
! 	       "r" ((USItype) (bh)),					\
! 	       "%r" ((USItype) (al)),					\
! 	       "rI" ((USItype) (bl)));					\
    } while (0)
  #define sub_ddmmss(sh, sl, ah, al, bh, bl) \
    do {									\
      if (__builtin_constant_p (ah) && (ah) == 0)				\
        __asm__ ("{sf%I3|subf%I3c} %1,%4,%3\n\t{sfze|subfze} %0,%2"	\
! 	       : "=r" ((USItype) (sh)),					\
! 		 "=&r" ((USItype) (sl))					\
! 	       : "r" ((USItype) (bh)),					\
! 		 "rI" ((USItype) (al)),					\
! 		 "r" ((USItype) (bl)));					\
!     else if (__builtin_constant_p (ah) && (ah) ==~(USItype) 0)		\
        __asm__ ("{sf%I3|subf%I3c} %1,%4,%3\n\t{sfme|subfme} %0,%2"	\
! 	       : "=r" ((USItype) (sh)),					\
! 		 "=&r" ((USItype) (sl))					\
! 	       : "r" ((USItype) (bh)),					\
! 		 "rI" ((USItype) (al)),					\
! 		 "r" ((USItype) (bl)));					\
      else if (__builtin_constant_p (bh) && (bh) == 0)			\
        __asm__ ("{sf%I3|subf%I3c} %1,%4,%3\n\t{ame|addme} %0,%2"		\
! 	       : "=r" ((USItype) (sh)),					\
! 		 "=&r" ((USItype) (sl))					\
! 	       : "r" ((USItype) (ah)),					\
! 		 "rI" ((USItype) (al)),					\
! 		 "r" ((USItype) (bl)));					\
!     else if (__builtin_constant_p (bh) && (bh) ==~(USItype) 0)		\
        __asm__ ("{sf%I3|subf%I3c} %1,%4,%3\n\t{aze|addze} %0,%2"		\
! 	       : "=r" ((USItype) (sh)),					\
! 		 "=&r" ((USItype) (sl))					\
! 	       : "r" ((USItype) (ah)),					\
! 		 "rI" ((USItype) (al)),					\
! 		 "r" ((USItype) (bl)));					\
      else								\
        __asm__ ("{sf%I4|subf%I4c} %1,%5,%4\n\t{sfe|subfe} %0,%3,%2"	\
! 	       : "=r" ((USItype) (sh)),					\
! 		 "=&r" ((USItype) (sl))					\
! 	       : "r" ((USItype) (ah)),					\
! 		 "r" ((USItype) (bh)),					\
! 		 "rI" ((USItype) (al)),					\
! 		 "r" ((USItype) (bl)));					\
    } while (0)
- #endif /* W_TYPE_SIZE */
  #define count_leading_zeros(count, x) \
!   __asm__ ("{cntlz|cntlzw} %0,%1"					\
! 	   : "=r" ((USItype) (count))					\
! 	   : "r" ((USItype) (x)))
  #define COUNT_LEADING_ZEROS_0 32
! #if defined (_ARCH_PPC)
  #define umul_ppmm(ph, pl, m0, m1) \
    do {									\
      USItype __m0 = (m0), __m1 = (m1);					\
!     __asm__ ("mulhwu %0,%1,%2"						\
! 	     : "=r" ((USItype) ph)					\
! 	     : "%r" (__m0),						\
! 	       "r" (__m1));						\
      (pl) = __m0 * __m1;							\
    } while (0)
  #define UMUL_TIME 15
  #define smul_ppmm(ph, pl, m0, m1) \
    do {									\
      SItype __m0 = (m0), __m1 = (m1);					\
!     __asm__ ("mulhw %0,%1,%2"						\
! 	     : "=r" ((SItype) ph)					\
! 	     : "%r" (__m0),						\
! 	       "r" (__m1));						\
      (pl) = __m0 * __m1;							\
    } while (0)
  #define SMUL_TIME 14
  #define UDIV_TIME 120
  #elif defined (_ARCH_PWR)
- #define umul_ppmm(xh, xl, m0, m1) \
-   do {									\
-     USItype __m0 = (m0), __m1 = (m1);					\
-     __asm__ ("mul %0,%2,%3"						\
- 	     : "=r" ((USItype) (xh)),					\
- 	       "=q" ((USItype) (xl))					\
- 	     : "r" (__m0),						\
- 	       "r" (__m1));						\
-     (xh) += ((((SItype) __m0 >> 31) & __m1)				\
- 	     + (((SItype) __m1 >> 31) & __m0));				\
-   } while (0)
  #define UMUL_TIME 8
  #define smul_ppmm(xh, xl, m0, m1) \
!   __asm__ ("mul %0,%2,%3"						\
! 	   : "=r" ((SItype) (xh)),					\
! 	     "=q" ((SItype) (xl))					\
! 	   : "r" (m0),							\
! 	     "r" (m1))
  #define SMUL_TIME 4
  #define sdiv_qrnnd(q, r, nh, nl, d) \
!   __asm__ ("div %0,%2,%4"						\
! 	   : "=r" ((SItype) (q)), "=q" ((SItype) (r))			\
! 	   : "r" ((SItype) (nh)), "1" ((SItype) (nl)), "r" ((SItype) (d)))
  #define UDIV_TIME 100
  #endif
! #endif /* Power architecture variants.  */
  
  #if defined (__ibm032__) /* RT/ROMP */ && W_TYPE_SIZE == 32
  #define add_ssaaaa(sh, sl, ah, al, bh, bl) \
--- 621,755 ----
    } while (0)
  #endif /* __ns32000__ */
  
! /* FIXME: We should test _IBMR2 here when we add assembly support for the
!    system vendor compilers.
!    FIXME: What's needed for gcc PowerPC VxWorks?  __vxworks__ is not good
!    enough, since that hits ARM and m68k too.  */
! #if (defined (_ARCH_PPC)	/* AIX */				\
!      || defined (_ARCH_PWR)	/* AIX */				\
!      || defined (_ARCH_COM)	/* AIX */				\
!      || defined (__powerpc__)	/* gcc */				\
!      || defined (__POWERPC__)	/* BEOS */				\
!      || defined (__ppc__)	/* Darwin */				\
!      || defined (PPC)		/* GNU/Linux, SysV */			\
!      ) && W_TYPE_SIZE == 32
  #define add_ssaaaa(sh, sl, ah, al, bh, bl) \
    do {									\
      if (__builtin_constant_p (bh) && (bh) == 0)				\
        __asm__ ("{a%I4|add%I4c} %1,%3,%4\n\t{aze|addze} %0,%2"		\
! 	     : "=r" (sh), "=&r" (sl) : "r" (ah), "%r" (al), "rI" (bl));\
!     else if (__builtin_constant_p (bh) && (bh) == ~(USItype) 0)		\
        __asm__ ("{a%I4|add%I4c} %1,%3,%4\n\t{ame|addme} %0,%2"		\
! 	     : "=r" (sh), "=&r" (sl) : "r" (ah), "%r" (al), "rI" (bl));\
      else								\
        __asm__ ("{a%I5|add%I5c} %1,%4,%5\n\t{ae|adde} %0,%2,%3"		\
! 	     : "=r" (sh), "=&r" (sl)					\
! 	     : "%r" (ah), "r" (bh), "%r" (al), "rI" (bl));		\
    } while (0)
  #define sub_ddmmss(sh, sl, ah, al, bh, bl) \
    do {									\
      if (__builtin_constant_p (ah) && (ah) == 0)				\
        __asm__ ("{sf%I3|subf%I3c} %1,%4,%3\n\t{sfze|subfze} %0,%2"	\
! 	       : "=r" (sh), "=&r" (sl) : "r" (bh), "rI" (al), "r" (bl));\
!     else if (__builtin_constant_p (ah) && (ah) == ~(USItype) 0)		\
        __asm__ ("{sf%I3|subf%I3c} %1,%4,%3\n\t{sfme|subfme} %0,%2"	\
! 	       : "=r" (sh), "=&r" (sl) : "r" (bh), "rI" (al), "r" (bl));\
      else if (__builtin_constant_p (bh) && (bh) == 0)			\
        __asm__ ("{sf%I3|subf%I3c} %1,%4,%3\n\t{ame|addme} %0,%2"		\
! 	       : "=r" (sh), "=&r" (sl) : "r" (ah), "rI" (al), "r" (bl));\
!     else if (__builtin_constant_p (bh) && (bh) == ~(USItype) 0)		\
        __asm__ ("{sf%I3|subf%I3c} %1,%4,%3\n\t{aze|addze} %0,%2"		\
! 	       : "=r" (sh), "=&r" (sl) : "r" (ah), "rI" (al), "r" (bl));\
      else								\
        __asm__ ("{sf%I4|subf%I4c} %1,%5,%4\n\t{sfe|subfe} %0,%3,%2"	\
! 	       : "=r" (sh), "=&r" (sl)					\
! 	       : "r" (ah), "r" (bh), "rI" (al), "r" (bl));		\
    } while (0)
  #define count_leading_zeros(count, x) \
!   __asm__ ("{cntlz|cntlzw} %0,%1" : "=r" (count) : "r" (x))
  #define COUNT_LEADING_ZEROS_0 32
! #if defined (_ARCH_PPC) || defined (__powerpc__) || defined (__POWERPC__) \
!   || defined (__ppc__) || defined (PPC) || defined (__vxworks__)
  #define umul_ppmm(ph, pl, m0, m1) \
    do {									\
      USItype __m0 = (m0), __m1 = (m1);					\
!     __asm__ ("mulhwu %0,%1,%2" : "=r" (ph) : "%r" (m0), "r" (m1));	\
      (pl) = __m0 * __m1;							\
    } while (0)
  #define UMUL_TIME 15
  #define smul_ppmm(ph, pl, m0, m1) \
    do {									\
      SItype __m0 = (m0), __m1 = (m1);					\
!     __asm__ ("mulhw %0,%1,%2" : "=r" (ph) : "%r" (m0), "r" (m1));	\
      (pl) = __m0 * __m1;							\
    } while (0)
  #define SMUL_TIME 14
  #define UDIV_TIME 120
  #elif defined (_ARCH_PWR)
  #define UMUL_TIME 8
  #define smul_ppmm(xh, xl, m0, m1) \
!   __asm__ ("mul %0,%2,%3" : "=r" (xh), "=q" (xl) : "r" (m0), "r" (m1))
  #define SMUL_TIME 4
  #define sdiv_qrnnd(q, r, nh, nl, d) \
!   __asm__ ("div %0,%2,%4" : "=r" (q), "=q" (r) : "r" (nh), "1" (nl), "r" (d))
  #define UDIV_TIME 100
  #endif
! #endif /* 32-bit POWER architecture variants.  */
! 
! /* We should test _IBMR2 here when we add assembly support for the system
!    vendor compilers.  */
! #if (defined (_ARCH_PPC64) || defined (__powerpc64__)) && W_TYPE_SIZE == 64
! #define add_ssaaaa(sh, sl, ah, al, bh, bl) \
!   do {									\
!     if (__builtin_constant_p (bh) && (bh) == 0)				\
!       __asm__ ("{a%I4|add%I4c} %1,%3,%4\n\t{aze|addze} %0,%2"		\
! 	     : "=r" (sh), "=&r" (sl) : "r" (ah), "%r" (al), "rI" (bl));\
!     else if (__builtin_constant_p (bh) && (bh) == ~(UDItype) 0)		\
!       __asm__ ("{a%I4|add%I4c} %1,%3,%4\n\t{ame|addme} %0,%2"		\
! 	     : "=r" (sh), "=&r" (sl) : "r" (ah), "%r" (al), "rI" (bl));\
!     else								\
!       __asm__ ("{a%I5|add%I5c} %1,%4,%5\n\t{ae|adde} %0,%2,%3"		\
! 	     : "=r" (sh), "=&r" (sl)					\
! 	     : "%r" (ah), "r" (bh), "%r" (al), "rI" (bl));		\
!   } while (0)
! #define sub_ddmmss(sh, sl, ah, al, bh, bl) \
!   do {									\
!     if (__builtin_constant_p (ah) && (ah) == 0)				\
!       __asm__ ("{sf%I3|subf%I3c} %1,%4,%3\n\t{sfze|subfze} %0,%2"	\
! 	       : "=r" (sh), "=&r" (sl) : "r" (bh), "rI" (al), "r" (bl));\
!     else if (__builtin_constant_p (ah) && (ah) == ~(UDItype) 0)		\
!       __asm__ ("{sf%I3|subf%I3c} %1,%4,%3\n\t{sfme|subfme} %0,%2"	\
! 	       : "=r" (sh), "=&r" (sl) : "r" (bh), "rI" (al), "r" (bl));\
!     else if (__builtin_constant_p (bh) && (bh) == 0)			\
!       __asm__ ("{sf%I3|subf%I3c} %1,%4,%3\n\t{ame|addme} %0,%2"		\
! 	       : "=r" (sh), "=&r" (sl) : "r" (ah), "rI" (al), "r" (bl));\
!     else if (__builtin_constant_p (bh) && (bh) == ~(UDItype) 0)		\
!       __asm__ ("{sf%I3|subf%I3c} %1,%4,%3\n\t{aze|addze} %0,%2"		\
! 	       : "=r" (sh), "=&r" (sl) : "r" (ah), "rI" (al), "r" (bl));\
!     else								\
!       __asm__ ("{sf%I4|subf%I4c} %1,%5,%4\n\t{sfe|subfe} %0,%3,%2"	\
! 	       : "=r" (sh), "=&r" (sl)					\
! 	       : "r" (ah), "r" (bh), "rI" (al), "r" (bl));		\
!   } while (0)
! #define count_leading_zeros(count, x) \
!   __asm__ ("cntlzd %0,%1" : "=r" (count) : "r" (x))
! #define COUNT_LEADING_ZEROS_0 64
! #define umul_ppmm(ph, pl, m0, m1) \
!   do {									\
!     UDItype __m0 = (m0), __m1 = (m1);					\
!     __asm__ ("mulhdu %0,%1,%2" : "=r" (ph) : "%r" (m0), "r" (m1));	\
!     (pl) = __m0 * __m1;							\
!   } while (0)
! #define UMUL_TIME 15
! #define smul_ppmm(ph, pl, m0, m1) \
!   do {									\
!     DItype __m0 = (m0), __m1 = (m1);					\
!     __asm__ ("mulhd %0,%1,%2" : "=r" (ph) : "%r" (m0), "r" (m1));	\
!     (pl) = __m0 * __m1;							\
!   } while (0)
! #define SMUL_TIME 14  /* ??? */
! #define UDIV_TIME 120 /* ??? */
! #endif /* 64-bit PowerPC.  */
  
  #if defined (__ibm032__) /* RT/ROMP */ && W_TYPE_SIZE == 32
  #define add_ssaaaa(sh, sl, ah, al, bh, bl) \

Index: rs6000.h
===================================================================
RCS file: /cvs/gcc/egcs/gcc/config/rs6000/rs6000.h,v
retrieving revision 1.224
diff -c -p -r1.224 rs6000.h
*** rs6000.h	9 Aug 2002 17:52:50 -0000	1.224
--- rs6000.h	27 Aug 2002 14:45:39 -0000
*************** extern int rs6000_default_long_calls;
*** 522,528 ****
--- 522,532 ----
  
  /* Width of a word, in units (bytes).  */
  #define UNITS_PER_WORD (! TARGET_POWERPC64 ? 4 : 8)
+ #ifdef IN_LIBGCC2
+ #define MIN_UNITS_PER_WORD UNITS_PER_WORD
+ #else
  #define MIN_UNITS_PER_WORD 4
+ #endif
  #define UNITS_PER_FP_WORD 8
  #define UNITS_PER_ALTIVEC_WORD 16
  #define UNITS_PER_SPE_WORD 8



More information about the Gcc-patches mailing list