summaryrefslogtreecommitdiff
path: root/longlong.h
diff options
context:
space:
mode:
authorTorbjorn Granlund <tege@gmplib.org>2013-01-05 20:12:01 +0100
committerTorbjorn Granlund <tege@gmplib.org>2013-01-05 20:12:01 +0100
commit2606c0a303b5bf7c8d297769950c8bc159a8d677 (patch)
tree0941fade326906894eba77ec46854ea8f3451327 /longlong.h
parent12b101e46046995dec4f16907b838f63528f8b2a (diff)
downloadgmp-2606c0a303b5bf7c8d297769950c8bc159a8d677.tar.gz
(aarch64): Make add_ssaaaa and sub_ddmmss actually work.
Diffstat (limited to 'longlong.h')
-rw-r--r--longlong.h21
1 files changed, 7 insertions, 14 deletions
diff --git a/longlong.h b/longlong.h
index 6df3c5f1a..211d80d6b 100644
--- a/longlong.h
+++ b/longlong.h
@@ -530,23 +530,16 @@ extern UWtype __MPN(udiv_qrnnd) (UWtype *, UWtype, UWtype, UWtype);
#endif /* __arm__ */
#if defined (__aarch64__) && W_TYPE_SIZE == 64
+/* FIXME: Extend the immediate range for the low word by using both
+ ADDS and SUBS, since they set carry in the same way. */
#define add_ssaaaa(sh, sl, ah, al, bh, bl) \
- __asm__ ("adds\t%1, %4, %5\n\tadc\t%0, %2, %3" \
+ __asm__ ("adds\t%1, %x4, %5\n\tadc\t%0, %x2, %x3" \
: "=r" (sh), "=&r" (sl) \
- : "r" (ah), "rZ" (bh), "%r" (al), "rI" (bl) __CLOBBER_CC)
+ : "rZ" (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)
+ __asm__ ("subs\t%1, %x4, %5\n\tsbc\t%0, %x2, %x3" \
+ : "=r,r" (sh), "=&r,&r" (sl) \
+ : "rZ,rZ" (ah), "rZ,rZ" (bh), "r,Z" (al), "rI,r" (bl) __CLOBBER_CC)
#define umul_ppmm(ph, pl, m0, m1) \
do { \
UDItype __m0 = (m0), __m1 = (m1); \