diff options
author | Torbjorn Granlund <tege@gmplib.org> | 2012-11-12 21:02:19 +0100 |
---|---|---|
committer | Torbjorn Granlund <tege@gmplib.org> | 2012-11-12 21:02:19 +0100 |
commit | 87c9ff7995fcfcccf3876e1addbbb36c26c3aa10 (patch) | |
tree | 56ff7a84e3c5ed4ac79533776d2d1221055fc3ff /longlong.h | |
parent | f6ce5a04eec221c08ca4ff62ac53e14bfb653fd6 (diff) | |
download | gmp-87c9ff7995fcfcccf3876e1addbbb36c26c3aa10.tar.gz |
Add ARM64 support. Add AVR support.
Diffstat (limited to 'longlong.h')
-rw-r--r-- | longlong.h | 38 |
1 files changed, 38 insertions, 0 deletions
diff --git a/longlong.h b/longlong.h index 9afeb5cba..dfac32c1d 100644 --- a/longlong.h +++ b/longlong.h @@ -259,6 +259,15 @@ long __MPN(count_leading_zeros) (UDItype); #endif /* clz using mpn */ #endif /* __alpha */ +#if defined (__AVR) && W_TYPE_SIZE == 8 +#define umul_ppmm(ph, pl, m0, m1) \ + do { \ + unsigned short __p = (unsigned short) (m0) * (m1); \ + (ph) = __p >> 8; \ + (pl) = __p; \ + } while (0) +#endif /* AVR */ + #if defined (_CRAY) && W_TYPE_SIZE == 64 #include <intrinsics.h> #define UDIV_PREINV_ALWAYS 1 @@ -520,6 +529,35 @@ extern UWtype __MPN(udiv_qrnnd) (UWtype *, UWtype, UWtype, UWtype); #endif #endif /* __arm__ */ +#if defined (__aarch64__) && W_TYPE_SIZE == 64 +#define add_ssaaaa(sh, sl, ah, al, bh, bl) \ + __asm__ ("adds\t%1, %4, %5\n\tadc\t%0, %2, %3" \ + : "=r" (sh), "=&r" (sl) \ + : "r" (ah), "rZ" (bh), "%r" (al), "rI" (bl) __CLOBBER_CC) +#define sub_ddmmss(sh, sl, ah, al, bh, bl) \ + do { \ + if (__builtin_constant_p (bl)) \ + { \ + __asm__ ("subs\t%1, %4, %5\n\tsbc\t%0, %2, %3" \ + : "=r" (sh), "=&r" (sl) \ + : "r" (ah), "r" (bh), "r" (al), "rI" (bl) __CLOBBER_CC); \ + } \ + else /* only bh might be a constant */ \ + __asm__ ("subs\t%1, %4, %5\n\tsbc\t%0, %2, %3" \ + : "=r" (sh), "=&r" (sl) \ + : "r" (ah), "rZ" (bh), "r" (al), "rI" (bl) __CLOBBER_CC);\ + } while (0) +#define umul_ppmm(ph, pl, m0, m1) \ + do { \ + UDItype __m0 = (m0), __m1 = (m1); \ + __asm__ ("umulh\t%0, %1, %2" : "=r" (ph) : "r" (m0), "r" (m1)); \ + (pl) = __m0 * __m1; \ + } while (0) +#define count_leading_zeros(count, x) \ + __asm__ ("clz\t%0, %1" : "=r" (count) : "r" (x)) +#define COUNT_LEADING_ZEROS_0 64 +#endif /* __aarch64__ */ + #if defined (__clipper__) && W_TYPE_SIZE == 32 #define umul_ppmm(w1, w0, u, v) \ ({union {UDItype __ll; \ |