mirror of
https://sourceware.org/git/glibc.git
synced 2024-12-22 19:00:07 +00:00
Unify hp-timing implementations
Provide an hp-timing-common.h for ports to use.
This commit is contained in:
parent
428dd03f5a
commit
86e1a7ff92
@ -20,42 +20,6 @@
|
||||
#ifndef _HP_TIMING_H
|
||||
#define _HP_TIMING_H 1
|
||||
|
||||
#include <string.h>
|
||||
#include <sys/param.h>
|
||||
#include <_itoa.h>
|
||||
|
||||
/* The macros defined here use the timestamp counter in IA-64. They
|
||||
provide a very accurate way to measure the time with very little
|
||||
overhead. The time values themself have no real meaning, only
|
||||
differences are interesting.
|
||||
|
||||
The list of macros we need includes the following:
|
||||
|
||||
- HP_TIMING_AVAIL: test for availability.
|
||||
|
||||
- HP_TIMING_INLINE: this macro is non-zero if the functionality is not
|
||||
implemented using function calls but instead uses some inlined code
|
||||
which might simply consist of a few assembler instructions. We have to
|
||||
know this since we might want to use the macros here in places where we
|
||||
cannot make function calls.
|
||||
|
||||
- hp_timing_t: This is the type for variables used to store the time
|
||||
values.
|
||||
|
||||
- HP_TIMING_NOW: place timestamp for current time in variable given as
|
||||
parameter.
|
||||
|
||||
- HP_TIMING_DIFF: compute difference between two times and store it
|
||||
in a third. Source and destination might overlap.
|
||||
|
||||
- HP_TIMING_ACCUM_NT: add time difference to another variable, without
|
||||
being thread-safe.
|
||||
|
||||
- HP_TIMING_PRINT: write decimal representation of the timing value into
|
||||
the given string. This operation need not be inline even though
|
||||
HP_TIMING_INLINE is specified.
|
||||
*/
|
||||
|
||||
/* We always have the timestamp register, but it's got only a 4 second
|
||||
range. Use it for ld.so profiling only. */
|
||||
#define HP_TIMING_AVAIL (0)
|
||||
@ -77,21 +41,6 @@ typedef unsigned int hp_timing_t;
|
||||
(VAR) = (int) (x_) - (int) (x_ >> 32); \
|
||||
} while (0)
|
||||
|
||||
/* It's simple arithmetic for us. */
|
||||
#define HP_TIMING_DIFF(Diff, Start, End) (Diff) = ((End) - (Start))
|
||||
|
||||
#define HP_TIMING_ACCUM_NT(Sum, Diff) (Sum) += (Diff)
|
||||
|
||||
/* Print the time value. */
|
||||
#define HP_TIMING_PRINT(Buf, Len, Val) \
|
||||
do { \
|
||||
char __buf[20]; \
|
||||
char *__cp = _itoa_word (Val, __buf + sizeof (__buf), 10, 0); \
|
||||
int __len = (Len); \
|
||||
char *__dest = (Buf); \
|
||||
while (__len-- > 0 && __cp < __buf + sizeof (__buf)) \
|
||||
*__dest++ = *__cp++; \
|
||||
memcpy (__dest, " clock cycles", MIN (__len, sizeof (" clock cycles"))); \
|
||||
} while (0)
|
||||
#include <hp-timing-common.h>
|
||||
|
||||
#endif /* hp-timing.h */
|
||||
|
62
sysdeps/generic/hp-timing-common.h
Normal file
62
sysdeps/generic/hp-timing-common.h
Normal file
@ -0,0 +1,62 @@
|
||||
/* High precision, low overhead timing functions. Generic version.
|
||||
Copyright (C) 1998-2014 Free Software Foundation, Inc.
|
||||
This file is part of the GNU C Library.
|
||||
Contributed by Ulrich Drepper <drepper@cygnus.com>, 1998.
|
||||
|
||||
The GNU C Library is free software; you can redistribute it and/or
|
||||
modify it under the terms of the GNU Lesser General Public
|
||||
License as published by the Free Software Foundation; either
|
||||
version 2.1 of the License, or (at your option) any later version.
|
||||
|
||||
The GNU C Library is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
Lesser General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Lesser General Public
|
||||
License along with the GNU C Library; if not, see
|
||||
<http://www.gnu.org/licenses/>. */
|
||||
|
||||
/* In case a platform supports timers in the hardware the following macros
|
||||
and types must be defined:
|
||||
|
||||
- HP_TIMING_AVAIL: test for availability.
|
||||
|
||||
- HP_TIMING_INLINE: this macro is non-zero if the functionality is not
|
||||
implemented using function calls but instead uses some inlined code
|
||||
which might simply consist of a few assembler instructions. We have to
|
||||
know this since we might want to use the macros here in places where we
|
||||
cannot make function calls.
|
||||
|
||||
- hp_timing_t: This is the type for variables used to store the time
|
||||
values. This type must be integral.
|
||||
|
||||
- HP_TIMING_NOW: place timestamp for current time in variable given as
|
||||
parameter.
|
||||
*/
|
||||
|
||||
/* The target supports hp-timing. Share the common infrastructure. */
|
||||
|
||||
#include <string.h>
|
||||
#include <sys/param.h>
|
||||
#include <_itoa.h>
|
||||
|
||||
/* Compute the difference between START and END, storing into DIFF. */
|
||||
#define HP_TIMING_DIFF(Diff, Start, End) ((Diff) = (End) - (Start))
|
||||
|
||||
/* Accumulate ADD into SUM. No attempt is made to be thread-safe. */
|
||||
#define HP_TIMING_ACCUM_NT(Sum, Diff) ((Sum) += (Diff))
|
||||
|
||||
/* Write a decimal representation of the timing value into the given string. */
|
||||
#define HP_TIMING_PRINT(Dest, Len, Val) \
|
||||
do { \
|
||||
char __buf[20]; \
|
||||
char *__dest = (Dest); \
|
||||
size_t __len = (Len); \
|
||||
char *__cp = _itoa ((Val), __buf + sizeof (__buf), 10, 0); \
|
||||
size_t __cp_len = MIN (__buf + sizeof (__buf) - __cp, __len); \
|
||||
memcpy (__dest, __cp, __cp_len); \
|
||||
memcpy (__dest + __cp_len, " cycles", \
|
||||
MIN (__len - __cp_len, sizeof (" cycles"))); \
|
||||
__dest[__len - 1] = '\0'; \
|
||||
} while (0)
|
@ -20,39 +20,9 @@
|
||||
#ifndef _HP_TIMING_H
|
||||
#define _HP_TIMING_H 1
|
||||
|
||||
|
||||
/* There are no generic definitions for the times. We could write something
|
||||
using the `gettimeofday' system call where available but the overhead of
|
||||
the system call might be too high.
|
||||
|
||||
In case a platform supports timers in the hardware the following macros
|
||||
and types must be defined:
|
||||
|
||||
- HP_TIMING_AVAIL: test for availability.
|
||||
|
||||
- HP_TIMING_INLINE: this macro is non-zero if the functionality is not
|
||||
implemented using function calls but instead uses some inlined code
|
||||
which might simply consist of a few assembler instructions. We have to
|
||||
know this since we might want to use the macros here in places where we
|
||||
cannot make function calls.
|
||||
|
||||
- hp_timing_t: This is the type for variables used to store the time
|
||||
values.
|
||||
|
||||
- HP_TIMING_NOW: place timestamp for current time in variable given as
|
||||
parameter.
|
||||
|
||||
- HP_TIMING_DIFF: compute difference between two times and store it
|
||||
in a third. Source and destination might overlap.
|
||||
|
||||
- HP_TIMING_ACCUM_NT: add time difference to another variable, without
|
||||
being thread-safe.
|
||||
|
||||
- HP_TIMING_PRINT: write decimal representation of the timing value into
|
||||
the given string. This operation need not be inline even though
|
||||
HP_TIMING_INLINE is specified.
|
||||
|
||||
*/
|
||||
the system call might be too high. */
|
||||
|
||||
/* Provide dummy definitions. */
|
||||
#define HP_TIMING_AVAIL (0)
|
||||
|
@ -20,50 +20,6 @@
|
||||
#ifndef _HP_TIMING_H
|
||||
#define _HP_TIMING_H 1
|
||||
|
||||
#include <string.h>
|
||||
#include <sys/param.h>
|
||||
#include <_itoa.h>
|
||||
|
||||
/* The macros defined here use the timestamp counter in i586 and up versions
|
||||
of the x86 processors. They provide a very accurate way to measure the
|
||||
time with very little overhead. The time values themself have no real
|
||||
meaning, only differences are interesting.
|
||||
|
||||
This version is for the i686 processors. The difference to the i586
|
||||
version is that the timerstamp register is unconditionally used. This is
|
||||
not the case for the i586 version where we have to perform runtime test
|
||||
whether the processor really has this capability. We have to make this
|
||||
distinction since the sysdeps/i386/i586 code is supposed to work on all
|
||||
platforms while the i686 already contains i686-specific code.
|
||||
|
||||
The list of macros we need includes the following:
|
||||
|
||||
- HP_TIMING_AVAIL: test for availability.
|
||||
|
||||
- HP_TIMING_INLINE: this macro is non-zero if the functionality is not
|
||||
implemented using function calls but instead uses some inlined code
|
||||
which might simply consist of a few assembler instructions. We have to
|
||||
know this since we might want to use the macros here in places where we
|
||||
cannot make function calls.
|
||||
|
||||
- hp_timing_t: This is the type for variables used to store the time
|
||||
values.
|
||||
|
||||
- HP_TIMING_NOW: place timestamp for current time in variable given as
|
||||
parameter.
|
||||
|
||||
- HP_TIMING_DIFF: compute difference between two times and store it
|
||||
in a third. Source and destination might overlap.
|
||||
|
||||
- HP_TIMING_ACCUM_NT: add time difference to another variable, without
|
||||
being thread-safe.
|
||||
|
||||
- HP_TIMING_PRINT: write decimal representation of the timing value into
|
||||
the given string. This operation need not be inline even though
|
||||
HP_TIMING_INLINE is specified.
|
||||
|
||||
*/
|
||||
|
||||
/* We always assume having the timestamp register. */
|
||||
#define HP_TIMING_AVAIL (1)
|
||||
|
||||
@ -80,21 +36,6 @@ typedef unsigned long long int hp_timing_t;
|
||||
in accurate clock cycles here so we don't do this. */
|
||||
#define HP_TIMING_NOW(Var) __asm__ __volatile__ ("rdtsc" : "=A" (Var))
|
||||
|
||||
/* It's simple arithmetic for us. */
|
||||
#define HP_TIMING_DIFF(Diff, Start, End) (Diff) = ((End) - (Start))
|
||||
|
||||
#define HP_TIMING_ACCUM_NT(Sum, Diff) (Sum) += (Diff)
|
||||
|
||||
/* Print the time value. */
|
||||
#define HP_TIMING_PRINT(Buf, Len, Val) \
|
||||
do { \
|
||||
char __buf[20]; \
|
||||
char *__cp = _itoa (Val, __buf + sizeof (__buf), 10, 0); \
|
||||
size_t __len = (Len); \
|
||||
char *__dest = (Buf); \
|
||||
while (__len-- > 0 && __cp < __buf + sizeof (__buf)) \
|
||||
*__dest++ = *__cp++; \
|
||||
memcpy (__dest, " clock cycles", MIN (__len, sizeof (" clock cycles"))); \
|
||||
} while (0)
|
||||
#include <hp-timing-common.h>
|
||||
|
||||
#endif /* hp-timing.h */
|
||||
|
@ -20,44 +20,6 @@
|
||||
#ifndef _HP_TIMING_H
|
||||
#define _HP_TIMING_H 1
|
||||
|
||||
#include <string.h>
|
||||
#include <sys/param.h>
|
||||
#include <_itoa.h>
|
||||
#include <ia64intrin.h>
|
||||
|
||||
/* The macros defined here use the timestamp counter in IA-64. They
|
||||
provide a very accurate way to measure the time with very little
|
||||
overhead. The time values themself have no real meaning, only
|
||||
differences are interesting.
|
||||
|
||||
The list of macros we need includes the following:
|
||||
|
||||
- HP_TIMING_AVAIL: test for availability.
|
||||
|
||||
- HP_TIMING_INLINE: this macro is non-zero if the functionality is not
|
||||
implemented using function calls but instead uses some inlined code
|
||||
which might simply consist of a few assembler instructions. We have to
|
||||
know this since we might want to use the macros here in places where we
|
||||
cannot make function calls.
|
||||
|
||||
- hp_timing_t: This is the type for variables used to store the time
|
||||
values.
|
||||
|
||||
- HP_TIMING_NOW: place timestamp for current time in variable given as
|
||||
parameter.
|
||||
|
||||
- HP_TIMING_DIFF: compute difference between two times and store it
|
||||
in a third. Source and destination might overlap.
|
||||
|
||||
- HP_TIMING_ACCUM_NT: add time difference to another variable, without
|
||||
being thread-safe.
|
||||
|
||||
- HP_TIMING_PRINT: write decimal representation of the timing value into
|
||||
the given string. This operation need not be inline even though
|
||||
HP_TIMING_INLINE is specified.
|
||||
|
||||
*/
|
||||
|
||||
/* We always assume having the timestamp register. */
|
||||
#define HP_TIMING_AVAIL (1)
|
||||
|
||||
@ -81,22 +43,6 @@ typedef unsigned long int hp_timing_t;
|
||||
while (REPEAT_READ (__itc)); \
|
||||
Var = __itc; })
|
||||
|
||||
/* It's simple arithmetic for us. */
|
||||
#define HP_TIMING_DIFF(Diff, Start, End) (Diff) = ((End) - (Start))
|
||||
|
||||
#define HP_TIMING_ACCUM_NT(Sum, Diff) (Sum) += (Diff)
|
||||
|
||||
/* Print the time value. */
|
||||
#define HP_TIMING_PRINT(Buf, Len, Val) \
|
||||
do { \
|
||||
char __buf[20]; \
|
||||
char *__cp = _itoa_word (Val, __buf + sizeof (__buf), 10, 0); \
|
||||
int __len = (Len); \
|
||||
char *__dest = (Buf); \
|
||||
while (__len-- > 0 && __cp < __buf + sizeof (__buf)) \
|
||||
*__dest++ = *__cp++; \
|
||||
memcpy (__dest, " clock cycles", MIN (__len, \
|
||||
(int) sizeof (" clock cycles"))); \
|
||||
} while (0)
|
||||
#include <hp-timing-common.h>
|
||||
|
||||
#endif /* hp-timing.h */
|
||||
|
@ -20,43 +20,6 @@
|
||||
#ifndef _HP_TIMING_H
|
||||
#define _HP_TIMING_H 1
|
||||
|
||||
#include <string.h>
|
||||
#include <sys/param.h>
|
||||
#include <_itoa.h>
|
||||
#include <atomic.h>
|
||||
|
||||
/* The macros defined here use the powerpc 64-bit time base register.
|
||||
The time base is nominally clocked at 1/8th the CPU clock, but this
|
||||
can vary.
|
||||
|
||||
The list of macros we need includes the following:
|
||||
|
||||
- HP_TIMING_AVAIL: test for availability.
|
||||
|
||||
- HP_TIMING_INLINE: this macro is non-zero if the functionality is not
|
||||
implemented using function calls but instead uses some inlined code
|
||||
which might simply consist of a few assembler instructions. We have to
|
||||
know this since we might want to use the macros here in places where we
|
||||
cannot make function calls.
|
||||
|
||||
- hp_timing_t: This is the type for variables used to store the time
|
||||
values.
|
||||
|
||||
- HP_TIMING_NOW: place timestamp for current time in variable given as
|
||||
parameter.
|
||||
|
||||
- HP_TIMING_DIFF: compute difference between two times and store it
|
||||
in a third. Source and destination might overlap.
|
||||
|
||||
- HP_TIMING_ACCUM_NT: add time difference to another variable, without
|
||||
being thread-safe.
|
||||
|
||||
- HP_TIMING_PRINT: write decimal representation of the timing value into
|
||||
the given string. This operation need not be inline even though
|
||||
HP_TIMING_INLINE is specified.
|
||||
|
||||
*/
|
||||
|
||||
/* We always assume having the timestamp register. */
|
||||
#define HP_TIMING_AVAIL (1)
|
||||
|
||||
@ -85,21 +48,6 @@ typedef unsigned long long int hp_timing_t;
|
||||
Var = ((hp_timing_t) hi << 32) | lo; \
|
||||
} while (0)
|
||||
|
||||
/* It's simple arithmetic in 64-bit. */
|
||||
#define HP_TIMING_DIFF(Diff, Start, End) (Diff) = ((End) - (Start))
|
||||
|
||||
#define HP_TIMING_ACCUM_NT(Sum, Diff) (Sum) += (Diff)
|
||||
|
||||
/* Print the time value. */
|
||||
#define HP_TIMING_PRINT(Buf, Len, Val) \
|
||||
do { \
|
||||
char __buf[20]; \
|
||||
char *__cp = _itoa (Val, __buf + sizeof (__buf), 10, 0); \
|
||||
size_t __len = (Len); \
|
||||
char *__dest = (Buf); \
|
||||
while (__len-- > 0 && __cp < __buf + sizeof (__buf)) \
|
||||
*__dest++ = *__cp++; \
|
||||
memcpy (__dest, " ticks", MIN (__len, sizeof (" ticks"))); \
|
||||
} while (0)
|
||||
#include <hp-timing-common.h>
|
||||
|
||||
#endif /* hp-timing.h */
|
||||
|
@ -20,43 +20,6 @@
|
||||
#ifndef _HP_TIMING_H
|
||||
#define _HP_TIMING_H 1
|
||||
|
||||
#include <string.h>
|
||||
#include <sys/param.h>
|
||||
#include <_itoa.h>
|
||||
#include <atomic.h>
|
||||
|
||||
/* The macros defined here use the powerpc 64-bit time base register.
|
||||
The time base is nominally clocked at 1/8th the CPU clock, but this
|
||||
can vary.
|
||||
|
||||
The list of macros we need includes the following:
|
||||
|
||||
- HP_TIMING_AVAIL: test for availability.
|
||||
|
||||
- HP_TIMING_INLINE: this macro is non-zero if the functionality is not
|
||||
implemented using function calls but instead uses some inlined code
|
||||
which might simply consist of a few assembler instructions. We have to
|
||||
know this since we might want to use the macros here in places where we
|
||||
cannot make function calls.
|
||||
|
||||
- hp_timing_t: This is the type for variables used to store the time
|
||||
values.
|
||||
|
||||
- HP_TIMING_NOW: place timestamp for current time in variable given as
|
||||
parameter.
|
||||
|
||||
- HP_TIMING_DIFF: compute difference between two times and store it
|
||||
in a third. Source and destination might overlap.
|
||||
|
||||
- HP_TIMING_ACCUM_NT: add time difference to another variable, without
|
||||
being thread-safe.
|
||||
|
||||
- HP_TIMING_PRINT: write decimal representation of the timing value into
|
||||
the given string. This operation need not be inline even though
|
||||
HP_TIMING_INLINE is specified.
|
||||
|
||||
*/
|
||||
|
||||
/* We always assume having the timestamp register. */
|
||||
#define HP_TIMING_AVAIL (1)
|
||||
|
||||
@ -77,21 +40,6 @@ typedef unsigned long long int hp_timing_t;
|
||||
#define HP_TIMING_NOW(Var) __asm__ __volatile__ ("mftb %0" : "=r" (Var))
|
||||
#endif
|
||||
|
||||
/* It's simple arithmetic in 64-bit. */
|
||||
#define HP_TIMING_DIFF(Diff, Start, End) (Diff) = ((End) - (Start))
|
||||
|
||||
#define HP_TIMING_ACCUM_NT(Sum, Diff) (Sum) += (Diff)
|
||||
|
||||
/* Print the time value. */
|
||||
#define HP_TIMING_PRINT(Buf, Len, Val) \
|
||||
do { \
|
||||
char __buf[20]; \
|
||||
char *__cp = _itoa (Val, __buf + sizeof (__buf), 10, 0); \
|
||||
size_t __len = (Len); \
|
||||
char *__dest = (Buf); \
|
||||
while (__len-- > 0 && __cp < __buf + sizeof (__buf)) \
|
||||
*__dest++ = *__cp++; \
|
||||
memcpy (__dest, " ticks", MIN (__len, sizeof (" ticks"))); \
|
||||
} while (0)
|
||||
#include <hp-timing-common.h>
|
||||
|
||||
#endif /* hp-timing.h */
|
||||
|
@ -20,10 +20,6 @@
|
||||
#ifndef _HP_TIMING_H
|
||||
#define _HP_TIMING_H 1
|
||||
|
||||
#include <string.h>
|
||||
#include <sys/param.h>
|
||||
#include <_itoa.h>
|
||||
|
||||
#define HP_TIMING_AVAIL (1)
|
||||
#define HP_TIMING_INLINE (1)
|
||||
|
||||
@ -34,19 +30,6 @@ typedef unsigned long long int hp_timing_t;
|
||||
"srlx %L0, 32, %H0" \
|
||||
: "=r" (Var))
|
||||
|
||||
#define HP_TIMING_DIFF(Diff, Start, End) (Diff) = ((End) - (Start))
|
||||
|
||||
#define HP_TIMING_ACCUM_NT(Sum, Diff) (Sum) += (Diff)
|
||||
|
||||
#define HP_TIMING_PRINT(Buf, Len, Val) \
|
||||
do { \
|
||||
char __buf[20]; \
|
||||
char *__cp = _itoa (Val, __buf + sizeof (__buf), 10, 0); \
|
||||
int __len = (Len); \
|
||||
char *__dest = (Buf); \
|
||||
while (__len-- > 0 && __cp < __buf + sizeof (__buf)) \
|
||||
*__dest++ = *__cp++; \
|
||||
memcpy (__dest, " clock cycles", MIN (__len, sizeof (" clock cycles"))); \
|
||||
} while (0)
|
||||
#include <hp-timing-common.h>
|
||||
|
||||
#endif /* hp-timing.h */
|
||||
|
@ -20,10 +20,6 @@
|
||||
#ifndef _HP_TIMING_H
|
||||
#define _HP_TIMING_H 1
|
||||
|
||||
#include <string.h>
|
||||
#include <sys/param.h>
|
||||
#include <_itoa.h>
|
||||
|
||||
#define HP_TIMING_AVAIL (1)
|
||||
#define HP_TIMING_INLINE (1)
|
||||
|
||||
@ -31,19 +27,6 @@ typedef unsigned long int hp_timing_t;
|
||||
|
||||
#define HP_TIMING_NOW(Var) __asm__ __volatile__ ("rd %%tick, %0" : "=r" (Var))
|
||||
|
||||
#define HP_TIMING_DIFF(Diff, Start, End) (Diff) = ((End) - (Start))
|
||||
|
||||
#define HP_TIMING_ACCUM_NT(Sum, Diff) (Sum) += (Diff)
|
||||
|
||||
#define HP_TIMING_PRINT(Buf, Len, Val) \
|
||||
do { \
|
||||
char __buf[20]; \
|
||||
char *__cp = _itoa (Val, __buf + sizeof (__buf), 10, 0); \
|
||||
int __len = (Len); \
|
||||
char *__dest = (Buf); \
|
||||
while (__len-- > 0 && __cp < __buf + sizeof (__buf)) \
|
||||
*__dest++ = *__cp++; \
|
||||
memcpy (__dest, " clock cycles", MIN (__len, sizeof (" clock cycles"))); \
|
||||
} while (0)
|
||||
#include <hp-timing-common.h>
|
||||
|
||||
#endif /* hp-timing.h */
|
||||
|
@ -17,15 +17,23 @@
|
||||
<http://www.gnu.org/licenses/>. */
|
||||
|
||||
#ifndef _HP_TIMING_H
|
||||
#define _HP_TIMING_H 1
|
||||
|
||||
/* We can use some of the i686 implementation without changes. */
|
||||
# include <sysdeps/i386/i686/hp-timing.h>
|
||||
/* We always assume having the timestamp register. */
|
||||
#define HP_TIMING_AVAIL (1)
|
||||
|
||||
/* We indeed have inlined functions. */
|
||||
#define HP_TIMING_INLINE (1)
|
||||
|
||||
/* We use 64bit values for the times. */
|
||||
typedef unsigned long long int hp_timing_t;
|
||||
|
||||
/* The "=A" constraint used in 32-bit mode does not work in 64-bit mode. */
|
||||
# undef HP_TIMING_NOW
|
||||
# define HP_TIMING_NOW(Var) \
|
||||
#define HP_TIMING_NOW(Var) \
|
||||
({ unsigned int _hi, _lo; \
|
||||
asm volatile ("rdtsc" : "=a" (_lo), "=d" (_hi)); \
|
||||
(Var) = ((unsigned long long int) _hi << 32) | _lo; })
|
||||
|
||||
#include <hp-timing-common.h>
|
||||
|
||||
#endif /* hp-timing.h */
|
||||
|
Loading…
Reference in New Issue
Block a user