1
0
mirror of https://sourceware.org/git/glibc.git synced 2025-08-07 06:43:00 +03:00

2002-09-26 Roland McGrath <roland@redhat.com>

* stdlib/longlong.h: Replaced with current version from GCC mainline,
	last modified 2002-09-22  Kazu Hirata  <kazu@cs.umass.edu>.
This commit is contained in:
Roland McGrath
2002-09-26 22:32:54 +00:00
parent 0638e1c4ee
commit 41b0afab29

View File

@@ -1,5 +1,7 @@
/* longlong.h -- definitions for mixed size 32/64 bit arithmetic. /* longlong.h -- definitions for mixed size 32/64 bit arithmetic.
Copyright (C) 1991,92,94,95,96,97,98,99,2000,2001 Free Software Foundation, Inc. Copyright (C) 1991, 1992, 1994, 1995, 1996, 1997, 1998, 1999, 2000
Free Software Foundation, Inc.
This file is part of the GNU C Library. This file is part of the GNU C Library.
The GNU C Library is free software; you can redistribute it and/or The GNU C Library is free software; you can redistribute it and/or
@@ -66,7 +68,7 @@
is rounded towards 0. is rounded towards 0.
5) count_leading_zeros(count, x) counts the number of zero-bits from the 5) count_leading_zeros(count, x) counts the number of zero-bits from the
msb to the first non-zero bit in the UWtype X. This is the number of msb to the first nonzero bit in the UWtype X. This is the number of
steps X needs to be shifted left to set the msb. Undefined for X == 0, steps X needs to be shifted left to set the msb. Undefined for X == 0,
unless the symbol COUNT_LEADING_ZEROS_0 is defined to some value. unless the symbol COUNT_LEADING_ZEROS_0 is defined to some value.
@@ -107,51 +109,6 @@
#define __AND_CLOBBER_CC , "cc" #define __AND_CLOBBER_CC , "cc"
#endif /* __GNUC__ < 2 */ #endif /* __GNUC__ < 2 */
#if (defined (__a29k__) || defined (_AM29K)) && W_TYPE_SIZE == 32
#define add_ssaaaa(sh, sl, ah, al, bh, bl) \
__asm__ ("add %1,%4,%5\n" \
"addc %0,%2,%3" \
: "=r" ((USItype) (sh)), \
"=&r" ((USItype) (sl)) \
: "%r" ((USItype) (ah)), \
"rI" ((USItype) (bh)), \
"%r" ((USItype) (al)), \
"rI" ((USItype) (bl)))
#define sub_ddmmss(sh, sl, ah, al, bh, bl) \
__asm__ ("sub %1,%4,%5\n" \
"subc %0,%2,%3" \
: "=r" ((USItype) (sh)), \
"=&r" ((USItype) (sl)) \
: "r" ((USItype) (ah)), \
"rI" ((USItype) (bh)), \
"r" ((USItype) (al)), \
"rI" ((USItype) (bl)))
#define umul_ppmm(xh, xl, m0, m1) \
do { \
USItype __m0 = (m0), __m1 = (m1); \
__asm__ ("multiplu %0,%1,%2" \
: "=r" ((USItype) (xl)) \
: "r" (__m0), \
"r" (__m1)); \
__asm__ ("multmu %0,%1,%2" \
: "=r" ((USItype) (xh)) \
: "r" (__m0), \
"r" (__m1)); \
} while (0)
#define udiv_qrnnd(q, r, n1, n0, d) \
__asm__ ("dividu %0,%3,%4" \
: "=r" ((USItype) (q)), \
"=q" ((USItype) (r)) \
: "1" ((USItype) (n1)), \
"r" ((USItype) (n0)), \
"r" ((USItype) (d)))
#define count_leading_zeros(count, x) \
__asm__ ("clz %0,%1" \
: "=r" ((USItype) (count)) \
: "r" ((USItype) (x)))
#define COUNT_LEADING_ZEROS_0 32
#endif /* __a29k__ */
#if defined (__alpha) && W_TYPE_SIZE == 64 #if defined (__alpha) && W_TYPE_SIZE == 64
#define umul_ppmm(ph, pl, m0, m1) \ #define umul_ppmm(ph, pl, m0, m1) \
do { \ do { \
@@ -169,15 +126,47 @@
(q) = __udiv_qrnnd (&__r, (n1), (n0), (d)); \ (q) = __udiv_qrnnd (&__r, (n1), (n0), (d)); \
(r) = __r; \ (r) = __r; \
} while (0) } while (0)
extern UDItype __udiv_qrnnd (UDItype *, UDItype, UDItype, UDItype); extern UDItype __udiv_qrnnd PARAMS ((UDItype *, UDItype, UDItype, UDItype));
#define UDIV_TIME 220 #define UDIV_TIME 220
#endif /* LONGLONG_STANDALONE */ #endif /* LONGLONG_STANDALONE */
#ifdef __alpha_cix__
#define count_leading_zeros(COUNT,X) \
__asm__("ctlz %1,%0" : "=r"(COUNT) : "r"(X))
#define count_trailing_zeros(COUNT,X) \
__asm__("cttz %1,%0" : "=r"(COUNT) : "r"(X))
#define COUNT_LEADING_ZEROS_0 64
#else
extern const UQItype __clz_tab[];
#define count_leading_zeros(COUNT,X) \
do { \
UDItype __xr = (X), __t, __a; \
__asm__("cmpbge $31,%1,%0" : "=r"(__t) : "r"(__xr)); \
__a = __clz_tab[__t ^ 0xff] - 1; \
__asm__("extbl %1,%2,%0" : "=r"(__t) : "r"(__xr), "r"(__a)); \
(COUNT) = 64 - (__clz_tab[__t] + __a*8); \
} while (0)
#define count_trailing_zeros(COUNT,X) \
do { \
UDItype __xr = (X), __t, __a; \
__asm__("cmpbge $31,%1,%0" : "=r"(__t) : "r"(__xr)); \
__t = ~__t & -~__t; \
__a = ((__t & 0xCC) != 0) * 2; \
__a += ((__t & 0xF0) != 0) * 4; \
__a += ((__t & 0xAA) != 0); \
__asm__("extbl %1,%2,%0" : "=r"(__t) : "r"(__xr), "r"(__a)); \
__a <<= 3; \
__t &= -__t; \
__a += ((__t & 0xCC) != 0) * 2; \
__a += ((__t & 0xF0) != 0) * 4; \
__a += ((__t & 0xAA) != 0); \
(COUNT) = __a; \
} while (0)
#endif /* __alpha_cix__ */
#endif /* __alpha */ #endif /* __alpha */
#if defined (__arc__) && W_TYPE_SIZE == 32 #if defined (__arc__) && W_TYPE_SIZE == 32
#define add_ssaaaa(sh, sl, ah, al, bh, bl) \ #define add_ssaaaa(sh, sl, ah, al, bh, bl) \
__asm__ ("add.f %1, %4, %5\n" \ __asm__ ("add.f %1, %4, %5\n\tadc %0, %2, %3" \
"adc %0, %2, %3" \
: "=r" ((USItype) (sh)), \ : "=r" ((USItype) (sh)), \
"=&r" ((USItype) (sl)) \ "=&r" ((USItype) (sl)) \
: "%r" ((USItype) (ah)), \ : "%r" ((USItype) (ah)), \
@@ -185,18 +174,17 @@ extern UDItype __udiv_qrnnd (UDItype *, UDItype, UDItype, UDItype);
"%r" ((USItype) (al)), \ "%r" ((USItype) (al)), \
"rIJ" ((USItype) (bl))) "rIJ" ((USItype) (bl)))
#define sub_ddmmss(sh, sl, ah, al, bh, bl) \ #define sub_ddmmss(sh, sl, ah, al, bh, bl) \
__asm__ ("sub.f %1, %4, %5\n" \ __asm__ ("sub.f %1, %4, %5\n\tsbc %0, %2, %3" \
"sbc %0, %2, %3" \
: "=r" ((USItype) (sh)), \ : "=r" ((USItype) (sh)), \
"=&r" ((USItype) (sl)) \ "=&r" ((USItype) (sl)) \
: "r" ((USItype) (ah)), \ : "r" ((USItype) (ah)), \
"rIJ" ((USItype) (bh)), \ "rIJ" ((USItype) (bh)), \
"r" ((USItype) (al)), \ "r" ((USItype) (al)), \
"rIJ" ((USItype) (bl))) "rIJ" ((USItype) (bl)))
/* Call libgcc1 routine. */ /* Call libgcc routine. */
#define umul_ppmm(w1, w0, u, v) \ #define umul_ppmm(w1, w0, u, v) \
do { \ do { \
DIunion __w; \ DWunion __w; \
__w.ll = __umulsidi3 (u, v); \ __w.ll = __umulsidi3 (u, v); \
w1 = __w.s.high; \ w1 = __w.s.high; \
w0 = __w.s.low; \ w0 = __w.s.low; \
@@ -207,8 +195,7 @@ UDItype __umulsidi3 (USItype, USItype);
#if defined (__arm__) && W_TYPE_SIZE == 32 #if defined (__arm__) && W_TYPE_SIZE == 32
#define add_ssaaaa(sh, sl, ah, al, bh, bl) \ #define add_ssaaaa(sh, sl, ah, al, bh, bl) \
__asm__ ("adds %1, %4, %5\n" \ __asm__ ("adds %1, %4, %5\n\tadc %0, %2, %3" \
"adc %0, %2, %3" \
: "=r" ((USItype) (sh)), \ : "=r" ((USItype) (sh)), \
"=&r" ((USItype) (sl)) \ "=&r" ((USItype) (sl)) \
: "%r" ((USItype) (ah)), \ : "%r" ((USItype) (ah)), \
@@ -216,8 +203,7 @@ UDItype __umulsidi3 (USItype, USItype);
"%r" ((USItype) (al)), \ "%r" ((USItype) (al)), \
"rI" ((USItype) (bl))) "rI" ((USItype) (bl)))
#define sub_ddmmss(sh, sl, ah, al, bh, bl) \ #define sub_ddmmss(sh, sl, ah, al, bh, bl) \
__asm__ ("subs %1, %4, %5\n" \ __asm__ ("subs %1, %4, %5\n\tsbc %0, %2, %3" \
"sbc %0, %2, %3" \
: "=r" ((USItype) (sh)), \ : "=r" ((USItype) (sh)), \
"=&r" ((USItype) (sl)) \ "=&r" ((USItype) (sl)) \
: "r" ((USItype) (ah)), \ : "r" ((USItype) (ah)), \
@@ -248,77 +234,9 @@ UDItype __umulsidi3 (USItype, USItype);
#define UDIV_TIME 100 #define UDIV_TIME 100
#endif /* __arm__ */ #endif /* __arm__ */
#if defined (__clipper__) && W_TYPE_SIZE == 32
#define umul_ppmm(w1, w0, u, v) \
({union {UDItype __ll; \
struct {USItype __l, __h;} __i; \
} __xx; \
__asm__ ("mulwux %2,%0" \
: "=r" (__xx.__ll) \
: "%0" ((USItype) (u)), \
"r" ((USItype) (v))); \
(w1) = __xx.__i.__h; (w0) = __xx.__i.__l;})
#define smul_ppmm(w1, w0, u, v) \
({union {DItype __ll; \
struct {SItype __l, __h;} __i; \
} __xx; \
__asm__ ("mulwx %2,%0" \
: "=r" (__xx.__ll) \
: "%0" ((SItype) (u)), \
"r" ((SItype) (v))); \
(w1) = __xx.__i.__h; (w0) = __xx.__i.__l;})
#define __umulsidi3(u, v) \
({UDItype __w; \
__asm__ ("mulwux %2,%0" \
: "=r" (__w) \
: "%0" ((USItype) (u)), \
"r" ((USItype) (v))); \
__w; })
#endif /* __clipper__ */
#if defined (__gmicro__) && W_TYPE_SIZE == 32
#define add_ssaaaa(sh, sl, ah, al, bh, bl) \
__asm__ ("add.w %5,%1\n" \
"addx %3,%0" \
: "=g" ((USItype) (sh)), \
"=&g" ((USItype) (sl)) \
: "%0" ((USItype) (ah)), \
"g" ((USItype) (bh)), \
"%1" ((USItype) (al)), \
"g" ((USItype) (bl)))
#define sub_ddmmss(sh, sl, ah, al, bh, bl) \
__asm__ ("sub.w %5,%1\n" \
"subx %3,%0" \
: "=g" ((USItype) (sh)), \
"=&g" ((USItype) (sl)) \
: "0" ((USItype) (ah)), \
"g" ((USItype) (bh)), \
"1" ((USItype) (al)), \
"g" ((USItype) (bl)))
#define umul_ppmm(ph, pl, m0, m1) \
__asm__ ("mulx %3,%0,%1" \
: "=g" ((USItype) (ph)), \
"=r" ((USItype) (pl)) \
: "%0" ((USItype) (m0)), \
"g" ((USItype) (m1)))
#define udiv_qrnnd(q, r, nh, nl, d) \
__asm__ ("divx %4,%0,%1" \
: "=g" ((USItype) (q)), \
"=r" ((USItype) (r)) \
: "1" ((USItype) (nh)), \
"0" ((USItype) (nl)), \
"g" ((USItype) (d)))
#define count_leading_zeros(count, x) \
__asm__ ("bsch/1 %1,%0" \
: "=g" (count) \
: "g" ((USItype) (x)), \
"0" ((USItype) 0))
#endif
#if defined (__hppa) && W_TYPE_SIZE == 32 #if defined (__hppa) && W_TYPE_SIZE == 32
#define add_ssaaaa(sh, sl, ah, al, bh, bl) \ #define add_ssaaaa(sh, sl, ah, al, bh, bl) \
__asm__ ("add %4,%5,%1\n" \ __asm__ ("add %4,%5,%1\n\taddc %2,%3,%0" \
"addc %2,%3,%0" \
: "=r" ((USItype) (sh)), \ : "=r" ((USItype) (sh)), \
"=&r" ((USItype) (sl)) \ "=&r" ((USItype) (sl)) \
: "%rM" ((USItype) (ah)), \ : "%rM" ((USItype) (ah)), \
@@ -326,8 +244,7 @@ UDItype __umulsidi3 (USItype, USItype);
"%rM" ((USItype) (al)), \ "%rM" ((USItype) (al)), \
"rM" ((USItype) (bl))) "rM" ((USItype) (bl)))
#define sub_ddmmss(sh, sl, ah, al, bh, bl) \ #define sub_ddmmss(sh, sl, ah, al, bh, bl) \
__asm__ ("sub %4,%5,%1\n" \ __asm__ ("sub %4,%5,%1\n\tsubb %2,%3,%0" \
"subb %2,%3,%0" \
: "=r" ((USItype) (sh)), \ : "=r" ((USItype) (sh)), \
"=&r" ((USItype) (sl)) \ "=&r" ((USItype) (sl)) \
: "rM" ((USItype) (ah)), \ : "rM" ((USItype) (ah)), \
@@ -372,7 +289,7 @@ UDItype __umulsidi3 (USItype, USItype);
" extru,tr %1,29,2,%1 ; No. Shift down, skip add.\n"\ " extru,tr %1,29,2,%1 ; No. Shift down, skip add.\n"\
" ldo 2(%0),%0 ; Yes. Perform add.\n" \ " ldo 2(%0),%0 ; Yes. Perform add.\n" \
" extru %1,30,1,%1 ; Extract bit 1.\n" \ " extru %1,30,1,%1 ; Extract bit 1.\n" \
"sub %0,%1,%0 ; Subtract it." \ " sub %0,%1,%0 ; Subtract it.\n" \
: "=r" (count), "=r" (__tmp) : "1" (x)); \ : "=r" (count), "=r" (__tmp) : "1" (x)); \
} while (0) } while (0)
#endif #endif
@@ -420,8 +337,7 @@ UDItype __umulsidi3 (USItype, USItype);
#if (defined (__i386__) || defined (__i486__)) && W_TYPE_SIZE == 32 #if (defined (__i386__) || defined (__i486__)) && W_TYPE_SIZE == 32
#define add_ssaaaa(sh, sl, ah, al, bh, bl) \ #define add_ssaaaa(sh, sl, ah, al, bh, bl) \
__asm__ ("addl %5,%1\n" \ __asm__ ("addl %5,%1\n\tadcl %3,%0" \
"adcl %3,%0" \
: "=r" ((USItype) (sh)), \ : "=r" ((USItype) (sh)), \
"=&r" ((USItype) (sl)) \ "=&r" ((USItype) (sl)) \
: "%0" ((USItype) (ah)), \ : "%0" ((USItype) (ah)), \
@@ -429,8 +345,7 @@ UDItype __umulsidi3 (USItype, USItype);
"%1" ((USItype) (al)), \ "%1" ((USItype) (al)), \
"g" ((USItype) (bl))) "g" ((USItype) (bl)))
#define sub_ddmmss(sh, sl, ah, al, bh, bl) \ #define sub_ddmmss(sh, sl, ah, al, bh, bl) \
__asm__ ("subl %5,%1\n" \ __asm__ ("subl %5,%1\n\tsbbl %3,%0" \
"sbbl %3,%0" \
: "=r" ((USItype) (sh)), \ : "=r" ((USItype) (sh)), \
"=&r" ((USItype) (sl)) \ "=&r" ((USItype) (sl)) \
: "0" ((USItype) (ah)), \ : "0" ((USItype) (ah)), \
@@ -443,13 +358,13 @@ UDItype __umulsidi3 (USItype, USItype);
"=d" ((USItype) (w1)) \ "=d" ((USItype) (w1)) \
: "%0" ((USItype) (u)), \ : "%0" ((USItype) (u)), \
"rm" ((USItype) (v))) "rm" ((USItype) (v)))
#define udiv_qrnnd(q, r, n1, n0, d) \ #define udiv_qrnnd(q, r, n1, n0, dv) \
__asm__ ("divl %4" \ __asm__ ("divl %4" \
: "=a" ((USItype) (q)), \ : "=a" ((USItype) (q)), \
"=d" ((USItype) (r)) \ "=d" ((USItype) (r)) \
: "0" ((USItype) (n0)), \ : "0" ((USItype) (n0)), \
"1" ((USItype) (n1)), \ "1" ((USItype) (n1)), \
"rm" ((USItype) (d))) "rm" ((USItype) (dv)))
#define count_leading_zeros(count, x) \ #define count_leading_zeros(count, x) \
do { \ do { \
USItype __cbtmp; \ USItype __cbtmp; \
@@ -463,47 +378,6 @@ UDItype __umulsidi3 (USItype, USItype);
#define UDIV_TIME 40 #define UDIV_TIME 40
#endif /* 80x86 */ #endif /* 80x86 */
#if defined (__i860__) && W_TYPE_SIZE == 32
#if 0
/* Make sure these patterns really improve the code before
switching them on. */
#define add_ssaaaa(sh, sl, ah, al, bh, bl) \
do { \
union \
{ \
DItype __ll; \
struct {USItype __l, __h;} __i; \
} __a, __b, __s; \
__a.__i.__l = (al); \
__a.__i.__h = (ah); \
__b.__i.__l = (bl); \
__b.__i.__h = (bh); \
__asm__ ("fiadd.dd %1,%2,%0" \
: "=f" (__s.__ll) \
: "%f" (__a.__ll), "f" (__b.__ll)); \
(sh) = __s.__i.__h; \
(sl) = __s.__i.__l; \
} while (0)
#define sub_ddmmss(sh, sl, ah, al, bh, bl) \
do { \
union \
{ \
DItype __ll; \
struct {USItype __l, __h;} __i; \
} __a, __b, __s; \
__a.__i.__l = (al); \
__a.__i.__h = (ah); \
__b.__i.__l = (bl); \
__b.__i.__h = (bh); \
__asm__ ("fisub.dd %1,%2,%0" \
: "=f" (__s.__ll) \
: "%f" (__a.__ll), "f" (__b.__ll)); \
(sh) = __s.__i.__h; \
(sl) = __s.__i.__l; \
} while (0)
#endif
#endif /* __i860__ */
#if defined (__i960__) && W_TYPE_SIZE == 32 #if defined (__i960__) && W_TYPE_SIZE == 32
#define umul_ppmm(w1, w0, u, v) \ #define umul_ppmm(w1, w0, u, v) \
({union {UDItype __ll; \ ({union {UDItype __ll; \
@@ -526,9 +400,7 @@ UDItype __umulsidi3 (USItype, USItype);
#if defined (__M32R__) && W_TYPE_SIZE == 32 #if defined (__M32R__) && W_TYPE_SIZE == 32
#define add_ssaaaa(sh, sl, ah, al, bh, bl) \ #define add_ssaaaa(sh, sl, ah, al, bh, bl) \
/* The cmp clears the condition bit. */ \ /* The cmp clears the condition bit. */ \
__asm__ ("cmp %0,%0\n" \ __asm__ ("cmp %0,%0\n\taddx %%5,%1\n\taddx %%3,%0" \
"addx %%5,%1\n" \
"addx %%3,%0" \
: "=r" ((USItype) (sh)), \ : "=r" ((USItype) (sh)), \
"=&r" ((USItype) (sl)) \ "=&r" ((USItype) (sl)) \
: "%0" ((USItype) (ah)), \ : "%0" ((USItype) (ah)), \
@@ -538,9 +410,7 @@ UDItype __umulsidi3 (USItype, USItype);
: "cbit") : "cbit")
#define sub_ddmmss(sh, sl, ah, al, bh, bl) \ #define sub_ddmmss(sh, sl, ah, al, bh, bl) \
/* The cmp clears the condition bit. */ \ /* The cmp clears the condition bit. */ \
__asm__ ("cmp %0,%0\n" \ __asm__ ("cmp %0,%0\n\tsubx %5,%1\n\tsubx %3,%0" \
"subx %5,%1\n" \
"subx %3,%0" \
: "=r" ((USItype) (sh)), \ : "=r" ((USItype) (sh)), \
"=&r" ((USItype) (sl)) \ "=&r" ((USItype) (sl)) \
: "0" ((USItype) (ah)), \ : "0" ((USItype) (ah)), \
@@ -552,8 +422,7 @@ UDItype __umulsidi3 (USItype, USItype);
#if defined (__mc68000__) && W_TYPE_SIZE == 32 #if defined (__mc68000__) && W_TYPE_SIZE == 32
#define add_ssaaaa(sh, sl, ah, al, bh, bl) \ #define add_ssaaaa(sh, sl, ah, al, bh, bl) \
__asm__ ("add%.l %5,%1\n" \ __asm__ ("add%.l %5,%1\n\taddx%.l %3,%0" \
"addx%.l %3,%0" \
: "=d" ((USItype) (sh)), \ : "=d" ((USItype) (sh)), \
"=&d" ((USItype) (sl)) \ "=&d" ((USItype) (sl)) \
: "%0" ((USItype) (ah)), \ : "%0" ((USItype) (ah)), \
@@ -561,8 +430,7 @@ UDItype __umulsidi3 (USItype, USItype);
"%1" ((USItype) (al)), \ "%1" ((USItype) (al)), \
"g" ((USItype) (bl))) "g" ((USItype) (bl)))
#define sub_ddmmss(sh, sl, ah, al, bh, bl) \ #define sub_ddmmss(sh, sl, ah, al, bh, bl) \
__asm__ ("sub%.l %5,%1\n" \ __asm__ ("sub%.l %5,%1\n\tsubx%.l %3,%0" \
"subx%.l %3,%0" \
: "=d" ((USItype) (sh)), \ : "=d" ((USItype) (sh)), \
"=&d" ((USItype) (sl)) \ "=&d" ((USItype) (sl)) \
: "0" ((USItype) (ah)), \ : "0" ((USItype) (ah)), \
@@ -574,8 +442,7 @@ UDItype __umulsidi3 (USItype, USItype);
#if defined (__mc68020__) || defined(mc68020) \ #if defined (__mc68020__) || defined(mc68020) \
|| defined(__mc68030__) || defined(mc68030) \ || defined(__mc68030__) || defined(mc68030) \
|| defined(__mc68040__) || defined(mc68040) \ || defined(__mc68040__) || defined(mc68040) \
|| defined(__mcpu32__) || defined(mcpu32) \ || defined(__mcpu32__) || defined(mcpu32)
|| defined(__NeXT__)
#define umul_ppmm(w1, w0, u, v) \ #define umul_ppmm(w1, w0, u, v) \
__asm__ ("mulu%.l %3,%1:%0" \ __asm__ ("mulu%.l %3,%1:%0" \
: "=d" ((USItype) (w0)), \ : "=d" ((USItype) (w0)), \
@@ -643,8 +510,7 @@ UDItype __umulsidi3 (USItype, USItype);
#if defined (__mc68020__) || defined(mc68020) \ #if defined (__mc68020__) || defined(mc68020) \
|| defined(__mc68030__) || defined(mc68030) \ || defined(__mc68030__) || defined(mc68030) \
|| defined(__mc68040__) || defined(mc68040) \ || defined(__mc68040__) || defined(mc68040) \
|| defined(__mc68060__) || defined(mc68060) \ || defined(__mc68060__) || defined(mc68060)
|| defined(__NeXT__)
#define count_leading_zeros(count, x) \ #define count_leading_zeros(count, x) \
__asm__ ("bfffo %1{%b2:%b2},%0" \ __asm__ ("bfffo %1{%b2:%b2},%0" \
: "=d" ((USItype) (count)) \ : "=d" ((USItype) (count)) \
@@ -654,8 +520,7 @@ UDItype __umulsidi3 (USItype, USItype);
#if defined (__m88000__) && W_TYPE_SIZE == 32 #if defined (__m88000__) && W_TYPE_SIZE == 32
#define add_ssaaaa(sh, sl, ah, al, bh, bl) \ #define add_ssaaaa(sh, sl, ah, al, bh, bl) \
__asm__ ("addu.co %1,%r4,%r5\n" \ __asm__ ("addu.co %1,%r4,%r5\n\taddu.ci %0,%r2,%r3" \
"addu.ci %0,%r2,%r3" \
: "=r" ((USItype) (sh)), \ : "=r" ((USItype) (sh)), \
"=&r" ((USItype) (sl)) \ "=&r" ((USItype) (sl)) \
: "%rJ" ((USItype) (ah)), \ : "%rJ" ((USItype) (ah)), \
@@ -663,8 +528,7 @@ UDItype __umulsidi3 (USItype, USItype);
"%rJ" ((USItype) (al)), \ "%rJ" ((USItype) (al)), \
"rJ" ((USItype) (bl))) "rJ" ((USItype) (bl)))
#define sub_ddmmss(sh, sl, ah, al, bh, bl) \ #define sub_ddmmss(sh, sl, ah, al, bh, bl) \
__asm__ ("subu.co %1,%r4,%r5\n" \ __asm__ ("subu.co %1,%r4,%r5\n\tsubu.ci %0,%r2,%r3" \
"subu.ci %0,%r2,%r3" \
: "=r" ((USItype) (sh)), \ : "=r" ((USItype) (sh)), \
"=&r" ((USItype) (sl)) \ "=&r" ((USItype) (sl)) \
: "rJ" ((USItype) (ah)), \ : "rJ" ((USItype) (ah)), \
@@ -751,7 +615,7 @@ UDItype __umulsidi3 (USItype, USItype);
"g" ((USItype) (d))); \ "g" ((USItype) (d))); \
(r) = __xx.__i.__l; (q) = __xx.__i.__h; }) (r) = __xx.__i.__l; (q) = __xx.__i.__h; })
#define count_trailing_zeros(count,x) \ #define count_trailing_zeros(count,x) \
do { do { \
__asm__ ("ffsd %2,%0" \ __asm__ ("ffsd %2,%0" \
: "=r" ((USItype) (count)) \ : "=r" ((USItype) (count)) \
: "0" ((USItype) 0), \ : "0" ((USItype) 0), \
@@ -759,259 +623,139 @@ UDItype __umulsidi3 (USItype, USItype);
} while (0) } while (0)
#endif /* __ns32000__ */ #endif /* __ns32000__ */
#if (defined (_ARCH_PPC) || defined (_IBMR2)) /* FIXME: We should test _IBMR2 here when we add assembly support for the
#if W_TYPE_SIZE == 32 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) \ #define add_ssaaaa(sh, sl, ah, al, bh, bl) \
do { \ do { \
if (__builtin_constant_p (bh) && (bh) == 0) \ if (__builtin_constant_p (bh) && (bh) == 0) \
__asm__ ("{a%I4|add%I4c} %1,%3,%4\n\t{aze|addze} %0,%2" \ __asm__ ("{a%I4|add%I4c} %1,%3,%4\n\t{aze|addze} %0,%2" \
: "=r" ((USItype) (sh)), \ : "=r" (sh), "=&r" (sl) : "r" (ah), "%r" (al), "rI" (bl));\
"=&r" ((USItype) (sl)) \
: "%r" ((USItype) (ah)), \
"%r" ((USItype) (al)), \
"rI" ((USItype) (bl))); \
else if (__builtin_constant_p (bh) && (bh) == ~(USItype) 0) \ else if (__builtin_constant_p (bh) && (bh) == ~(USItype) 0) \
__asm__ ("{a%I4|add%I4c} %1,%3,%4\n\t{ame|addme} %0,%2" \ __asm__ ("{a%I4|add%I4c} %1,%3,%4\n\t{ame|addme} %0,%2" \
: "=r" ((USItype) (sh)), \ : "=r" (sh), "=&r" (sl) : "r" (ah), "%r" (al), "rI" (bl));\
"=&r" ((USItype) (sl)) \
: "%r" ((USItype) (ah)), \
"%r" ((USItype) (al)), \
"rI" ((USItype) (bl))); \
else \ else \
__asm__ ("{a%I5|add%I5c} %1,%4,%5\n\t{ae|adde} %0,%2,%3" \ __asm__ ("{a%I5|add%I5c} %1,%4,%5\n\t{ae|adde} %0,%2,%3" \
: "=r" ((USItype) (sh)), \ : "=r" (sh), "=&r" (sl) \
"=&r" ((USItype) (sl)) \ : "%r" (ah), "r" (bh), "%r" (al), "rI" (bl)); \
: "%r" ((USItype) (ah)), \
"r" ((USItype) (bh)), \
"%r" ((USItype) (al)), \
"rI" ((USItype) (bl))); \
} while (0) } while (0)
#define sub_ddmmss(sh, sl, ah, al, bh, bl) \ #define sub_ddmmss(sh, sl, ah, al, bh, bl) \
do { \ do { \
if (__builtin_constant_p (ah) && (ah) == 0) \ if (__builtin_constant_p (ah) && (ah) == 0) \
__asm__ ("{sf%I3|subf%I3c} %1,%4,%3\n\t{sfze|subfze} %0,%2" \ __asm__ ("{sf%I3|subf%I3c} %1,%4,%3\n\t{sfze|subfze} %0,%2" \
: "=r" ((USItype) (sh)), \ : "=r" (sh), "=&r" (sl) : "r" (bh), "rI" (al), "r" (bl));\
"=&r" ((USItype) (sl)) \
: "r" ((USItype) (bh)), \
"rI" ((USItype) (al)), \
"r" ((USItype) (bl))); \
else if (__builtin_constant_p (ah) && (ah) == ~(USItype) 0) \ else if (__builtin_constant_p (ah) && (ah) == ~(USItype) 0) \
__asm__ ("{sf%I3|subf%I3c} %1,%4,%3\n\t{sfme|subfme} %0,%2" \ __asm__ ("{sf%I3|subf%I3c} %1,%4,%3\n\t{sfme|subfme} %0,%2" \
: "=r" ((USItype) (sh)), \ : "=r" (sh), "=&r" (sl) : "r" (bh), "rI" (al), "r" (bl));\
"=&r" ((USItype) (sl)) \
: "r" ((USItype) (bh)), \
"rI" ((USItype) (al)), \
"r" ((USItype) (bl))); \
else if (__builtin_constant_p (bh) && (bh) == 0) \ else if (__builtin_constant_p (bh) && (bh) == 0) \
__asm__ ("{sf%I3|subf%I3c} %1,%4,%3\n\t{ame|addme} %0,%2" \ __asm__ ("{sf%I3|subf%I3c} %1,%4,%3\n\t{ame|addme} %0,%2" \
: "=r" ((USItype) (sh)), \ : "=r" (sh), "=&r" (sl) : "r" (ah), "rI" (al), "r" (bl));\
"=&r" ((USItype) (sl)) \
: "r" ((USItype) (ah)), \
"rI" ((USItype) (al)), \
"r" ((USItype) (bl))); \
else if (__builtin_constant_p (bh) && (bh) == ~(USItype) 0) \ else if (__builtin_constant_p (bh) && (bh) == ~(USItype) 0) \
__asm__ ("{sf%I3|subf%I3c} %1,%4,%3\n\t{aze|addze} %0,%2" \ __asm__ ("{sf%I3|subf%I3c} %1,%4,%3\n\t{aze|addze} %0,%2" \
: "=r" ((USItype) (sh)), \ : "=r" (sh), "=&r" (sl) : "r" (ah), "rI" (al), "r" (bl));\
"=&r" ((USItype) (sl)) \
: "r" ((USItype) (ah)), \
"rI" ((USItype) (al)), \
"r" ((USItype) (bl))); \
else \ else \
__asm__ ("{sf%I4|subf%I4c} %1,%5,%4\n\t{sfe|subfe} %0,%3,%2" \ __asm__ ("{sf%I4|subf%I4c} %1,%5,%4\n\t{sfe|subfe} %0,%3,%2" \
: "=r" ((USItype) (sh)), \ : "=r" (sh), "=&r" (sl) \
"=&r" ((USItype) (sl)) \ : "r" (ah), "r" (bh), "rI" (al), "r" (bl)); \
: "r" ((USItype) (ah)), \
"r" ((USItype) (bh)), \
"rI" ((USItype) (al)), \
"r" ((USItype) (bl))); \
} while (0) } while (0)
#define count_leading_zeros(count, x) \ #define count_leading_zeros(count, x) \
__asm__ ("{cntlz|cntlzw} %0,%1" \ __asm__ ("{cntlz|cntlzw} %0,%1" : "=r" (count) : "r" (x))
: "=r" ((USItype) (count)) \
: "r" ((USItype) (x)))
#define COUNT_LEADING_ZEROS_0 32 #define COUNT_LEADING_ZEROS_0 32
#if defined (_ARCH_PPC) #if defined (_ARCH_PPC) || defined (__powerpc__) || defined (__POWERPC__) \
|| defined (__ppc__) || defined (PPC) || defined (__vxworks__)
#define umul_ppmm(ph, pl, m0, m1) \ #define umul_ppmm(ph, pl, m0, m1) \
do { \ do { \
USItype __m0 = (m0), __m1 = (m1); \ USItype __m0 = (m0), __m1 = (m1); \
__asm__ ("mulhwu %0,%1,%2" \ __asm__ ("mulhwu %0,%1,%2" : "=r" (ph) : "%r" (m0), "r" (m1)); \
: "=r" ((USItype) ph) \
: "%r" (__m0), \
"r" (__m1)); \
(pl) = __m0 * __m1; \ (pl) = __m0 * __m1; \
} while (0) } while (0)
#define UMUL_TIME 15 #define UMUL_TIME 15
#define smul_ppmm(ph, pl, m0, m1) \ #define smul_ppmm(ph, pl, m0, m1) \
do { \ do { \
SItype __m0 = (m0), __m1 = (m1); \ SItype __m0 = (m0), __m1 = (m1); \
__asm__ ("mulhw %0,%1,%2" \ __asm__ ("mulhw %0,%1,%2" : "=r" (ph) : "%r" (m0), "r" (m1)); \
: "=r" ((SItype) ph) \
: "%r" (__m0), \
"r" (__m1)); \
(pl) = __m0 * __m1; \ (pl) = __m0 * __m1; \
} while (0) } while (0)
#define SMUL_TIME 14 #define SMUL_TIME 14
#define UDIV_TIME 120 #define UDIV_TIME 120
#else #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 UMUL_TIME 8
#define smul_ppmm(xh, xl, m0, m1) \ #define smul_ppmm(xh, xl, m0, m1) \
__asm__ ("mul %0,%2,%3" \ __asm__ ("mul %0,%2,%3" : "=r" (xh), "=q" (xl) : "r" (m0), "r" (m1))
: "=r" ((SItype) (xh)), \
"=q" ((SItype) (xl)) \
: "r" (m0), \
"r" (m1))
#define SMUL_TIME 4 #define SMUL_TIME 4
#define sdiv_qrnnd(q, r, nh, nl, d) \ #define sdiv_qrnnd(q, r, nh, nl, d) \
__asm__ ("div %0,%2,%4" \ __asm__ ("div %0,%2,%4" : "=r" (q), "=q" (r) : "r" (nh), "1" (nl), "r" (d))
: "=r" ((SItype) (q)), "=q" ((SItype) (r)) \
: "r" ((SItype) (nh)), "1" ((SItype) (nl)), "r" ((SItype) (d)))
#define UDIV_TIME 100 #define UDIV_TIME 100
#endif #endif
#else /* W_TYPE_SIZE != 32. */ #endif /* 32-bit POWER architecture variants. */
/* Must be powerpc64. */
/* 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) \ #define add_ssaaaa(sh, sl, ah, al, bh, bl) \
do { \ do { \
if (__builtin_constant_p (bh) && (bh) == 0) \ if (__builtin_constant_p (bh) && (bh) == 0) \
__asm__ ("{a%I4|add%I4c} %1,%3,%4\n\t{aze|addze} %0,%2" \ __asm__ ("{a%I4|add%I4c} %1,%3,%4\n\t{aze|addze} %0,%2" \
: "=r" ((UDItype) (sh)), \ : "=r" (sh), "=&r" (sl) : "r" (ah), "%r" (al), "rI" (bl));\
"=&r" ((UDItype) (sl)) \
: "%r" ((UDItype) (ah)), \
"%r" ((UDItype) (al)), \
"rI" ((UDItype) (bl))); \
else if (__builtin_constant_p (bh) && (bh) == ~(UDItype) 0) \ else if (__builtin_constant_p (bh) && (bh) == ~(UDItype) 0) \
__asm__ ("{a%I4|add%I4c} %1,%3,%4\n\t{ame|addme} %0,%2" \ __asm__ ("{a%I4|add%I4c} %1,%3,%4\n\t{ame|addme} %0,%2" \
: "=r" ((UDItype) (sh)), \ : "=r" (sh), "=&r" (sl) : "r" (ah), "%r" (al), "rI" (bl));\
"=&r" ((UDItype) (sl)) \
: "%r" ((UDItype) (ah)), \
"%r" ((UDItype) (al)), \
"rI" ((UDItype) (bl))); \
else \ else \
__asm__ ("{a%I5|add%I5c} %1,%4,%5\n\t{ae|adde} %0,%2,%3" \ __asm__ ("{a%I5|add%I5c} %1,%4,%5\n\t{ae|adde} %0,%2,%3" \
: "=r" ((UDItype) (sh)), \ : "=r" (sh), "=&r" (sl) \
"=&r" ((UDItype) (sl)) \ : "%r" (ah), "r" (bh), "%r" (al), "rI" (bl)); \
: "%r" ((UDItype) (ah)), \
"r" ((UDItype) (bh)), \
"%r" ((UDItype) (al)), \
"rI" ((UDItype) (bl))); \
} while (0) } while (0)
#define sub_ddmmss(sh, sl, ah, al, bh, bl) \ #define sub_ddmmss(sh, sl, ah, al, bh, bl) \
do { \ do { \
if (__builtin_constant_p (ah) && (ah) == 0) \ if (__builtin_constant_p (ah) && (ah) == 0) \
__asm__ ("{sf%I3|subf%I3c} %1,%4,%3\n\t{sfze|subfze} %0,%2" \ __asm__ ("{sf%I3|subf%I3c} %1,%4,%3\n\t{sfze|subfze} %0,%2" \
: "=r" ((UDItype) (sh)), \ : "=r" (sh), "=&r" (sl) : "r" (bh), "rI" (al), "r" (bl));\
"=&r" ((UDItype) (sl)) \
: "r" ((UDItype) (bh)), \
"rI" ((UDItype) (al)), \
"r" ((UDItype) (bl))); \
else if (__builtin_constant_p (ah) && (ah) == ~(UDItype) 0) \ else if (__builtin_constant_p (ah) && (ah) == ~(UDItype) 0) \
__asm__ ("{sf%I3|subf%I3c} %1,%4,%3\n\t{sfme|subfme} %0,%2" \ __asm__ ("{sf%I3|subf%I3c} %1,%4,%3\n\t{sfme|subfme} %0,%2" \
: "=r" ((UDItype) (sh)), \ : "=r" (sh), "=&r" (sl) : "r" (bh), "rI" (al), "r" (bl));\
"=&r" ((UDItype) (sl)) \
: "r" ((UDItype) (bh)), \
"rI" ((UDItype) (al)), \
"r" ((UDItype) (bl))); \
else if (__builtin_constant_p (bh) && (bh) == 0) \ else if (__builtin_constant_p (bh) && (bh) == 0) \
__asm__ ("{sf%I3|subf%I3c} %1,%4,%3\n\t{ame|addme} %0,%2" \ __asm__ ("{sf%I3|subf%I3c} %1,%4,%3\n\t{ame|addme} %0,%2" \
: "=r" ((UDItype) (sh)), \ : "=r" (sh), "=&r" (sl) : "r" (ah), "rI" (al), "r" (bl));\
"=&r" ((UDItype) (sl)) \
: "r" ((UDItype) (ah)), \
"rI" ((UDItype) (al)), \
"r" ((UDItype) (bl))); \
else if (__builtin_constant_p (bh) && (bh) == ~(UDItype) 0) \ else if (__builtin_constant_p (bh) && (bh) == ~(UDItype) 0) \
__asm__ ("{sf%I3|subf%I3c} %1,%4,%3\n\t{aze|addze} %0,%2" \ __asm__ ("{sf%I3|subf%I3c} %1,%4,%3\n\t{aze|addze} %0,%2" \
: "=r" ((UDItype) (sh)), \ : "=r" (sh), "=&r" (sl) : "r" (ah), "rI" (al), "r" (bl));\
"=&r" ((UDItype) (sl)) \
: "r" ((UDItype) (ah)), \
"rI" ((UDItype) (al)), \
"r" ((UDItype) (bl))); \
else \ else \
__asm__ ("{sf%I4|subf%I4c} %1,%5,%4\n\t{sfe|subfe} %0,%3,%2" \ __asm__ ("{sf%I4|subf%I4c} %1,%5,%4\n\t{sfe|subfe} %0,%3,%2" \
: "=r" ((UDItype) (sh)), \ : "=r" (sh), "=&r" (sl) \
"=&r" ((UDItype) (sl)) \ : "r" (ah), "r" (bh), "rI" (al), "r" (bl)); \
: "r" ((UDItype) (ah)), \
"r" ((UDItype) (bh)), \
"rI" ((UDItype) (al)), \
"r" ((UDItype) (bl))); \
} while (0) } while (0)
#define count_leading_zeros(count, x) \ #define count_leading_zeros(count, x) \
__asm__ ("{cntlz|cntlzd} %0,%1" \ __asm__ ("cntlzd %0,%1" : "=r" (count) : "r" (x))
: "=r" (count) \
: "r" ((UDItype) (x)))
#define COUNT_LEADING_ZEROS_0 64 #define COUNT_LEADING_ZEROS_0 64
#define umul_ppmm(ph, pl, m0, m1) \ #define umul_ppmm(ph, pl, m0, m1) \
do { \ do { \
UDItype __m0 = (m0), __m1 = (m1); \ UDItype __m0 = (m0), __m1 = (m1); \
__asm__ ("mulhdu %0,%1,%2" \ __asm__ ("mulhdu %0,%1,%2" : "=r" (ph) : "%r" (m0), "r" (m1)); \
: "=r" ((UDItype) ph) \
: "%r" (__m0), \
"r" (__m1)); \
(pl) = __m0 * __m1; \ (pl) = __m0 * __m1; \
} while (0) } while (0)
#define UMUL_TIME 16 #define UMUL_TIME 15
#define smul_ppmm(ph, pl, m0, m1) \ #define smul_ppmm(ph, pl, m0, m1) \
do { \ do { \
DItype __m0 = (m0), __m1 = (m1); \ DItype __m0 = (m0), __m1 = (m1); \
__asm__ ("mulhd %0,%1,%2" \ __asm__ ("mulhd %0,%1,%2" : "=r" (ph) : "%r" (m0), "r" (m1)); \
: "=r" ((DItype) ph) \
: "%r" (__m0), \
"r" (__m1)); \
(pl) = __m0 * __m1; \ (pl) = __m0 * __m1; \
} while (0) } while (0)
#define SMUL_TIME 16 #define SMUL_TIME 14 /* ??? */
#define UDIV_TIME 72 #define UDIV_TIME 120 /* ??? */
#endif /* W_TYPE_SIZE == 32 */ #endif /* 64-bit PowerPC. */
#endif /* Power architecture variants. */
#if defined (__pyr__) && W_TYPE_SIZE == 32
#define add_ssaaaa(sh, sl, ah, al, bh, bl) \
__asm__ ("addw %5,%1\n" \
"addwc %3,%0" \
: "=r" ((USItype) (sh)), \
"=&r" ((USItype) (sl)) \
: "%0" ((USItype) (ah)), \
"g" ((USItype) (bh)), \
"%1" ((USItype) (al)), \
"g" ((USItype) (bl)))
#define sub_ddmmss(sh, sl, ah, al, bh, bl) \
__asm__ ("subw %5,%1\n" \
"subwb %3,%0" \
: "=r" ((USItype) (sh)), \
"=&r" ((USItype) (sl)) \
: "0" ((USItype) (ah)), \
"g" ((USItype) (bh)), \
"1" ((USItype) (al)), \
"g" ((USItype) (bl)))
/* This insn works on Pyramids with AP, XP, or MI CPUs, but not with SP. */
#define umul_ppmm(w1, w0, u, v) \
({union {UDItype __ll; \
struct {USItype __h, __l;} __i; \
} __xx; \
__asm__ ("movw %1,%R0\n" \
"uemul %2,%0" \
: "=&r" (__xx.__ll) \
: "g" ((USItype) (u)), \
"g" ((USItype) (v))); \
(w1) = __xx.__i.__h; (w0) = __xx.__i.__l;})
#endif /* __pyr__ */
#if defined (__ibm032__) /* RT/ROMP */ && W_TYPE_SIZE == 32 #if defined (__ibm032__) /* RT/ROMP */ && W_TYPE_SIZE == 32
#define add_ssaaaa(sh, sl, ah, al, bh, bl) \ #define add_ssaaaa(sh, sl, ah, al, bh, bl) \
__asm__ ("a %1,%5\n" \ __asm__ ("a %1,%5\n\tae %0,%3" \
"ae %0,%3" \
: "=r" ((USItype) (sh)), \ : "=r" ((USItype) (sh)), \
"=&r" ((USItype) (sl)) \ "=&r" ((USItype) (sl)) \
: "%0" ((USItype) (ah)), \ : "%0" ((USItype) (ah)), \
@@ -1019,8 +763,7 @@ UDItype __umulsidi3 (USItype, USItype);
"%1" ((USItype) (al)), \ "%1" ((USItype) (al)), \
"r" ((USItype) (bl))) "r" ((USItype) (bl)))
#define sub_ddmmss(sh, sl, ah, al, bh, bl) \ #define sub_ddmmss(sh, sl, ah, al, bh, bl) \
__asm__ ("s %1,%5\n" \ __asm__ ("s %1,%5\n\tse %0,%3" \
"se %0,%3" \
: "=r" ((USItype) (sh)), \ : "=r" ((USItype) (sh)), \
"=&r" ((USItype) (sl)) \ "=&r" ((USItype) (sl)) \
: "0" ((USItype) (ah)), \ : "0" ((USItype) (ah)), \
@@ -1080,9 +823,7 @@ UDItype __umulsidi3 (USItype, USItype);
#if defined (__sh2__) && W_TYPE_SIZE == 32 #if defined (__sh2__) && W_TYPE_SIZE == 32
#define umul_ppmm(w1, w0, u, v) \ #define umul_ppmm(w1, w0, u, v) \
__asm__ ( \ __asm__ ( \
"dmulu.l %2,%3\n" \ "dmulu.l %2,%3\n\tsts macl,%1\n\tsts mach,%0" \
"sts macl,%1\n" \
"sts mach,%0" \
: "=r" ((USItype)(w1)), \ : "=r" ((USItype)(w1)), \
"=r" ((USItype)(w0)) \ "=r" ((USItype)(w0)) \
: "r" ((USItype)(u)), \ : "r" ((USItype)(u)), \
@@ -1091,11 +832,25 @@ UDItype __umulsidi3 (USItype, USItype);
#define UMUL_TIME 5 #define UMUL_TIME 5
#endif #endif
#if defined (__sparc__) && !defined(__arch64__) \ #if defined (__SH5__) && __SHMEDIA__ && W_TYPE_SIZE == 32
&& !defined(__sparcv9) && W_TYPE_SIZE == 32 #define __umulsidi3(u,v) ((UDItype)(USItype)u*(USItype)v)
#define count_leading_zeros(count, x) \
do \
{ \
UDItype x_ = (USItype)(x); \
SItype c_; \
\
__asm__ ("nsb %1, %0" : "=r" (c_) : "r" (x_)); \
(count) = c_ - 31; \
} \
while (0)
#define COUNT_LEADING_ZEROS_0 32
#endif
#if defined (__sparc__) && !defined (__arch64__) && !defined (__sparcv9) \
&& W_TYPE_SIZE == 32
#define add_ssaaaa(sh, sl, ah, al, bh, bl) \ #define add_ssaaaa(sh, sl, ah, al, bh, bl) \
__asm__ ("addcc %r4,%5,%1\n" \ __asm__ ("addcc %r4,%5,%1\n\taddx %r2,%3,%0" \
"addx %r2,%3,%0" \
: "=r" ((USItype) (sh)), \ : "=r" ((USItype) (sh)), \
"=&r" ((USItype) (sl)) \ "=&r" ((USItype) (sl)) \
: "%rJ" ((USItype) (ah)), \ : "%rJ" ((USItype) (ah)), \
@@ -1104,8 +859,7 @@ UDItype __umulsidi3 (USItype, USItype);
"rI" ((USItype) (bl)) \ "rI" ((USItype) (bl)) \
__CLOBBER_CC) __CLOBBER_CC)
#define sub_ddmmss(sh, sl, ah, al, bh, bl) \ #define sub_ddmmss(sh, sl, ah, al, bh, bl) \
__asm__ ("subcc %r4,%5,%1\n" \ __asm__ ("subcc %r4,%5,%1\n\tsubx %r2,%3,%0" \
"subx %r2,%3,%0" \
: "=r" ((USItype) (sh)), \ : "=r" ((USItype) (sh)), \
"=&r" ((USItype) (sl)) \ "=&r" ((USItype) (sl)) \
: "rJ" ((USItype) (ah)), \ : "rJ" ((USItype) (ah)), \
@@ -1120,13 +874,13 @@ UDItype __umulsidi3 (USItype, USItype);
"=r" ((USItype) (w0)) \ "=r" ((USItype) (w0)) \
: "r" ((USItype) (u)), \ : "r" ((USItype) (u)), \
"r" ((USItype) (v))) "r" ((USItype) (v)))
#define udiv_qrnnd(q, r, n1, n0, d) \ #define udiv_qrnnd(__q, __r, __n1, __n0, __d) \
__asm__ ("mov %2,%%y;nop;nop;nop;udiv %3,%4,%0;umul %0,%4,%1;sub %3,%1,%1"\ __asm__ ("mov %2,%%y;nop;nop;nop;udiv %3,%4,%0;umul %0,%4,%1;sub %3,%1,%1"\
: "=&r" ((USItype) (q)), \ : "=&r" ((USItype) (__q)), \
"=&r" ((USItype) (r)) \ "=&r" ((USItype) (__r)) \
: "r" ((USItype) (n1)), \ : "r" ((USItype) (__n1)), \
"r" ((USItype) (n0)), \ "r" ((USItype) (__n0)), \
"r" ((USItype) (d))) "r" ((USItype) (__d)))
#else #else
#if defined (__sparclite__) #if defined (__sparclite__)
/* This has hardware multiply but not divide. It also has two additional /* This has hardware multiply but not divide. It also has two additional
@@ -1245,7 +999,7 @@ UDItype __umulsidi3 (USItype, USItype);
#define UMUL_TIME 39 /* 39 instructions */ #define UMUL_TIME 39 /* 39 instructions */
/* It's quite necessary to add this much assembler for the sparc. /* It's quite necessary to add this much assembler for the sparc.
The default udiv_qrnnd (in C) is more than 10 times slower! */ The default udiv_qrnnd (in C) is more than 10 times slower! */
#define udiv_qrnnd(q, r, n1, n0, d) \ #define udiv_qrnnd(__q, __r, __n1, __n0, __d) \
__asm__ ("! Inlined udiv_qrnnd\n" \ __asm__ ("! Inlined udiv_qrnnd\n" \
" mov 32,%%g1\n" \ " mov 32,%%g1\n" \
" subcc %1,%2,%%g0\n" \ " subcc %1,%2,%%g0\n" \
@@ -1270,22 +1024,22 @@ UDItype __umulsidi3 (USItype, USItype);
" sub %1,%2,%1\n" \ " sub %1,%2,%1\n" \
"3: xnor %0,0,%0\n" \ "3: xnor %0,0,%0\n" \
" ! End of inline udiv_qrnnd" \ " ! End of inline udiv_qrnnd" \
: "=&r" ((USItype) (q)), \ : "=&r" ((USItype) (__q)), \
"=&r" ((USItype) (r)) \ "=&r" ((USItype) (__r)) \
: "r" ((USItype) (d)), \ : "r" ((USItype) (__d)), \
"1" ((USItype) (n1)), \ "1" ((USItype) (__n1)), \
"0" ((USItype) (n0)) : "g1" __AND_CLOBBER_CC) "0" ((USItype) (__n0)) : "g1" __AND_CLOBBER_CC)
#define UDIV_TIME (3+7*32) /* 7 instructions/iteration. 32 iterations. */ #define UDIV_TIME (3+7*32) /* 7 instructions/iteration. 32 iterations. */
#endif /* __sparclite__ */ #endif /* __sparclite__ */
#endif /* __sparc_v8__ */ #endif /* __sparc_v8__ */
#endif /* __sparc__ */ #endif /* sparc32 */
#if ((defined (__sparc__) && defined (__arch64__)) \ #if ((defined (__sparc__) && defined (__arch64__)) || defined (__sparcv9)) \
|| defined (__sparcv9)) && W_TYPE_SIZE == 64 && W_TYPE_SIZE == 64
#define add_ssaaaa(sh, sl, ah, al, bh, bl) \ #define add_ssaaaa(sh, sl, ah, al, bh, bl) \
__asm__ ("addcc %r4,%5,%1\n" \ __asm__ ("addcc %r4,%5,%1\n\t" \
"add %r2,%3,%0\n" \ "add %r2,%3,%0\n\t" \
"bcs,a,pn %%xcc, 1f\n" \ "bcs,a,pn %%xcc, 1f\n\t" \
"add %0, 1, %0\n" \ "add %0, 1, %0\n" \
"1:" \ "1:" \
: "=r" ((UDItype)(sh)), \ : "=r" ((UDItype)(sh)), \
@@ -1297,10 +1051,10 @@ UDItype __umulsidi3 (USItype, USItype);
__CLOBBER_CC) __CLOBBER_CC)
#define sub_ddmmss(sh, sl, ah, al, bh, bl) \ #define sub_ddmmss(sh, sl, ah, al, bh, bl) \
__asm__ ("subcc %r4,%5,%1\n" \ __asm__ ("subcc %r4,%5,%1\n\t" \
"sub %r2,%3,%0\n" \ "sub %r2,%3,%0\n\t" \
"bcs,a,pn %%xcc, 1f\n" \ "bcs,a,pn %%xcc, 1f\n\t" \
"sub %0, 1, %0\n" \ "sub %0, 1, %0\n\t" \
"1:" \ "1:" \
: "=r" ((UDItype)(sh)), \ : "=r" ((UDItype)(sh)), \
"=&r" ((UDItype)(sl)) \ "=&r" ((UDItype)(sl)) \
@@ -1314,26 +1068,26 @@ UDItype __umulsidi3 (USItype, USItype);
do { \ do { \
UDItype tmp1, tmp2, tmp3, tmp4; \ UDItype tmp1, tmp2, tmp3, tmp4; \
__asm__ __volatile__ ( \ __asm__ __volatile__ ( \
"srl %7,0,%3\n" \ "srl %7,0,%3\n\t" \
"mulx %3,%6,%1\n" \ "mulx %3,%6,%1\n\t" \
"srlx %6,32,%2\n" \ "srlx %6,32,%2\n\t" \
"mulx %2,%3,%4\n" \ "mulx %2,%3,%4\n\t" \
"sllx %4,32,%5\n" \ "sllx %4,32,%5\n\t" \
"srl %6,0,%3\n" \ "srl %6,0,%3\n\t" \
"sub %1,%5,%5\n" \ "sub %1,%5,%5\n\t" \
"srlx %5,32,%5\n" \ "srlx %5,32,%5\n\t" \
"addcc %4,%5,%4\n" \ "addcc %4,%5,%4\n\t" \
"srlx %7,32,%5\n" \ "srlx %7,32,%5\n\t" \
"mulx %3,%5,%3\n" \ "mulx %3,%5,%3\n\t" \
"mulx %2,%5,%5\n" \ "mulx %2,%5,%5\n\t" \
"sethi %%hi(0x80000000),%2\n" \ "sethi %%hi(0x80000000),%2\n\t" \
"addcc %4,%3,%4\n" \ "addcc %4,%3,%4\n\t" \
"srlx %4,32,%4\n" \ "srlx %4,32,%4\n\t" \
"add %2,%2,%2\n" \ "add %2,%2,%2\n\t" \
"movcc %%xcc,%%g0,%2\n" \ "movcc %%xcc,%%g0,%2\n\t" \
"addcc %5,%4,%5\n" \ "addcc %5,%4,%5\n\t" \
"sllx %3,32,%3\n" \ "sllx %3,32,%3\n\t" \
"add %1,%3,%1\n" \ "add %1,%3,%1\n\t" \
"add %5,%2,%0" \ "add %5,%2,%0" \
: "=r" ((UDItype)(wh)), \ : "=r" ((UDItype)(wh)), \
"=&r" ((UDItype)(wl)), \ "=&r" ((UDItype)(wl)), \
@@ -1348,8 +1102,7 @@ UDItype __umulsidi3 (USItype, USItype);
#if defined (__vax__) && W_TYPE_SIZE == 32 #if defined (__vax__) && W_TYPE_SIZE == 32
#define add_ssaaaa(sh, sl, ah, al, bh, bl) \ #define add_ssaaaa(sh, sl, ah, al, bh, bl) \
__asm__ ("addl2 %5,%1\n" \ __asm__ ("addl2 %5,%1\n\tadwc %3,%0" \
"adwc %3,%0" \
: "=g" ((USItype) (sh)), \ : "=g" ((USItype) (sh)), \
"=&g" ((USItype) (sl)) \ "=&g" ((USItype) (sl)) \
: "%0" ((USItype) (ah)), \ : "%0" ((USItype) (ah)), \
@@ -1357,8 +1110,7 @@ UDItype __umulsidi3 (USItype, USItype);
"%1" ((USItype) (al)), \ "%1" ((USItype) (al)), \
"g" ((USItype) (bl))) "g" ((USItype) (bl)))
#define sub_ddmmss(sh, sl, ah, al, bh, bl) \ #define sub_ddmmss(sh, sl, ah, al, bh, bl) \
__asm__ ("subl2 %5,%1\n" \ __asm__ ("subl2 %5,%1\n\tsbwc %3,%0" \
"sbwc %3,%0" \
: "=g" ((USItype) (sh)), \ : "=g" ((USItype) (sh)), \
"=&g" ((USItype) (sl)) \ "=&g" ((USItype) (sl)) \
: "0" ((USItype) (ah)), \ : "0" ((USItype) (ah)), \
@@ -1479,7 +1231,7 @@ UDItype __umulsidi3 (USItype, USItype);
#if !defined (__umulsidi3) #if !defined (__umulsidi3)
#define __umulsidi3(u, v) \ #define __umulsidi3(u, v) \
({DIunion __w; \ ({DWunion __w; \
umul_ppmm (__w.s.high, __w.s.low, u, v); \ umul_ppmm (__w.s.high, __w.s.low, u, v); \
__w.ll; }) __w.ll; })
#endif #endif