From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 20472 invoked by alias); 27 Nov 2009 22:33:55 -0000 Received: (qmail 20431 invoked by uid 22791); 27 Nov 2009 22:33:55 -0000 X-SWARE-Spam-Status: No, hits=2.7 required=5.0 tests=AWL,BAYES_00,BOTNET X-Spam-Check-By: sourceware.org Received: from imap.ru.mvista.com (HELO buildserver.ru.mvista.com) (213.79.90.228) by sourceware.org (qpsmtpd/0.43rc1) with ESMTP; Fri, 27 Nov 2009 22:33:51 +0000 Received: from localhost (unknown [10.150.0.9]) by buildserver.ru.mvista.com (Postfix) with ESMTP id 5E053881C; Sat, 28 Nov 2009 02:33:49 +0400 (SAMT) Date: Fri, 27 Nov 2009 22:33:00 -0000 From: Anton Vorontsov To: systemtap@sourceware.org Cc: linuxppc-dev@ozlabs.org Subject: [PATCH 7/8] Implement _div64 and _mod64 for ppc32 Message-ID: <20091127223349.GG21805@oksana.dev.rtsoft.ru> References: <20091127223251.GA17065@oksana.dev.rtsoft.ru> MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Disposition: inline In-Reply-To: <20091127223251.GA17065@oksana.dev.rtsoft.ru> User-Agent: Mutt/1.5.20 (2009-06-14) X-IsSubscribed: yes Mailing-List: contact systemtap-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Subscribe: List-Post: List-Help: , Sender: systemtap-owner@sourceware.org X-SW-Source: 2009-q4/txt/msg00726.txt.bz2 _div64 and _mod64 arch-specific details were taken from gcc/longlong.h, just as it was done for i386. Signed-off-by: Anton Vorontsov --- runtime/arith.c | 42 +++++++++++++++++++++++++++++++++++++++--- 1 files changed, 39 insertions(+), 3 deletions(-) diff --git a/runtime/arith.c b/runtime/arith.c index 4c818a7..a032e9c 100644 --- a/runtime/arith.c +++ b/runtime/arith.c @@ -20,7 +20,8 @@ /* 64-bit division for 64-bit cpus and i386 */ /* Other 32-bit cpus will need to modify this file. */ -#if defined (__i386__) || defined(__arm__) +#if defined (__i386__) || defined(__arm__) || \ + (defined(__powerpc__) && !defined(__powerpc64__)) static long long _div64 (long long u, long long v); static long long _mod64 (long long u, long long v); #endif @@ -114,7 +115,8 @@ static int _stp_random_pm (unsigned n) -#if defined (__i386__) || defined (__arm__) +#if defined (__i386__) || defined (__arm__) || \ + (defined(__powerpc__) && !defined(__powerpc64__)) /* 64-bit division functions extracted from libgcc */ typedef long long DWtype; @@ -181,6 +183,40 @@ typedef union (count) = __cbtmp ^ 31; \ } while (0) +#elif defined (__powerpc__) +/* these are the ppc versions of these macros from gcc/longlong.h */ + +#define sub_ddmmss(sh, sl, ah, al, bh, bl) \ + do { \ + if (__builtin_constant_p (ah) && (ah) == 0) \ + __asm__ ("{sf%I3|subf%I3c} %1,%4,%3\n\t{sfze|subfze} %0,%2" \ + : "=r" (sh), "=&r" (sl) : "r" (bh), "rI" (al), "r" (bl));\ + else if (__builtin_constant_p (ah) && (ah) == ~(USItype) 0) \ + __asm__ ("{sf%I3|subf%I3c} %1,%4,%3\n\t{sfme|subfme} %0,%2" \ + : "=r" (sh), "=&r" (sl) : "r" (bh), "rI" (al), "r" (bl));\ + else if (__builtin_constant_p (bh) && (bh) == 0) \ + __asm__ ("{sf%I3|subf%I3c} %1,%4,%3\n\t{ame|addme} %0,%2" \ + : "=r" (sh), "=&r" (sl) : "r" (ah), "rI" (al), "r" (bl));\ + else if (__builtin_constant_p (bh) && (bh) == ~(USItype) 0) \ + __asm__ ("{sf%I3|subf%I3c} %1,%4,%3\n\t{aze|addze} %0,%2" \ + : "=r" (sh), "=&r" (sl) : "r" (ah), "rI" (al), "r" (bl));\ + else \ + __asm__ ("{sf%I4|subf%I4c} %1,%5,%4\n\t{sfe|subfe} %0,%3,%2" \ + : "=r" (sh), "=&r" (sl) \ + : "r" (ah), "r" (bh), "rI" (al), "r" (bl)); \ + } while (0) + +#define count_leading_zeros(count, x) \ + __asm__ ("{cntlz|cntlzw} %0,%1" : "=r" (count) : "r" (x)) +#define COUNT_LEADING_ZEROS_0 32 + +#define umul_ppmm(ph, pl, m0, m1) \ + do { \ + USItype __m0 = (m0), __m1 = (m1); \ + __asm__ ("mulhwu %0,%1,%2" : "=r" (ph) : "%r" (m0), "r" (m1)); \ + (pl) = __m0 * __m1; \ + } while (0) + #elif defined (__arm__) #define sub_ddmmss(sh, sl, ah, al, bh, bl) \ @@ -548,6 +584,6 @@ static long long _mod64 (long long u, long long v) return w; } -#endif /* __i386__ || __arm__ */ +#endif /* __i386__ || __arm__ || (__powerpc__ && !__powerpc64__) */ #endif /* _ARITH_C_ */ -- 1.6.3.3