[PATCH] PowerPC - Add a faster way to read the Time Base register

Ryan S. Arnold ryan.arnold@gmail.com
Tue Feb 14 22:34:00 GMT 2012


On Tue, Feb 14, 2012 at 2:03 PM, Richard Henderson <rth@twiddle.net> wrote:
> On 02/14/2012 07:30 AM, Tulio Magno Quites Machado Filho wrote:
>> Add macro __PPC_GETTIMEBASE() to directly read the Time Base register.
>> This is required for applications that measure time at high frequencies
>> with high precision that can't afford a syscall.
>>
>> My FSF copyright assignment is on file.
>>
>> 2012-02-06  Tulio Magno Quites Machado Filho  <tuliom@linux.vnet.ibm.com>
>>
>>       * sysdeps/unix/sysv/linux/powerpc/sys/user.h: New macro definition.
>>       * sysdeps/unix/sysv/linux/powerpc/Makefile (tests): Add
>>       test-gettimebase.
>>       * sysdeps/unix/sysv/linux/powerpc/test-gettimebase.c: Test for
>>       __PPC_GETTIMEBASE() to catch future ISA opcode/insn changes.
>> ---
>>  sysdeps/unix/sysv/linux/powerpc/Makefile           |    2 +
>>  sysdeps/unix/sysv/linux/powerpc/sys/user.h         |   40 +++++++++++++++++++-
>>  sysdeps/unix/sysv/linux/powerpc/test-gettimebase.c |   35 +++++++++++++++++
>>  3 files changed, 76 insertions(+), 1 deletions(-)
>>  create mode 100644 sysdeps/unix/sysv/linux/powerpc/test-gettimebase.c
>>
>> diff --git a/sysdeps/unix/sysv/linux/powerpc/Makefile b/sysdeps/unix/sysv/linux/powerpc/Makefile
>> index 55311a4..a2ab09a 100644
>> --- a/sysdeps/unix/sysv/linux/powerpc/Makefile
>> +++ b/sysdeps/unix/sysv/linux/powerpc/Makefile
>> @@ -15,3 +15,5 @@ endif
>>  ifeq ($(subdir),elf)
>>  sysdep_routines += dl-vdso
>>  endif
>> +
>> +tests += test-gettimebase
>> diff --git a/sysdeps/unix/sysv/linux/powerpc/sys/user.h b/sysdeps/unix/sysv/linux/powerpc/sys/user.h
>> index 5fa3745..301e64a 100644
>> --- a/sysdeps/unix/sysv/linux/powerpc/sys/user.h
>> +++ b/sysdeps/unix/sysv/linux/powerpc/sys/user.h
>> @@ -1,4 +1,4 @@
>> -/* Copyright (C) 1998 Free Software Foundation, Inc.
>> +/* Copyright (C) 1998, 2012 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
>> @@ -36,4 +36,42 @@ struct user {
>>       char            u_comm[32];             /* user command name */
>>  };
>>
>> +typedef unsigned long long int __ppc_timebase;
>> +
>> +#define __STRINGIFY(...) #__VA_ARGS__
>> +#define STRINGIFY(...) __STRINGIFY(__VA_ARGS__)
>> +
>> +#define SPRN_TBRL 268 /* Time Base Read Lower Register */
>> +
>> +#ifdef __powerpc64__
>> +# define __PPC_GETTIMEBASE()                                 \
>> +  ({                                                         \
>> +    __ppc_timebase __tb;                                     \
>> +    __asm__ volatile (                                               \
>> +                   "mfspr %[tb], " STRINGIFY(SPRN_TBRL) "\n" \
>
> Is there a good reason why you're stringify-ing this constant
> rather than just writing "mfspr %0, 268"?  You certainly don't
> want to be polluting the namespace with an unadorned "STRINGIFY".

We didn't want a naked (non-descriptive) opcode parameter.  There must
be a way to do this that takes the definition as a variable, like
perhaps the following (totally untested) code:

    __asm__ volatile (                                         \
                     "mfspr %[tb], %2\n" \
                     : [tb]"=r" (__tb)                         \
                     : "i" (SPRN_TBRL)  );


> Is there a good reason this is a macro rather than an inline?

I don't see why this couldn't be a static inline.

Ryan S. Arnold



More information about the Libc-alpha mailing list