X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;f=libs%2Fardour%2Fardour%2Fcycles.h;h=dc1095db7b60939122a07b74f9e5629b92781f98;hb=71a90399fe8561310b848fbfb8d28a65a395a6c1;hp=f1422880b86cc974c6c75bb8e328302389db56b1;hpb=6edccc3070b813157ffcd4014ec8dd7fa6ed9ce7;p=ardour.git diff --git a/libs/ardour/ardour/cycles.h b/libs/ardour/ardour/cycles.h index f1422880b8..dc1095db7b 100644 --- a/libs/ardour/ardour/cycles.h +++ b/libs/ardour/ardour/cycles.h @@ -1,7 +1,7 @@ /* Copyright (C) 2001 Paul Davis Code derived from various headers from the Linux kernel - + This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or @@ -37,22 +37,38 @@ * We only use the low 32 bits, and we'd simply better make sure * that we reschedule before that wraps. Scheduling at least every * four billion cycles just basically sounds like a good idea, - * regardless of how fast the machine is. + * regardless of how fast the machine is. */ typedef uint64_t cycles_t; extern cycles_t cacheflush_time; -#define rdtscll(val) \ - __asm__ __volatile__("rdtsc" : "=A" (val)) +#if defined(__x86_64__) + +#define rdtscll(lo, hi) \ + __asm__ __volatile__("rdtsc" : "=a" (lo), "=d" (hi)) + +static inline cycles_t get_cycles (void) +{ + cycles_t lo, hi; + + rdtscll(lo, hi); + return lo; +} + +#else + +#define rdtscll(val) \ +__asm__ __volatile__("rdtsc" : "=A" (val)) static inline cycles_t get_cycles (void) { - uint32_t long ret; + cycles_t ret; rdtscll(ret); - return ret; + return ret & 0xffffffff; } +#endif #elif defined(__powerpc__) @@ -103,7 +119,7 @@ get_cycles (void) * Standard way to access the cycle counter. * Currently only used on SMP for scheduling. * - * Only the low 32 bits are available as a continuously counting entity. + * Only the low 32 bits are available as a continuously counting entity. * But this only means we'll force a reschedule every 8 seconds or so, * which isn't an evil thing. */ @@ -122,27 +138,27 @@ static inline cycles_t get_cycles (void) typedef uint32_t long cycles_t; static inline cycles_t get_cycles(void) { - cycles_t cycles; - __asm__("stck 0(%0)" : : "a" (&(cycles)) : "memory", "cc"); - return cycles >> 2; + cycles_t cycles; + __asm__("stck 0(%0)" : : "a" (&(cycles)) : "memory", "cc"); + return cycles >> 2; } #elif defined(__hppa__) /* hppa/parisc */ #define mfctl(reg) ({ \ - uint32_t cr; \ - __asm__ __volatile__( \ - "mfctl " #reg ",%0" : \ - "=r" (cr) \ - ); \ - cr; \ + uint32_t cr; \ + __asm__ __volatile__( \ + "mfctl " #reg ",%0" : \ + "=r" (cr) \ + ); \ + cr; \ }) typedef uint32_t cycles_t; static inline cycles_t get_cycles (void) { - return mfctl(16); + return mfctl(16); } #elif defined(__mips__) @@ -159,19 +175,19 @@ static inline cycles_t get_cycles (void) * We know that all SMP capable CPUs have cycle counters. */ -#define __read_32bit_c0_register(source, sel) \ -({ int __res; \ - if (sel == 0) \ - __asm__ __volatile__( \ - "mfc0\t%0, " #source "\n\t" \ - : "=r" (__res)); \ - else \ - __asm__ __volatile__( \ - ".set\tmips32\n\t" \ - "mfc0\t%0, " #source ", " #sel "\n\t" \ - ".set\tmips0\n\t" \ - : "=r" (__res)); \ - __res; \ +#define __read_32bit_c0_register(source, sel) \ +({ int __res; \ + if (sel == 0) \ + __asm__ __volatile__( \ + "mfc0\t%0, " #source "\n\t" \ + : "=r" (__res)); \ + else \ + __asm__ __volatile__( \ + ".set\tmips32\n\t" \ + "mfc0\t%0, " #source ", " #sel "\n\t" \ + ".set\tmips0\n\t" \ + : "=r" (__res)); \ + __res; \ }) /* #define CP0_COUNT $9 */ @@ -180,29 +196,19 @@ static inline cycles_t get_cycles (void) typedef uint32_t cycles_t; static inline cycles_t get_cycles (void) { - return read_c0_count(); + return read_c0_count(); } /* begin mach */ #elif defined(__APPLE__) -#ifdef HAVE_WEAK_COREAUDIO #include -#else // Due to MacTypes.h and libgnomecanvasmm Rect conflict -typedef unsigned long long UInt64; - -extern UInt64 -AudioGetCurrentHostTime(); - -extern UInt64 -AudioConvertHostTimeToNanos(UInt64 inHostTime); -#endif typedef UInt64 cycles_t; static inline cycles_t get_cycles (void) { - UInt64 time = AudioGetCurrentHostTime(); - return AudioConvertHostTimeToNanos(time); + UInt64 time = AudioGetCurrentHostTime(); + return AudioConvertHostTimeToNanos(time); } /* end mach */ @@ -210,7 +216,10 @@ static inline cycles_t get_cycles (void) /* debian: sparc, arm, m68k */ +#ifndef COMPILER_MSVC +/* GRRR... Annoyingly, #warning aborts the compilation for MSVC !! */ #warning You are compiling libardour on a platform for which ardour/cycles.h needs work +#endif #include @@ -220,10 +229,10 @@ extern cycles_t cacheflush_time; static inline cycles_t get_cycles(void) { - struct timeval tv; - gettimeofday (&tv, NULL); + struct timeval tv; + gettimeofday (&tv, NULL); - return tv.tv_usec; + return tv.tv_usec; } #endif