1 /* ///////////////////////////////////////////////////////////////////////
2 * File: rdtsc_counter.h
7 * Brief: The rdtsc_counter class - precision: cpu clock count
10 * Copyright (c) 2008-2020, Waruqi All rights reserved.
11 * //////////////////////////////////////////////////////////////////// */
12 #ifndef EXTL_PLATFORM_WINDOWS_RDTSC_COUNTER_H
13 #define EXTL_PLATFORM_WINDOWS_RDTSC_COUNTER_H
15 /*!\file rdtsc_counter.h
16 * \brief rdtsc_counter class - precision: cpu clock count
19 # error rdtsc_counter.h need be supported by c++.
22 /* ///////////////////////////////////////////////////////////////////////
27 /* ///////////////////////////////////////////////////////////////////////
30 #ifndef EXTL_WINDOWS_COUNTER_RDTSC_COUNTER_SUPPORT
31 # error rdtsc_counter.h is not supported by current compiler.
34 // 'rdtsc' : no return value
35 #if defined(EXTL_COMPILER_IS_MSVC) && (_MSC_VER ==1200)
36 # pragma warning(disable:4035)
37 // missing return statement at stop of non-void function "rdtsc"
38 #elif defined(EXTL_COMPILER_IS_INTEL)
39 # pragma warning(disable:1011)
40 // Function should return a value in function rdtsc_counter::rdtsc() const
41 #elif defined(EXTL_COMPILER_IS_BORLAND)
45 /* ///////////////////////////////////////////////////////////////////////
46 * ::extl::platform::windows namespace
48 EXTL_WINDOWS_BEGIN_WHOLE_NAMESPACE
50 /*!\brief rdtsc_counter class
52 * \ingroup extl_group_counter
56 /// \name Constructors
65 typedef rdtsc_counter class_type
;
67 #ifndef EXTL_64BIT_INT_SUPPORT
68 typedef e_uint64_t interval_type
;
69 typedef e_uint64_t size_type
;
71 typedef e_uint32_t interval_type
;
72 typedef e_uint32_t size_type
;
86 inline interval_type
count() const;
89 #ifdef EXTL_INLINE_ASM_IN_INLINE_SUPPORT
90 inline size_type
rdtsc() const;
92 size_type
rdtsc() const;
104 /* ///////////////////////////////////////////////////////////////////////
105 * Class implementation
107 inline rdtsc_counter::rdtsc_counter()
108 : m_start(0), m_stop(0)
112 #ifdef EXTL_INLINE_ASM_IN_INLINE_SUPPORT
113 inline rdtsc_counter::size_type
rdtsc_counter::rdtsc() const
115 rdtsc_counter::size_type
rdtsc_counter::rdtsc() const
118 #ifdef EXTL_INLINE_ASM_SUPPORT
120 /* __asm _emit 0x0F */
121 /* __asm _emit 0xA2 */
123 /* __asm _emit 0x0F */
124 /* __asm _emit 0x31 */
128 inline void rdtsc_counter::start()
132 inline void rdtsc_counter::stop()
136 inline rdtsc_counter::interval_type
rdtsc_counter::count() const
138 EXTL_ASSERT(m_stop
>= m_start
);
139 return static_cast<interval_type
>(m_stop
- m_start
);
142 /* ///////////////////////////////////////////////////////////////////////
143 * ::extl::platform::windows namespace
145 EXTL_WINDOWS_END_WHOLE_NAMESPACE
147 /* //////////////////////////////////////////////////////////////////// */
148 #endif /* EXTL_PLATFORM_WINDOWS_RDTSC_COUNTER_H */
149 /* //////////////////////////////////////////////////////////////////// */