mirror of
https://sourceware.org/git/glibc.git
synced 2024-12-23 03:10:05 +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
|
#ifndef _HP_TIMING_H
|
||||||
#define _HP_TIMING_H 1
|
#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
|
/* We always have the timestamp register, but it's got only a 4 second
|
||||||
range. Use it for ld.so profiling only. */
|
range. Use it for ld.so profiling only. */
|
||||||
#define HP_TIMING_AVAIL (0)
|
#define HP_TIMING_AVAIL (0)
|
||||||
@ -77,21 +41,6 @@ typedef unsigned int hp_timing_t;
|
|||||||
(VAR) = (int) (x_) - (int) (x_ >> 32); \
|
(VAR) = (int) (x_) - (int) (x_ >> 32); \
|
||||||
} while (0)
|
} while (0)
|
||||||
|
|
||||||
/* It's simple arithmetic for us. */
|
#include <hp-timing-common.h>
|
||||||
#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)
|
|
||||||
|
|
||||||
#endif /* hp-timing.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
|
#ifndef _HP_TIMING_H
|
||||||
#define _HP_TIMING_H 1
|
#define _HP_TIMING_H 1
|
||||||
|
|
||||||
|
|
||||||
/* There are no generic definitions for the times. We could write something
|
/* There are no generic definitions for the times. We could write something
|
||||||
using the `gettimeofday' system call where available but the overhead of
|
using the `gettimeofday' system call where available but the overhead of
|
||||||
the system call might be too high.
|
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.
|
|
||||||
|
|
||||||
*/
|
|
||||||
|
|
||||||
/* Provide dummy definitions. */
|
/* Provide dummy definitions. */
|
||||||
#define HP_TIMING_AVAIL (0)
|
#define HP_TIMING_AVAIL (0)
|
||||||
|
@ -20,50 +20,6 @@
|
|||||||
#ifndef _HP_TIMING_H
|
#ifndef _HP_TIMING_H
|
||||||
#define _HP_TIMING_H 1
|
#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. */
|
/* We always assume having the timestamp register. */
|
||||||
#define HP_TIMING_AVAIL (1)
|
#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. */
|
in accurate clock cycles here so we don't do this. */
|
||||||
#define HP_TIMING_NOW(Var) __asm__ __volatile__ ("rdtsc" : "=A" (Var))
|
#define HP_TIMING_NOW(Var) __asm__ __volatile__ ("rdtsc" : "=A" (Var))
|
||||||
|
|
||||||
/* It's simple arithmetic for us. */
|
#include <hp-timing-common.h>
|
||||||
#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)
|
|
||||||
|
|
||||||
#endif /* hp-timing.h */
|
#endif /* hp-timing.h */
|
||||||
|
@ -20,44 +20,6 @@
|
|||||||
#ifndef _HP_TIMING_H
|
#ifndef _HP_TIMING_H
|
||||||
#define _HP_TIMING_H 1
|
#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. */
|
/* We always assume having the timestamp register. */
|
||||||
#define HP_TIMING_AVAIL (1)
|
#define HP_TIMING_AVAIL (1)
|
||||||
|
|
||||||
@ -81,22 +43,6 @@ typedef unsigned long int hp_timing_t;
|
|||||||
while (REPEAT_READ (__itc)); \
|
while (REPEAT_READ (__itc)); \
|
||||||
Var = __itc; })
|
Var = __itc; })
|
||||||
|
|
||||||
/* It's simple arithmetic for us. */
|
#include <hp-timing-common.h>
|
||||||
#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)
|
|
||||||
|
|
||||||
#endif /* hp-timing.h */
|
#endif /* hp-timing.h */
|
||||||
|
@ -20,43 +20,6 @@
|
|||||||
#ifndef _HP_TIMING_H
|
#ifndef _HP_TIMING_H
|
||||||
#define _HP_TIMING_H 1
|
#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. */
|
/* We always assume having the timestamp register. */
|
||||||
#define HP_TIMING_AVAIL (1)
|
#define HP_TIMING_AVAIL (1)
|
||||||
|
|
||||||
@ -85,21 +48,6 @@ typedef unsigned long long int hp_timing_t;
|
|||||||
Var = ((hp_timing_t) hi << 32) | lo; \
|
Var = ((hp_timing_t) hi << 32) | lo; \
|
||||||
} while (0)
|
} while (0)
|
||||||
|
|
||||||
/* It's simple arithmetic in 64-bit. */
|
#include <hp-timing-common.h>
|
||||||
#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)
|
|
||||||
|
|
||||||
#endif /* hp-timing.h */
|
#endif /* hp-timing.h */
|
||||||
|
@ -20,43 +20,6 @@
|
|||||||
#ifndef _HP_TIMING_H
|
#ifndef _HP_TIMING_H
|
||||||
#define _HP_TIMING_H 1
|
#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. */
|
/* We always assume having the timestamp register. */
|
||||||
#define HP_TIMING_AVAIL (1)
|
#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))
|
#define HP_TIMING_NOW(Var) __asm__ __volatile__ ("mftb %0" : "=r" (Var))
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* It's simple arithmetic in 64-bit. */
|
#include <hp-timing-common.h>
|
||||||
#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)
|
|
||||||
|
|
||||||
#endif /* hp-timing.h */
|
#endif /* hp-timing.h */
|
||||||
|
@ -20,10 +20,6 @@
|
|||||||
#ifndef _HP_TIMING_H
|
#ifndef _HP_TIMING_H
|
||||||
#define _HP_TIMING_H 1
|
#define _HP_TIMING_H 1
|
||||||
|
|
||||||
#include <string.h>
|
|
||||||
#include <sys/param.h>
|
|
||||||
#include <_itoa.h>
|
|
||||||
|
|
||||||
#define HP_TIMING_AVAIL (1)
|
#define HP_TIMING_AVAIL (1)
|
||||||
#define HP_TIMING_INLINE (1)
|
#define HP_TIMING_INLINE (1)
|
||||||
|
|
||||||
@ -34,19 +30,6 @@ typedef unsigned long long int hp_timing_t;
|
|||||||
"srlx %L0, 32, %H0" \
|
"srlx %L0, 32, %H0" \
|
||||||
: "=r" (Var))
|
: "=r" (Var))
|
||||||
|
|
||||||
#define HP_TIMING_DIFF(Diff, Start, End) (Diff) = ((End) - (Start))
|
#include <hp-timing-common.h>
|
||||||
|
|
||||||
#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)
|
|
||||||
|
|
||||||
#endif /* hp-timing.h */
|
#endif /* hp-timing.h */
|
||||||
|
@ -20,10 +20,6 @@
|
|||||||
#ifndef _HP_TIMING_H
|
#ifndef _HP_TIMING_H
|
||||||
#define _HP_TIMING_H 1
|
#define _HP_TIMING_H 1
|
||||||
|
|
||||||
#include <string.h>
|
|
||||||
#include <sys/param.h>
|
|
||||||
#include <_itoa.h>
|
|
||||||
|
|
||||||
#define HP_TIMING_AVAIL (1)
|
#define HP_TIMING_AVAIL (1)
|
||||||
#define HP_TIMING_INLINE (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_NOW(Var) __asm__ __volatile__ ("rd %%tick, %0" : "=r" (Var))
|
||||||
|
|
||||||
#define HP_TIMING_DIFF(Diff, Start, End) (Diff) = ((End) - (Start))
|
#include <hp-timing-common.h>
|
||||||
|
|
||||||
#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)
|
|
||||||
|
|
||||||
#endif /* hp-timing.h */
|
#endif /* hp-timing.h */
|
||||||
|
@ -17,15 +17,23 @@
|
|||||||
<http://www.gnu.org/licenses/>. */
|
<http://www.gnu.org/licenses/>. */
|
||||||
|
|
||||||
#ifndef _HP_TIMING_H
|
#ifndef _HP_TIMING_H
|
||||||
|
#define _HP_TIMING_H 1
|
||||||
|
|
||||||
/* We can use some of the i686 implementation without changes. */
|
/* We always assume having the timestamp register. */
|
||||||
# include <sysdeps/i386/i686/hp-timing.h>
|
#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. */
|
/* 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; \
|
({ unsigned int _hi, _lo; \
|
||||||
asm volatile ("rdtsc" : "=a" (_lo), "=d" (_hi)); \
|
asm volatile ("rdtsc" : "=a" (_lo), "=d" (_hi)); \
|
||||||
(Var) = ((unsigned long long int) _hi << 32) | _lo; })
|
(Var) = ((unsigned long long int) _hi << 32) | _lo; })
|
||||||
|
|
||||||
|
#include <hp-timing-common.h>
|
||||||
|
|
||||||
#endif /* hp-timing.h */
|
#endif /* hp-timing.h */
|
||||||
|
Loading…
Reference in New Issue
Block a user