Matej Stuchlik 2c1c983
diff -up Python-2.7.2/Python/ceval.c.tsc-on-ppc Python-2.7.2/Python/ceval.c
Matej Stuchlik 2c1c983
--- Python-2.7.2/Python/ceval.c.tsc-on-ppc	2011-08-23 14:59:48.051300849 -0400
Matej Stuchlik 2c1c983
+++ Python-2.7.2/Python/ceval.c	2011-08-23 15:33:25.412162902 -0400
Matej Stuchlik 2c1c983
@@ -37,24 +37,42 @@ typedef unsigned long long uint64;
Matej Stuchlik 2c1c983
 */
Matej Stuchlik 2c1c983
 #if defined(__ppc__) || defined (__powerpc__)
Matej Stuchlik 2c1c983
 
Matej Stuchlik 2c1c983
-#define READ_TIMESTAMP(var) ppc_getcounter(&var)
Matej Stuchlik 2c1c983
+#if defined( __powerpc64__) || defined(__LP64__)
Matej Stuchlik 2c1c983
+/* 64-bit PowerPC */
Matej Stuchlik 2c1c983
+#define READ_TIMESTAMP(var) ppc64_getcounter(&var)
Matej Stuchlik 2c1c983
+static void
Matej Stuchlik 2c1c983
+ppc64_getcounter(uint64 *v)
Matej Stuchlik 2c1c983
+{
Matej Stuchlik 2c1c983
+    /* On 64-bit PowerPC we can read the 64-bit timebase directly into a
Matej Stuchlik 2c1c983
+       64-bit register */
Matej Stuchlik 2c1c983
+    uint64 timebase;
Matej Stuchlik 2c1c983
+#ifdef _ARCH_PWR4
Matej Stuchlik 2c1c983
+    asm volatile ("mfspr %0,268" : "=r" (timebase));
Matej Stuchlik 2c1c983
+#else
Matej Stuchlik 2c1c983
+    asm volatile ("mftb %0" : "=r" (timebase));
Matej Stuchlik 2c1c983
+#endif
Matej Stuchlik 2c1c983
+    *v = timebase;
Matej Stuchlik 2c1c983
+}
Matej Stuchlik 2c1c983
+
Matej Stuchlik 2c1c983
+#else
Matej Stuchlik 2c1c983
+/* 32-bit PowerPC */
Matej Stuchlik 2c1c983
+#define READ_TIMESTAMP(var) ppc32_getcounter(&var)
Matej Stuchlik 2c1c983
 
Matej Stuchlik 2c1c983
 static void
Matej Stuchlik 2c1c983
-ppc_getcounter(uint64 *v)
Matej Stuchlik 2c1c983
+ppc32_getcounter(uint64 *v)
Matej Stuchlik 2c1c983
 {
Matej Stuchlik 2c1c983
-    unsigned long tbu, tb, tbu2;
Matej Stuchlik 2c1c983
+    union { long long ll; long ii[2]; } u;
Matej Stuchlik 2c1c983
+    long tmp;
Matej Stuchlik 2c1c983
 
Matej Stuchlik 2c1c983
   loop:
Matej Stuchlik 2c1c983
-    asm volatile ("mftbu %0" : "=r" (tbu) );
Matej Stuchlik 2c1c983
-    asm volatile ("mftb  %0" : "=r" (tb)  );
Matej Stuchlik 2c1c983
-    asm volatile ("mftbu %0" : "=r" (tbu2));
Matej Stuchlik 2c1c983
-    if (__builtin_expect(tbu != tbu2, 0)) goto loop;
Matej Stuchlik 2c1c983
-
Matej Stuchlik 2c1c983
-    /* The slightly peculiar way of writing the next lines is
Matej Stuchlik 2c1c983
-       compiled better by GCC than any other way I tried. */
Matej Stuchlik 2c1c983
-    ((long*)(v))[0] = tbu;
Matej Stuchlik 2c1c983
-    ((long*)(v))[1] = tb;
Matej Stuchlik 2c1c983
+    asm volatile ("mftbu %0" : "=r" (u.ii[0]) );
Matej Stuchlik 2c1c983
+    asm volatile ("mftb  %0" : "=r" (u.ii[1]) );
Matej Stuchlik 2c1c983
+    asm volatile ("mftbu %0" : "=r" (tmp));
Matej Stuchlik 2c1c983
+    if (__builtin_expect(u.ii[0] != tmp, 0)) goto loop;
Matej Stuchlik 2c1c983
+
Matej Stuchlik 2c1c983
+    *v = u.ll;
Matej Stuchlik 2c1c983
 }
Matej Stuchlik 2c1c983
+#endif /* powerpc 32/64 bit */
Matej Stuchlik 2c1c983
 
Matej Stuchlik 2c1c983
 #elif defined(__i386__)
Matej Stuchlik 2c1c983