From a1641875036576b65b0a6f490599b82af44f8d36 Mon Sep 17 00:00:00 2001 From: "David I. Lehn" Date: Wed, 16 May 2001 05:04:44 +0000 Subject: [PATCH] - basic arch check for HAVE_RDTSC Original commit message from CVS: - basic arch check for HAVE_RDTSC - use common gst_trace_read_tsc() for RDTSC call - add untested function to do ascii dump of trace data --- acconfig.h | 2 ++ configure.in | 30 ++++++++++++++++++++---------- gst/gsttrace.c | 36 +++++++++++++++++++++++++++--------- gst/gsttrace.h | 1 + libs/idct/ieeetest.c | 18 ++---------------- test/lat.c | 9 ++------- 6 files changed, 54 insertions(+), 42 deletions(-) diff --git a/acconfig.h b/acconfig.h index 5ce0799eff..5f869fa66e 100644 --- a/acconfig.h +++ b/acconfig.h @@ -21,6 +21,8 @@ #undef HAVE_CPU_ARM #undef HAVE_CPU_SPARC +#undef HAVE_RDTSC + #undef HAVE_GDK_PIXBUF #undef HAVE_LIBGHTTP #undef HAVE_LIBMMX diff --git a/configure.in b/configure.in index 382e207f08..fb4c4ec139 100644 --- a/configure.in +++ b/configure.in @@ -117,16 +117,22 @@ dnl ============================================== dnl Determine CPU case "x${target_cpu}" in - xi?86) HAVE_CPU_I386=yes ; - AC_DEFINE(HAVE_CPU_I386) ;; - xpowerpc) HAVE_CPU_PPC=yes ; - AC_DEFINE(HAVE_CPU_PPC) ;; - xalpha) HAVE_CPU_ALPHA=yes ; - AC_DEFINE(HAVE_CPU_ALPHA) ;; - xarm*) HAVE_CPU_ARM=yes ; - AC_DEFINE(HAVE_CPU_ARM) ;; - xsparc*) HAVE_CPU_SPARC=yes ; - AC_DEFINE(HAVE_CPU_SPARC) ;; + xi?86 | k?) HAVE_CPU_I386=yes + AC_DEFINE(HAVE_CPU_I386) + dnl FIXME could use some better detection + dnl (ie CPUID) + case "x${target_cpu}" in + xi386 | xi486) ;; + *) AC_DEFINE(HAVE_RDTSC) ;; + esac ;; + xpowerpc) HAVE_CPU_PPC=yes + AC_DEFINE(HAVE_CPU_PPC) ;; + xalpha) HAVE_CPU_ALPHA=yes + AC_DEFINE(HAVE_CPU_ALPHA) ;; + xarm*) HAVE_CPU_ARM=yes + AC_DEFINE(HAVE_CPU_ARM) ;; + xsparc*) HAVE_CPU_SPARC=yes + AC_DEFINE(HAVE_CPU_SPARC) ;; esac dnl Determine endianness @@ -720,6 +726,10 @@ if test "x$HAVE_LINUX_VIDEODEV" = xyes; then AC_DEFINE(HAVE_LINUX_VIDEODEV) fi +if test "x$HAVE_MPEG2DEC" = xyes; then + AC_DEFINE(HAVE_MPEG2DEC) +fi + dnl ############################# dnl # Set automake conditionals # dnl ############################# diff --git a/gst/gsttrace.c b/gst/gsttrace.c index 182cdc9f02..fb0c7b1a23 100644 --- a/gst/gsttrace.c +++ b/gst/gsttrace.c @@ -33,18 +33,15 @@ #include "gsttrace.h" -#ifdef HAVE_RDTS __inline__ void read_tsc(guint64 *dst) { - __asm__ __volatile__ - ("rdtsc" - : "=a" (*(guint32 *)dst), "=d" (*(((guint32 *)dst) + 1)) - : - : "eax", "edx"); -} +#ifdef HAVE_RDTSC + guint64 tsc; + __asm__ __volatile__ ("rdtsc" : "=A" (tsc)); + *dst = tsc; #else -__inline__ void read_tsc(guint64 *dst) { -} + *dst = 0; #endif +} void gst_trace_read_tsc(guint64 *dst) { read_tsc(dst); @@ -91,6 +88,27 @@ void gst_trace_flush(GstTrace *trace) { trace->bufoffset = 0; } +void gst_trace_text_flush(GstTrace *trace) { + int i; + const int strsize = 20+1 + 10+1 + 10+1 + 112+1 + 1; + char str[strsize]; + + if (!trace) { + trace = _gst_trace_default; + if (!trace ) return; + } + + for (i=0; ibufoffset; i++) { + snprintf(str, strsize, "%20lld %10d %10d %s\n", + trace->buf[i].timestamp, + trace->buf[i].sequence, + trace->buf[i].data, + trace->buf[i].message); + write(trace->fd,str,strlen(str)); + } + trace->bufoffset = 0; +} + void gst_trace_set_default(GstTrace *trace) { g_return_if_fail(trace != NULL); _gst_trace_default = trace; diff --git a/gst/gsttrace.h b/gst/gsttrace.h index 9af6e6e121..3be17eafe9 100644 --- a/gst/gsttrace.h +++ b/gst/gsttrace.h @@ -52,6 +52,7 @@ GstTrace* gst_trace_new (guchar *filename, gint size); void gst_trace_destroy (GstTrace *trace); void gst_trace_flush (GstTrace *trace); +void gst_trace_text_flush (GstTrace *trace); #define gst_trace_get_size(trace) ((trace)->bufsize) #define gst_trace_get_offset(trace) ((trace)->bufoffset) #define gst_trace_get_remaining(trace) ((trace)->bufsize - (trace)->bufoffset) diff --git a/libs/idct/ieeetest.c b/libs/idct/ieeetest.c index 396c25ee4c..d78158e4bd 100644 --- a/libs/idct/ieeetest.c +++ b/libs/idct/ieeetest.c @@ -39,20 +39,6 @@ char * meets (double val, double limit) return ((fabs(val) <= limit) ? "meets" : "FAILS"); } -#ifdef HAVE_RDTS -__inline__ void read_tsc(guint64 *dst) { - __asm__ __volatile__ - ("rdtsc" - : "=a" (*(guint32 *)dst), "=d" (*(((guint32 *)dst) + 1)) - : - : "eax", "edx"); -} -#else -__inline__ void read_tsc(guint64 *dst) { -} -#endif - - int main(int argc, char **argv) { @@ -128,9 +114,9 @@ main(int argc, char **argv) memcpy(testout, refcoefs, sizeof(DCTELEM)*DCTSIZE2); } - read_tsc(&tscstart); + gst_trace_read_tsc(&tscstart); gst_idct_convert(idct, testout); - read_tsc(&tscstop); + gst_trace_read_tsc(&tscstop); //printf("time %llu, %llu %lld\n", tscstart, tscstop, tscstop-tscstart); if (tscstop - tscstart < tscmin) tscmin = tscstop-tscstart; if (tscstop - tscstart > tscmax) tscmax = tscstop-tscstart; diff --git a/test/lat.c b/test/lat.c index 714334e8d9..ef900f7a25 100644 --- a/test/lat.c +++ b/test/lat.c @@ -1,9 +1,6 @@ #include #include -#define rdtscll(result) \ - __asm__ __volatile__("rdtsc" : "=A" (result) : /* No inputs */ ) - static guint64 max = 0, min = -1, total = 0; static guint count = 0; static guint print_del = 1; @@ -11,16 +8,14 @@ static guint iterations = 0; static guint mhz = 0; void handoff_src(GstElement *src, GstBuffer *buf, gpointer user_data) { - guint64 start; - rdtscll(start); - GST_BUFFER_TIMESTAMP(buf) = start; + gst_trace_read_tsc(&GST_BUFFER_TIMESTAMP(buf)); } void handoff_sink(GstElement *sink, GstBuffer *buf, gpointer user_data) { guint64 end, d, avg; guint avg_ns; - rdtscll(end); + gst_trace_read_tsc(&end); d = end - GST_BUFFER_TIMESTAMP(buf); if (d > max) max = d; if (d < min) min = d;