summaryrefslogtreecommitdiff
path: root/longlong.h
diff options
context:
space:
mode:
authorTorbjorn Granlund <tege@gmplib.org>2011-10-07 15:35:38 +0200
committerTorbjorn Granlund <tege@gmplib.org>2011-10-07 15:35:38 +0200
commit245b21dc6c0102947d6fbf4c792a13ddaa633170 (patch)
tree76cef2d125326815ddd73b0da3ff9fe15b565048 /longlong.h
parentff80fd479ea91c350c4f653071b2b9b8def80bf3 (diff)
downloadgmp-245b21dc6c0102947d6fbf4c792a13ddaa633170.tar.gz
Misc additional s390 changes.
Diffstat (limited to 'longlong.h')
-rw-r--r--longlong.h38
1 files changed, 32 insertions, 6 deletions
diff --git a/longlong.h b/longlong.h
index 51df42442..1a52b2acf 100644
--- a/longlong.h
+++ b/longlong.h
@@ -655,6 +655,28 @@ extern UWtype __MPN(udiv_qrnnd) _PROTO ((UWtype *, UWtype, UWtype, UWtype));
#if (defined (__i370__) || defined (__s390__) || defined (__mvs__)) && W_TYPE_SIZE == 32
#if defined (__zarch__)
+#define add_ssaaaa(sh, sl, ah, al, bh, bl) \
+ do { \
+ if (__builtin_constant_p (bl)) \
+ __asm__ ("alfi\t%1,%o5\n\talcr\t%0,%3" \
+ : "=r" (sh), "=&r" (sl) \
+ : "0" (ah), "r" (bh), "%1" (al), "n" (bl)); \
+ else \
+ __asm__ ("alr\t%1,%5\n\talcr\t%0,%3" \
+ : "=r" (sh), "=&r" (sl) \
+ : "0" (ah), "r" (bh), "%1" (al), "r" (bl)); \
+ } while (0)
+#define sub_ddmmss(sh, sl, ah, al, bh, bl) \
+ do { \
+ if (__builtin_constant_p (bl)) \
+ __asm__ ("slfi\t%1,%o5\n\tslbr\t%0,%3" \
+ : "=r" (sh), "=&r" (sl) \
+ : "0" (ah), "r" (bh), "1" (al), "n" (bl)); \
+ else \
+ __asm__ ("slr\t%1,%5\n\tslbr\t%0,%3" \
+ : "=r" (sh), "=&r" (sl) \
+ : "0" (ah), "r" (bh), "1" (al), "r" (bl)); \
+ } while (0)
#define umul_ppmm(xh, xl, m0, m1) \
do { \
union {UDItype __ll; \
@@ -705,26 +727,30 @@ extern UWtype __MPN(udiv_qrnnd) _PROTO ((UWtype *, UWtype, UWtype, UWtype));
#define add_ssaaaa(sh, sl, ah, al, bh, bl) \
do { \
if (__builtin_constant_p (bl) && (UDItype)(bl) < 0x100000000ul) \
- __asm__ ("algfi\t%1, %5\n\talcgr\t%0, %3" \
+ __asm__ ("algfi\t%1,%5\n\talcgr\t%0,%3" \
+ : "=r" (sh), "=&r" (sl) \
+ : "0" (ah), "r" (bh), "%1" (al), "n" (bl)); \
+ else if (__builtin_constant_p (bl) && -(UDItype)(bl) < 0x100000000ul) \
+ __asm__ ("slgfi\t%1,%n5\n\talcgr\t%0,%3" \
: "=r" (sh), "=&r" (sl) \
: "0" (ah), "r" (bh), "%1" (al), "n" (bl)); \
else \
- __asm__ ("algr\t%1, %5\n\talcgr\t%0, %3" \
+ __asm__ ("algr\t%1,%5\n\talcgr\t%0,%3" \
: "=r" (sh), "=&r" (sl) \
: "0" (ah), "r" (bh), "%1" (al), "r" (bl)); \
} while (0)
#define sub_ddmmss(sh, sl, ah, al, bh, bl) \
do { \
if (__builtin_constant_p (bl) && (UDItype)(bl) < 0x100000000ul) \
- __asm__ ("slgfi\t%1, %n5\n\tslbgr\t%0, %3" \
+ __asm__ ("slgfi\t%1,%5\n\tslbgr\t%0,%3" \
: "=r" (sh), "=&r" (sl) \
: "0" (ah), "r" (bh), "1" (al), "n" (bl)); \
else if (__builtin_constant_p (bl) && -(UDItype)(bl) < 0x100000000ul) \
- __asm__ ("algfi\t%1, %n5\n\tslbgr\t%0, %3" \
+ __asm__ ("algfi\t%1,%n5\n\tslbgr\t%0,%3" \
: "=r" (sh), "=&r" (sl) \
- : "0" (ah), "r" (bh), "1" (al), "n" (-(UDItype)(bl))); \
+ : "0" (ah), "r" (bh), "1" (al), "n" (bl)); \
else \
- __asm__ ("slgr\t%1, %5\n\tslbgr\t%0, %3" \
+ __asm__ ("slgr\t%1,%5\n\tslbgr\t%0,%3" \
: "=r" (sh), "=&r" (sl) \
: "0" (ah), "r" (bh), "1" (al), "r" (bl)); \
} while (0)