// $Id$ // // Build this file with g++. It can be linked in to a ACE application // that was compiled with GreenHills. It wouldn't be necessary if I // knew a way to correctly move values from registers to a 64-bit variable // in GHS asm code. That's easy with g++ asm. #include "ace/OS.h" extern "C" ACE_hrtime_t ACE_gethrtime () { #if defined (ACE_HAS_PENTIUM) // ACE_TRACE ("ACE_gethrtime"); #if defined (ACE_LACKS_LONGLONG_T) double now; #else /* ! ACE_LACKS_LONGLONG_T */ ACE_hrtime_t now; #endif /* ! ACE_LACKS_LONGLONG_T */ // See comments about the RDTSC Pentium instruction for the ACE_WIN32 // version of ACE_OS::gethrtime () in ace/OS.i. // // Read the high-res tick counter directly into memory variable "now". // The A constraint signifies a 64-bit int. #if defined (__GNUG__) asm volatile ("rdtsc" : "=A" (now) : : "memory"); // #elif defined (ghs) // The following doesn't work. For now, this file must be compile with g++. // asm ("rdtsc"); // asm ("movl %edx,-16(%ebp)"); // asm ("movl %eax,-12(%ebp)"); #else # error unsupported compiler #endif #if defined (ACE_LACKS_LONGLONG_T) // ACE_U_LongLong doesn't have the same layout as now, so construct // it "properly". unsigned int least, most; ACE_OS::memcpy (&least, &now, sizeof (unsigned int)); ACE_OS::memcpy (&most, &now + sizeof (unsigned int), sizeof (unsigned int)); ACE_hrtime_t ret (least, most); return ret; #else /* ! ACE_LACKS_LONGLONG_T */ return now; #endif /* ! ACE_LACKS_LONGLONG_T */ #else /* ! ACE_HAS_PENTIUM */ # error This file can _only_ be compiled with ACE_HAS_PENTIUM. #endif /* ! ACE_HAS_PENTIUM */ }