Hi,

This patch and the preceding aarch64.md patches all look good to me, but I cannot approve it.

Thanks for adding the support for these missing patterns and defines!

Yufeng

On 01/08/14 18:13, Richard Henderson wrote:
We have good support for TImode arithmetic, so no need to do anything
with inline assembly.

include/
        * longlong.h [__aarch64__] (add_ssaaaa, sub_ddmmss, umul_ppmm): New.
        [__aarch64__] (COUNT_LEADING_ZEROS_0): Define in terms of W_TYPE_SIZE.
---
  include/longlong.h | 28 ++++++++++++++++++++++------
  1 file changed, 22 insertions(+), 6 deletions(-)

diff --git a/include/longlong.h b/include/longlong.h
index b4c1f400..1b11fc7 100644
--- a/include/longlong.h
+++ b/include/longlong.h
@@ -123,19 +123,35 @@ extern const UQItype __clz_tab[256] attribute_hidden;
  #endif /* __GNUC__<  2 */

  #if defined (__aarch64__)
+#define add_ssaaaa(sh, sl, ah, al, bh, bl)                             \
+  do {                                                                 \
+    UDWtype __x = (UDWtype)(UWtype)(ah)<<  64 | (UWtype)(al);            \
+    __x += (UDWtype)(UWtype)(bh)<<  64 | (UWtype)(bl);                   \
+    (sh) = __x>>  W_TYPE_SIZE;                                           \
+    (sl) = __x;                                                                
\
+  } while (0)
+#define sub_ddmmss(sh, sl, ah, al, bh, bl)                             \
+  do {                                                                 \
+    UDWtype __x = (UDWtype)(UWtype)(ah)<<  64 | (UWtype)(al);            \
+    __x -= (UDWtype)(UWtype)(bh)<<  64 | (UWtype)(bl);                   \
+    (sh) = __x>>  W_TYPE_SIZE;                                           \
+    (sl) = __x;                                                                
\
+  } while (0)
+#define umul_ppmm(ph, pl, m0, m1)                                      \
+  do {                                                                 \
+    UDWtype __x = (UDWtype)(UWtype)(m0) * (UWtype)(m1);                        
\
+    (ph) = __x>>  W_TYPE_SIZE;                                           \
+    (pl) = __x;                                                                
\
+  } while (0)

+#define COUNT_LEADING_ZEROS_0   W_TYPE_SIZE
  #if W_TYPE_SIZE == 32
  #define count_leading_zeros(COUNT, X) ((COUNT) = __builtin_clz (X))
  #define count_trailing_zeros(COUNT, X)   ((COUNT) = __builtin_ctz (X))
-#define COUNT_LEADING_ZEROS_0 32
-#endif /* W_TYPE_SIZE == 32 */
-
-#if W_TYPE_SIZE == 64
+#elif W_TYPE_SIZE == 64
  #define count_leading_zeros(COUNT, X) ((COUNT) = __builtin_clzll (X))
  #define count_trailing_zeros(COUNT, X)   ((COUNT) = __builtin_ctzll (X))
-#define COUNT_LEADING_ZEROS_0 64
  #endif /* W_TYPE_SIZE == 64 */
-
  #endif /* __aarch64__ */

  #if defined (__alpha)&&  W_TYPE_SIZE == 64


Reply via email to