--- linuxsampler/trunk/src/common/RTMath.cpp 2004/12/21 14:22:55 327 +++ linuxsampler/trunk/src/common/RTMath.cpp 2004/12/25 21:58:58 328 @@ -25,6 +25,46 @@ float RTMathBase::CentsToFreqTable[MAX_PITCH * 1200 * 2 + 1]; // +-1200 cents per octave float* RTMathBase::pCentsToFreqTable(InitCentsToFreqTable()); +/* + * Creates a real time stamp for the current moment. Out of efficiency this + * is implemented in inline assembly for each CPU independently; we currently + * don't use a generic solution for CPUs that are not yet covered by the + * assembly code, instead an error message is prompted on compile time, forcing + * the user to contact us. + */ +RTMathBase::time_stamp_t RTMathBase::CreateTimeStamp() { + #if defined(__i386__) || defined(__x86_64__) + uint64_t t; + __asm__ __volatile__ ("rdtsc" : "=A" (t)); + return t >> 8; + #elif defined(__ia64__) + time_stamp_t t; + __asm__ __volatile__ ("mov %0=ar.itc" : "=r"(t)); + return t; + #elif defined(__powerpc__) + time_stamp_t t; + __asm__ __volatile__ ( + "98: mftb %0\n" + "99:\n" + ".section __ftr_fixup,\"a\"\n" + " .long %1\n" + " .long 0\n" + " .long 98b\n" + " .long 99b\n" + ".previous" + : "=r" (t) : "i" (0x00000100) + ); + return t; + #elif defined(__alpha__) + time_stamp_t t; + __asm__ __volatile__ ("rpcc %0" : "=r"(t)); + return t; + #else // we don't want to use a slow generic solution + # error "Sorry, LinuxSampler lacks time stamp code for your system." + # error "Please report this error and the CPU you are using to the LinuxSampler developers mailing list!" + #endif +} + /** * Will automatically be called once to initialize the 'Cents to frequency * ratio' table.