]> granicus.if.org Git - python/commitdiff
This is my patch:
authorMichael W. Hudson <mwh@python.net>
Thu, 12 Aug 2004 18:19:17 +0000 (18:19 +0000)
committerMichael W. Hudson <mwh@python.net>
Thu, 12 Aug 2004 18:19:17 +0000 (18:19 +0000)
1005891 ] support --with-tsc on PPC

plus a trivial change to settscdump's docstring and a Misc/NEWS entry.

Misc/NEWS
Misc/SpecialBuilds.txt
Python/ceval.c
Python/sysmodule.c

index f6e2faff19b26a5fee6fe47ed9752cc674cebd7f..632d44628918329c7b6d62e3e8b6071e0da101a4 100644 (file)
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -57,6 +57,9 @@ Tools/Demos
 Build
 -----
 
+- The --with-tsc flag to configure to enable VM profiling with the
+  processor's timestamp counter now works on PPC platforms.
+
 C API
 -----
 
index fc41767e382f47a179f38c26a58a318e00647834..3e05f81f5f44a56c4666347a09e110d5d926162e 100644 (file)
@@ -227,3 +227,28 @@ When this symbol is defined, the ceval mainloop and helper functions
 count the number of function calls made.  It keeps detailed statistics
 about what kind of object was called and whether the call hit any of
 the special fast paths in the code.
+
+---------------------------------------------------------------------------
+WITH_TSC                                          introduced for Python 2.4
+
+Super-lowlevel profiling of the interpreter.  When enabled, the sys
+module grows a new function:
+
+settscdump(bool)
+    If true, tell the Python interpreter to dump VM measurements to
+    stderr.  If false, turn off dump.  The measurements are based on the
+    processor's time-stamp counter.
+
+This build option requires a small amount of platform specific code.
+Currently this code is present for linux/x86 and any PowerPC platform
+that uses GCC (i.e. OS X and linux/ppc).
+
+On the PowerPC the rate at which the time base register is incremented
+is not defined by the architecture specification, so you'll need to
+find the manual for your specific processor.  For the 750CX, 750CXe,
+750FX (all sold as the G3) we find:
+
+    The time base counter is clocked at a frequency that is 
+    one-fourth that of the bus clock.
+
+This build is enabled by the --with-tsc flag to configure.
index 4c9bdeda1369e267f825be7025a83607058b3529..ba452f9a16819351bfb6fd0ff55f6f156591d67b 100644 (file)
 #include <ctype.h>
 
 #ifdef WITH_TSC
-#include <asm/msr.h>
 
 typedef unsigned long long uint64;
 
+#if defined(__ppc__) /* <- Don't know if this is the correct symbol; this
+                          section should work for GCC on any PowerPC platform,
+                          irrespective of OS.  POWER?  Who knows :-) */
+
+#define rdtscll(var) ppc_getcounter(&var)
+
+static void
+ppc_getcounter(uint64 *v)
+{
+       register unsigned long tbu, tb, tbu2;
+
+  loop:
+       asm volatile ("mftbu %0" : "=r" (tbu) );
+       asm volatile ("mftb  %0" : "=r" (tb)  );
+       asm volatile ("mftbu %0" : "=r" (tbu2));
+       if (__builtin_expect(tbu != tbu2, 0)) goto loop;
+
+       /* The slightly peculiar way of writing the next lines is 
+          compiled better by GCC than any other way I tried. */
+       ((long*)(v))[0] = tbu;
+       ((long*)(v))[1] = tb;
+}
+
+#else /* this section is for linux/x86 */
+
+#include <asm/msr.h>
+
+#endif
+
 void dump_tsc(int opcode, int ticked, uint64 inst0, uint64 inst1, 
              uint64 loop0, uint64 loop1, uint64 intr0, uint64 intr1)
 {
@@ -34,6 +62,7 @@ void dump_tsc(int opcode, int ticked, uint64 inst0, uint64 inst1,
        fprintf(stderr, "opcode=%03d t=%d inst=%06lld loop=%06lld\n",
                opcode, ticked, inst, loop);
 }
+
 #endif
 
 /* Turn this on if your compiler chokes on the big switch: */
@@ -545,6 +574,9 @@ PyEval_EvalFrame(PyFrameObject *f)
        rdtscll(inst1);
        rdtscll(loop0);
        rdtscll(loop1);
+
+       /* shut up the compiler */
+       opcode = 0;
 #endif
 
 /* Code access macros */
index c62b22db275919e4e963d8b5f85c32df6c7ec943..d246a5998ffa9df22887cf445929ecbdcf5430c6 100644 (file)
@@ -465,7 +465,7 @@ PyDoc_STRVAR(settscdump_doc,
 \n\
 If true, tell the Python interpreter to dump VM measurements to\n\
 stderr.  If false, turn off dump.  The measurements are based on the\n\
-Pentium time-stamp counter."
+processor's time-stamp counter."
 ); 
 #endif /* TSC */