longlong.h (__x86_64__): Add definitions for add_ssaaaa...

* longlong.h (__x86_64__): Add definitions for add_ssaaaa,
        sub_ddmmss, umul_ppmm, udiv_qrnnd, count_leading_zeros and
        count_trailing_zeros.
        (__i386__): Implement count_leading_zeros using __builtin_clz().
        Implement count_trailing_zeros usign __builtin_ctz().

From-SVN: r124832
This commit is contained in:
Uros Bizjak 2007-05-18 22:14:31 +02:00 committed by Uros Bizjak
parent b86448d7ea
commit e7e0aaeca8
2 changed files with 46 additions and 9 deletions

View File

@ -1,3 +1,11 @@
2007-05-18 Uros Bizjak <ubizjak@gmail.com>
* longlong.h (__x86_64__): Add definitions for add_ssaaaa,
sub_ddmmss, umul_ppmm, udiv_qrnnd, count_leading_zeros and
count_trailing_zeros.
(__i386__): Implement count_leading_zeros using __builtin_clz().
Implement count_trailing_zeros usign __builtin_ctz().
2007-05-18 Richard Sandiford <richard@codesourcery.com>
* config/i386/vxworks.h (ASM_PREFERRED_EH_DATA_FORMAT): Undefine.

View File

@ -341,19 +341,48 @@ UDItype __umulsidi3 (USItype, USItype);
: "0" ((USItype) (n0)), \
"1" ((USItype) (n1)), \
"rm" ((USItype) (dv)))
#define count_leading_zeros(count, x) \
do { \
USItype __cbtmp; \
__asm__ ("bsrl %1,%0" \
: "=r" (__cbtmp) : "rm" ((USItype) (x))); \
(count) = __cbtmp ^ 31; \
} while (0)
#define count_trailing_zeros(count, x) \
__asm__ ("bsfl %1,%0" : "=r" (count) : "rm" ((USItype)(x)))
#define count_leading_zeros(count, x) ((count) = __builtin_clz (x))
#define count_trailing_zeros(count, x) ((count) = __builtin_ctz (x))
#define UMUL_TIME 40
#define UDIV_TIME 40
#endif /* 80x86 */
#if (defined (__x86_64__) || defined (__i386__)) && W_TYPE_SIZE == 64
#define add_ssaaaa(sh, sl, ah, al, bh, bl) \
__asm__ ("addq %5,%1\n\tadcq %3,%0" \
: "=r" ((UDItype) (sh)), \
"=&r" ((UDItype) (sl)) \
: "%0" ((UDItype) (ah)), \
"rme" ((UDItype) (bh)), \
"%1" ((UDItype) (al)), \
"rme" ((UDItype) (bl)))
#define sub_ddmmss(sh, sl, ah, al, bh, bl) \
__asm__ ("subq %5,%1\n\tsbbq %3,%0" \
: "=r" ((UDItype) (sh)), \
"=&r" ((UDItype) (sl)) \
: "0" ((UDItype) (ah)), \
"rme" ((UDItype) (bh)), \
"1" ((UDItype) (al)), \
"rme" ((UDItype) (bl)))
#define umul_ppmm(w1, w0, u, v) \
__asm__ ("mulq %3" \
: "=a" ((UDItype) (w0)), \
"=d" ((UDItype) (w1)) \
: "%0" ((UDItype) (u)), \
"rm" ((UDItype) (v)))
#define udiv_qrnnd(q, r, n1, n0, dv) \
__asm__ ("divq %4" \
: "=a" ((UDItype) (q)), \
"=d" ((UDItype) (r)) \
: "0" ((UDItype) (n0)), \
"1" ((UDItype) (n1)), \
"rm" ((UDItype) (dv)))
#define count_leading_zeros(count, x) ((count) = __builtin_clzl (x))
#define count_trailing_zeros(count, x) ((count) = __builtin_ctzl (x))
#define UMUL_TIME 40
#define UDIV_TIME 40
#endif /* x86_64 */
#if defined (__i960__) && W_TYPE_SIZE == 32
#define umul_ppmm(w1, w0, u, v) \
({union {UDItype __ll; \