Messages in this thread Patch in this message | | | Date | Mon, 6 Jul 2015 08:45:48 -0700 | From | tip-bot for George Spelvin <> | Subject | [tip:x86/asm] x86/asm/tsc: Save an instruction in DECLARE_ARGS users |
| |
Commit-ID: 5a33fcb8d991209bac0a266ab499e4b53d116cdd Gitweb: http://git.kernel.org/tip/5a33fcb8d991209bac0a266ab499e4b53d116cdd Author: George Spelvin <linux@horizon.com> AuthorDate: Thu, 25 Jun 2015 18:44:13 +0200 Committer: Ingo Molnar <mingo@kernel.org> CommitDate: Mon, 6 Jul 2015 15:23:30 +0200
x86/asm/tsc: Save an instruction in DECLARE_ARGS users
Before, the code to do RDTSC looked like:
rdtsc shl $0x20, %rdx mov %eax, %eax or %rdx, %rax
The "mov %eax, %eax" is required to clear the high 32 bits of RAX.
By declaring low and high as 64-bit variables, the code is simplified to:
rdtsc shl $0x20,%rdx or %rdx,%rax
Yes, it's a 2-byte instruction that's not on a critical path, but there are principles to be upheld.
Every user of EAX_EDX_RET has been checked. I tried to check users of EAX_EDX_ARGS, but there weren't any, so I deleted it to be safe.
( There's no benefit to making "high" 64 bits, but it was the simplest way to proceed. )
Signed-off-by: George Spelvin <linux@horizon.com> Signed-off-by: Borislav Petkov <bp@suse.de> Cc: Andy Lutomirski <luto@amacapital.net> Cc: Borislav Petkov <bp@alien8.de> Cc: Brian Gerst <brgerst@gmail.com> Cc: Denys Vlasenko <dvlasenk@redhat.com> Cc: H. Peter Anvin <hpa@zytor.com> Cc: Linus Torvalds <torvalds@linux-foundation.org> Cc: Peter Zijlstra <peterz@infradead.org> Cc: Thomas Gleixner <tglx@linutronix.de> Cc: jacob.jun.pan@linux.intel.com Link: http://lkml.kernel.org/r/20150618075906.4615.qmail@ns.horizon.com Signed-off-by: Ingo Molnar <mingo@kernel.org> --- arch/x86/include/asm/msr.h | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-)
diff --git a/arch/x86/include/asm/msr.h b/arch/x86/include/asm/msr.h index 02bdd6c..131eec2 100644 --- a/arch/x86/include/asm/msr.h +++ b/arch/x86/include/asm/msr.h @@ -47,14 +47,13 @@ static inline unsigned long long native_read_tscp(unsigned int *aux) * it means rax *or* rdx. */ #ifdef CONFIG_X86_64 -#define DECLARE_ARGS(val, low, high) unsigned low, high -#define EAX_EDX_VAL(val, low, high) ((low) | ((u64)(high) << 32)) -#define EAX_EDX_ARGS(val, low, high) "a" (low), "d" (high) +/* Using 64-bit values saves one instruction clearing the high half of low */ +#define DECLARE_ARGS(val, low, high) unsigned long low, high +#define EAX_EDX_VAL(val, low, high) ((low) | (high) << 32) #define EAX_EDX_RET(val, low, high) "=a" (low), "=d" (high) #else #define DECLARE_ARGS(val, low, high) unsigned long long val #define EAX_EDX_VAL(val, low, high) (val) -#define EAX_EDX_ARGS(val, low, high) "A" (val) #define EAX_EDX_RET(val, low, high) "=A" (val) #endif
| |