| commit 72771e53753647111d31c5c4bf43d8901e6baf7e |
| Author: H.J. Lu <hjl.tools@gmail.com> |
| Date: Wed Oct 17 15:16:38 2018 -0700 |
| |
| x86: Use _rdtsc intrinsic for HP_TIMING_NOW |
| |
| Since _rdtsc intrinsic is supported in GCC 4.9, we can use it for |
| HP_TIMING_NOW. This patch |
| |
| 1. Create x86 hp-timing.h to replace i686 and x86_64 hp-timing.h. |
| 2. Move MINIMUM_ISA from init-arch.h to isa.h so that x86 hp-timing.h |
| can check minimum x86 ISA to decide if _rdtsc can be used. |
| |
| NB: Checking if __i686__ isn't sufficient since __i686__ may not be |
| defined when building for i686 class processors. |
| |
| * sysdeps/i386/init-arch.h: Removed. |
| * sysdeps/i386/i586/init-arch.h: Likewise. |
| * sysdeps/i386/i686/init-arch.h: Likewise. |
| * sysdeps/i386/i686/hp-timing.h: Likewise. |
| * sysdeps/x86_64/hp-timing.h: Likewise. |
| * sysdeps/i386/isa.h: New file. |
| * sysdeps/i386/i586/isa.h: Likewise. |
| * sysdeps/i386/i686/isa.h: Likewise. |
| * sysdeps/x86_64/isa.h: Likewise. |
| * sysdeps/x86/hp-timing.h: New file. |
| * sysdeps/x86/init-arch.h: Include <isa.h>. |
| |
| diff --git a/sysdeps/i386/i586/init-arch.h b/sysdeps/i386/i586/isa.h |
| similarity index 85% |
| rename from sysdeps/i386/i586/init-arch.h |
| rename to sysdeps/i386/i586/isa.h |
| index 72fb46c61e4c5f34..79481ce68033e58c 100644 |
| |
| |
| @@ -1,4 +1,5 @@ |
| -/* Copyright (C) 2015-2018 Free Software Foundation, Inc. |
| +/* x86 ISA info. i586 version. |
| + Copyright (C) 2018 Free Software Foundation, Inc. |
| This file is part of the GNU C Library. |
| |
| The GNU C Library is free software; you can redistribute it and/or |
| @@ -15,5 +16,9 @@ |
| License along with the GNU C Library; if not, see |
| <http://www.gnu.org/licenses/>. */ |
| |
| +#ifndef _ISA_H |
| +#define _ISA_H |
| + |
| #define MINIMUM_ISA 586 |
| -#include <sysdeps/x86/init-arch.h> |
| + |
| +#endif |
| diff --git a/sysdeps/i386/i686/init-arch.h b/sysdeps/i386/i686/isa.h |
| similarity index 85% |
| rename from sysdeps/i386/i686/init-arch.h |
| rename to sysdeps/i386/i686/isa.h |
| index ab99392b586b1e2d..584e26bd4f928021 100644 |
| |
| |
| @@ -1,4 +1,5 @@ |
| -/* Copyright (C) 2015-2018 Free Software Foundation, Inc. |
| +/* x86 ISA info. i686 version. |
| + Copyright (C) 2018 Free Software Foundation, Inc. |
| This file is part of the GNU C Library. |
| |
| The GNU C Library is free software; you can redistribute it and/or |
| @@ -15,5 +16,9 @@ |
| License along with the GNU C Library; if not, see |
| <http://www.gnu.org/licenses/>. */ |
| |
| +#ifndef _ISA_H |
| +#define _ISA_H |
| + |
| #define MINIMUM_ISA 686 |
| -#include <sysdeps/x86/init-arch.h> |
| + |
| +#endif |
| diff --git a/sysdeps/i386/init-arch.h b/sysdeps/i386/isa.h |
| similarity index 85% |
| rename from sysdeps/i386/init-arch.h |
| rename to sysdeps/i386/isa.h |
| index 043089ceb99db33f..e0a1e9c84fd37efb 100644 |
| |
| |
| @@ -1,4 +1,5 @@ |
| -/* Copyright (C) 2015-2018 Free Software Foundation, Inc. |
| +/* x86 ISA info. i486 version. |
| + Copyright (C) 2018 Free Software Foundation, Inc. |
| This file is part of the GNU C Library. |
| |
| The GNU C Library is free software; you can redistribute it and/or |
| @@ -15,5 +16,9 @@ |
| License along with the GNU C Library; if not, see |
| <http://www.gnu.org/licenses/>. */ |
| |
| +#ifndef _ISA_H |
| +#define _ISA_H |
| + |
| #define MINIMUM_ISA 486 |
| -#include <sysdeps/x86/init-arch.h> |
| + |
| +#endif |
| diff --git a/sysdeps/i386/i686/hp-timing.h b/sysdeps/x86/hp-timing.h |
| similarity index 69% |
| rename from sysdeps/i386/i686/hp-timing.h |
| rename to sysdeps/x86/hp-timing.h |
| index 59af526fdba0b6f5..1c20e9d8289cc15b 100644 |
| |
| |
| @@ -1,7 +1,6 @@ |
| -/* High precision, low overhead timing functions. i686 version. |
| - Copyright (C) 1998-2018 Free Software Foundation, Inc. |
| +/* High precision, low overhead timing functions. x86 version. |
| + Copyright (C) 2018 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 |
| @@ -20,12 +19,17 @@ |
| #ifndef _HP_TIMING_H |
| #define _HP_TIMING_H 1 |
| |
| +#include <isa.h> |
| + |
| +#if MINIMUM_ISA == 686 || MINIMUM_ISA == 8664 |
| +# include <x86intrin.h> |
| + |
| /* We always assume having the timestamp register. */ |
| -#define HP_TIMING_AVAIL (1) |
| -#define HP_SMALL_TIMING_AVAIL (1) |
| +# define HP_TIMING_AVAIL (1) |
| +# define HP_SMALL_TIMING_AVAIL (1) |
| |
| /* We indeed have inlined functions. */ |
| -#define HP_TIMING_INLINE (1) |
| +# define HP_TIMING_INLINE (1) |
| |
| /* We use 64bit values for the times. */ |
| typedef unsigned long long int hp_timing_t; |
| @@ -35,8 +39,14 @@ typedef unsigned long long int hp_timing_t; |
| running in this moment. This could be changed by using a barrier like |
| 'cpuid' right before the `rdtsc' instruciton. But we are not interested |
| 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) ((Var) = _rdtsc ()) |
| |
| -#include <hp-timing-common.h> |
| +# include <hp-timing-common.h> |
| +#else |
| +/* NB: Undefine _HP_TIMING_H so that <sysdeps/generic/hp-timing.h> will |
| + be included. */ |
| +# undef _HP_TIMING_H |
| +# include <sysdeps/generic/hp-timing.h> |
| +#endif |
| |
| -#endif /* hp-timing.h */ |
| +#endif /* hp-timing.h */ |
| diff --git a/sysdeps/x86/init-arch.h b/sysdeps/x86/init-arch.h |
| index a81ca8a4eb292e72..bc860fcd69a605b3 100644 |
| |
| |
| @@ -21,6 +21,7 @@ |
| # include <ldsodefs.h> |
| #endif |
| #include <ifunc-init.h> |
| +#include <isa.h> |
| |
| #ifndef __x86_64__ |
| /* Due to the reordering and the other nifty extensions in i686, it is |
| diff --git a/sysdeps/x86_64/hp-timing.h b/sysdeps/x86_64/hp-timing.h |
| deleted file mode 100644 |
| index ec543bef03b6c2d1..0000000000000000 |
| |
| |
| @@ -1,40 +0,0 @@ |
| -/* High precision, low overhead timing functions. x86-64 version. |
| - Copyright (C) 2002-2018 Free Software Foundation, Inc. |
| - This file is part of the GNU C Library. |
| - |
| - 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/>. */ |
| - |
| -#ifndef _HP_TIMING_H |
| -#define _HP_TIMING_H 1 |
| - |
| -/* We always assume having the timestamp register. */ |
| -#define HP_TIMING_AVAIL (1) |
| -#define HP_SMALL_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. */ |
| -#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 */ |
| diff --git a/sysdeps/x86_64/isa.h b/sysdeps/x86_64/isa.h |
| new file mode 100644 |
| index 0000000000000000..452bce75eb03a474 |
| |
| |
| @@ -0,0 +1,24 @@ |
| +/* x86 ISA info. x86-64 version. |
| + Copyright (C) 2018 Free Software Foundation, Inc. |
| + This file is part of the GNU C Library. |
| + |
| + 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/>. */ |
| + |
| +#ifndef _ISA_H |
| +#define _ISA_H |
| + |
| +#define MINIMUM_ISA 8664 |
| + |
| +#endif |