
moving the tick register to another register, but is fine with rd. * properly mask out the upper 32 bits of the register containing the lower 32 bits so that the or with the upper 32bits actually works properly. Hopefully, gcc will optimize this into code that doesn't suck so much (it's much easier to deal with when you get to control the argument registers...) This commit was SVN r7410.
66 строки
1.4 KiB
C
66 строки
1.4 KiB
C
/*
|
|
* Copyright (c) 2004-2005 The Trustees of Indiana University.
|
|
* All rights reserved.
|
|
* Copyright (c) 2004-2005 The Trustees of the University of Tennessee.
|
|
* All rights reserved.
|
|
* Copyright (c) 2004-2005 High Performance Computing Center Stuttgart,
|
|
* University of Stuttgart. All rights reserved.
|
|
* Copyright (c) 2004-2005 The Regents of the University of California.
|
|
* All rights reserved.
|
|
* $COPYRIGHT$
|
|
*
|
|
* Additional copyrights may follow
|
|
*
|
|
* $HEADER$
|
|
*/
|
|
|
|
#ifndef OMPI_SYS_ARCH_TIMER_H
|
|
#define OMPI_SYS_ARCH_TIMER_H 1
|
|
|
|
typedef uint64_t opal_timer_t;
|
|
|
|
#if OMPI_GCC_INLINE_ASSEMBLY
|
|
|
|
|
|
#if OMPI_ASSEMBLY_ARCH == OMPI_SPARCV9_64
|
|
|
|
static inline opal_timer_t
|
|
opal_sys_timer_get_cycles(void)
|
|
{
|
|
opal_timer_t ret;
|
|
|
|
__asm__ __volatile__("rd %%tick, %0" : "=r"(ret));
|
|
|
|
return ret;
|
|
}
|
|
|
|
#else /* OMPI_SPARCV9_32 */
|
|
|
|
static inline opal_timer_t
|
|
opal_sys_timer_get_cycles(void)
|
|
{
|
|
opal_timer_t ret;
|
|
int a, b;
|
|
|
|
__asm__ __volatile__("rd %%tick, %0 \n"
|
|
"srlx %0, 32, %1 " :
|
|
"=r"(a), "=r"(b)
|
|
);
|
|
|
|
ret = (0x00000000FFFFFFFF & a) | (((opal_timer_t) b) << 32);
|
|
|
|
return ret;
|
|
}
|
|
|
|
#endif
|
|
|
|
#define OPAL_HAVE_SYS_TIMER_GET_CYCLES 1
|
|
|
|
#else
|
|
|
|
#define OPAL_HAVE_SYS_TIMER_GET_CYCLES 0
|
|
|
|
#endif /* OMPI_GCC_INLINE_ASSEMBLY */
|
|
|
|
#endif /* ! OMPI_SYS_ARCH_TIMER_H */
|