[Python-checkins] r81722 - python/branches/py3k-cdecimal/Modules/cdecimal/typearith.h

stefan.krah python-checkins at python.org
Sat Jun 5 11:21:38 CEST 2010


Author: stefan.krah
Date: Sat Jun  5 11:21:38 2010
New Revision: 81722

Log:
Add fast arithmetic for non-amd64 platforms. Tested on ppc64/AIX.



Modified:
   python/branches/py3k-cdecimal/Modules/cdecimal/typearith.h

Modified: python/branches/py3k-cdecimal/Modules/cdecimal/typearith.h
==============================================================================
--- python/branches/py3k-cdecimal/Modules/cdecimal/typearith.h	(original)
+++ python/branches/py3k-cdecimal/Modules/cdecimal/typearith.h	Sat Jun  5 11:21:38 2010
@@ -22,13 +22,13 @@
  */
 
 #if defined(CONFIG_64)
-#if defined(__GNUC__) && defined(__x86_64__)
+#if defined(__GNUC__) && defined(__x86_64__) && !defined(TEST_UINT128_T)
 static inline void
 _mpd_mul_words(mpd_uint_t *hi, mpd_uint_t *lo, mpd_uint_t a, mpd_uint_t b)
 {
 	mpd_uint_t h, l;
 
-	asm(	"mulq %3\n\t"\
+	asm (	"mulq %3\n\t"\
 		: "=d" (h), "=a" (l)\
 		: "%a" (a), "rm" (b)\
 		: "cc"
@@ -54,7 +54,29 @@
 	*r = rr;
 }
 /* END __GNUC__ (amd64) */
+#elif defined(HAVE_UINT128_T)
+static inline void
+_mpd_mul_words(mpd_uint_t *hi, mpd_uint_t *lo, mpd_uint_t a, mpd_uint_t b)
+{
+	__uint128_t hl;
+
+	hl = (__uint128_t)a * b;
+
+	*hi = hl >> 64;
+	*lo = (mpd_uint_t)hl;
+}
 
+static inline void
+_mpd_div_words(mpd_uint_t *q, mpd_uint_t *r, mpd_uint_t hi, mpd_uint_t lo,
+               mpd_uint_t d)
+{
+	__uint128_t hl;
+
+	hl = ((__uint128_t)hi<<64) + lo;
+	*q = (mpd_uint_t)(hl / d); /* quotient is known to fit */
+	*r = (mpd_uint_t)(hl - (__uint128_t)(*q) * d);
+}
+/* END HAVE_UINT128_T */
 #elif defined(_MSC_VER)
 #include <intrin.h>
 #pragma intrinsic(_umul128)


More information about the Python-checkins mailing list