longlong.h (__x86_64__): Add definitions for add_ssaaaa...
authorUros Bizjak <ubizjak@gmail.com>
Fri, 18 May 2007 20:14:31 +0000 (22:14 +0200)
committerUros Bizjak <uros@gcc.gnu.org>
Fri, 18 May 2007 20:14:31 +0000 (22:14 +0200)
        * 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

gcc/ChangeLog
gcc/longlong.h

index f24184b2da09499109f400919c55617f0f4f5dff..e0c6b5f2b3336427220461f5288f4b6aa9c39e35 100644 (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.
index 8b512d2f2844102063573d3185e812c5fab1aeb0..b96e8bbb640d983bb22c492f8c301deb36f48fc3 100644 (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;                                               \